Herramientas Informaticas

Categoría: Uncategorized Página 1 de 13

Cómo resolver “Error while downloading the document file to be converted” en OnlyOffice + Nextcloud tras actualizar el certificado

Entrada fija

Si acabas de renovar o cambiar el certificado SSL de tu servidor Nextcloud y ahora OnlyOffice Document Server (corriendo en Docker) dejó de funcionar mostrando el mensaje:

Error when trying to connect (Error occurred in the document service: Error while downloading the document file to be converted.)

este artículo documenta el diagnóstico completo y la solución que aplicamos en nuestro entorno (Docker, versión de Document Server 9.3.1.10).

El síntoma

Al intentar guardar la configuración de conexión entre la app de OnlyOffice en Nextcloud y el Document Server, Nextcloud devuelve el error de conversión de documento, sin más detalle en la interfaz.

Paso 1: Revisar los logs del contenedor de OnlyOffice

El primer paso —y el más importante— es ir directo al log del contenedor Docker, ya que la interfaz web no muestra el detalle técnico real:

sudo docker logs <container_id> --tail 100 | grep -i "downloadFile\|error\|CERT"

En nuestro caso, el log mostró claramente la causa:

error downloadFile:url=https://tu-dominio:444/index.php/apps/onlyoffice/empty?doc=...
code:DEPTH_ZERO_SELF_SIGNED_CERT;connect:undefined
Error: self-signed certificate

El diagnóstico

El código DEPTH_ZERO_SELF_SIGNED_CERT confirma que el problema es de confianza SSL, no de red, permisos ni JWT. El contenedor de OnlyOffice, al intentar descargar el archivo desde Nextcloud por HTTPS para convertirlo, rechaza el certificado porque es autofirmado (o le falta la cadena intermedia) y no forma parte de su almacén de certificados de confianza (CA store) interno.

Esto es un efecto colateral típico después de renovar o cambiar un certificado: aunque el navegador lo acepte (o lo tengas configurado para ignorarlo), el motor Node.js que corre dentro del contenedor de OnlyOffice valida los certificados de forma independiente y estricta.

La solución

Existen dos rutas posibles:

Opción A — Confiar en el certificado (recomendada si seguirá siendo autofirmado)

  1. Extraer el certificado servido en el puerto correspondiente:
echo | openssl s_client -connect tu-dominio:444 -servername tu-dominio 2>/dev/null | openssl x509 -outform PEM > cert.crt
  1. Copiarlo al contenedor y actualizar el almacén de confianza:
sudo docker cp cert.crt <container_id>:/usr/local/share/ca-certificates/cert.crt
sudo docker exec <container_id> update-ca-certificates
sudo docker restart <container_id>

Opción B — Deshabilitar la verificación estricta (solución que aplicamos)

Se edita el archivo de configuración del Document Server dentro del contenedor:

sudo docker exec -it <container_id> bash
nano /etc/onlyoffice/documentserver/local.json

Y se agrega la siguiente sección dentro de services.CoAuthoring:

"services": {
  "CoAuthoring": {
    "requestDefaults": {
      "rejectUnauthorized": false
    },
    ...
  }
}

Después de guardar el archivo, es indispensable reiniciar el contenedor para que los servicios internos (docservice, converter, nginx) carguen la nueva configuración:

sudo docker restart <container_id>

Tras el reinicio, la conexión entre Nextcloud y OnlyOffice vuelve a funcionar con normalidad.

Nota importante sobre seguridad

rejectUnauthorized: false desactiva la validación de certificados SSL para todas las peticiones salientes del Document Server, no solo hacia tu instancia de Nextcloud. Es una solución práctica y válida si el certificado en cuestión seguirá siendo autofirmado por diseño (por ejemplo, en una red interna), pero si en el futuro migras a un certificado válido emitido por una autoridad reconocida (como Let’s Encrypt), lo recomendable es revertir este valor a true para restaurar la verificación estricta y protegerte de posibles ataques de intermediario (man-in-the-middle) en esa conexión.

Resumen rápido

PasoAcción
1Revisar logs del contenedor con docker logs filtrando por downloadFile y CERT
2Confirmar el código de error (DEPTH_ZERO_SELF_SIGNED_CERT = problema de certificado)
3Editar local.json agregando rejectUnauthorized: false en requestDefaults
4Reiniciar el contenedor con docker restart
5Migrar a un certificado válido a futuro y revertir el ajuste (opcional, recomendado)

Documentado a partir de un caso real de integración Nextcloud + OnlyOffice Document Server 9.3.1.10 en Docker.

🔐 Solución definitiva: Error en ONLYOFFICE Docs al renovar certificado SSL en Nextcloud (certificado autofirmado)

Entrada fija

¿Tu integración de ONLYOFFICE con Nextcloud dejó de funcionar después de renovar el certificado SSL? Aparece el error: “Error when trying to connect (Error occurred in the document service: Error while downloading the document file to be converted.)” No te preocupes, aquí tienes la guía paso a paso para resolverlo de forma definitiva, tanto si usas certificado autofirmado como si quieres migrar a Let’s Encrypt.


📌 Índice

  1. Diagnóstico del problema
  2. Renovar el certificado en Nextcloud (Snap)
  3. Configurar Apache para el puerto 4445 (si aplica)
  4. Solución de confianza SSL en el contenedor ONLYOFFICE
  5. Configurar la integración en Nextcloud
  6. Automatizar renovaciones futuras
  7. Conclusión y recomendaciones finales

1. 🔍 Diagnóstico del problema

El error se debe a que el contenedor de ONLYOFFICE Document Server no confía en el nuevo certificado que presenta Nextcloud al intentar descargar el archivo a convertir. En los logs del contenedor aparece:

error downloadFile:url=https://gusadrive.dyndns.org:444/... code:DEPTH_ZERO_SELF_SIGNED_CERT

Para confirmar el diagnóstico, revisa los logs de tu contenedor:

sudo docker ps   # Identifica el nombre del contenedor (ej. reverent_torvalds)
sudo docker logs  --tail 100 | grep -i "downloadFile\|error\|CERT"

2. 🔄 Renovar el certificado en Nextcloud (Snap)

Si aún no has renovado tu certificado autofirmado, sigue estos pasos. Si ya lo hiciste, pasa al paso 3.

a) Generar un nuevo certificado autofirmado para el dominio:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /var/snap/nextcloud/current/certs/custom/key.pem \
    -out /var/snap/nextcloud/current/certs/custom/cert.pem \
    -subj "/CN=gusadrive.dyndns.org"

b) Crear el archivo chain.pem (necesario para Nextcloud Snap):

sudo cp /var/snap/nextcloud/current/certs/custom/cert.pem /var/snap/nextcloud/current/certs/custom/chain.pem

c) Instalar el certificado en Nextcloud Snap:

sudo nextcloud.enable-https custom \
    /var/snap/nextcloud/current/certs/custom/cert.pem \
    /var/snap/nextcloud/current/certs/custom/key.pem \
    /var/snap/nextcloud/current/certs/custom/chain.pem

d) Reiniciar Nextcloud:

sudo snap restart nextcloud

3. 🌐 Configurar Apache para el puerto 4445 (si aplica)

Si tienes un VirtualHost de Apache que expone el panel de ONLYOFFICE en el puerto 4445, actualiza la configuración.

a) Localiza el VirtualHost:

sudo grep -r "4445" /etc/apache2/sites-enabled/

b) Edita el archivo (ej. /etc/apache2/sites-available/onlyoffice.conf) y apunta a los nuevos certificados:

<VirtualHost *:4445>
    ServerName gusadrive.dyndns.org
    SSLEngine on
    SSLCertificateFile "/etc/apache2/ssl/onlyoffice.crt"
    SSLCertificateKeyFile "/etc/apache2/ssl/onlyoffice.key"
    ...
</VirtualHost>

c) Copia los certificados a la ruta especificada:

sudo mkdir -p /etc/apache2/ssl
sudo cp /var/snap/nextcloud/current/certs/custom/cert.pem /etc/apache2/ssl/onlyoffice.crt
sudo cp /var/snap/nextcloud/current/certs/custom/key.pem /etc/apache2/ssl/onlyoffice.key

d) Habilita el sitio y reinicia Apache:

sudo a2ensite onlyoffice.conf
sudo systemctl restart apache2

4. 🐳 Solución de confianza SSL en el contenedor ONLYOFFICE

Tienes dos opciones para que el contenedor confíe en el certificado autofirmado de Nextcloud.

✅ Opción A (Recomendada para producción): Agregar el certificado al almacén de CA del contenedor

1. Copia el certificado al contenedor:

sudo docker cp /var/snap/nextcloud/current/certs/custom/cert.pem <nombre_contenedor>:/usr/local/share/ca-certificates/nextcloud.crt

2. Actualiza el almacén de CA dentro del contenedor:

sudo docker exec <nombre_contenedor> update-ca-certificates

3. Reinicia el contenedor:

sudo docker restart <nombre_contenedor>

4. Verifica que el certificado se haya agregado:

sudo docker exec <nombre_contenedor> ls -la /usr/local/share/ca-certificates/

⚠️ Opción B (Solución temporal / pruebas): Deshabilitar la verificación SSL en ONLYOFFICE

Esta opción es más rápida pero reduce la seguridad (el contenedor no validará certificados en ninguna conexión saliente).

1. Entra al contenedor:

sudo docker exec -it <nombre_contenedor> bash

2. Edita el archivo /etc/onlyoffice/documentserver/local.json y agrega la siguiente sección (si no existe):

{
  "services": {
    "CoAuthoring": {
      "requestDefaults": {
        "rejectUnauthorized": false
      }
    }
  }
}

3. Guarda, sal del contenedor y reinícialo:

sudo docker restart <nombre_contenedor>

5. ⚙️ Configurar la integración en Nextcloud

Ve a Configuración → ONLYOFFICE → Servidor de documentos en Nextcloud y asegura estos valores:

  • URL del servidor de documentos: http://localhost:8085/ (con barra final).
  • Clave secreta (JWT): Debe coincidir con la generada en ONLYOFFICE. Obténla con: sudo docker exec <nombre_contenedor> sudo documentserver-jwt-status.sh
  • Configuración avanzada (JSON):
    • Si usaste la Opción A, no necesitas nada extra.
    • Si usaste la Opción B, agrega: { "rejectUnauthorized": false }

Guarda los cambios.


6. 🔁 Automatizar renovaciones futuras (para certificado autofirmado)

Crea un script que se ejecute mensualmente para regenerar el certificado e instalarlo tanto en Nextcloud como en el contenedor.

Script de ejemplo (/root/renew_selfsigned.sh):

#!/bin/bash
# Regenerar certificado autofirmado
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /var/snap/nextcloud/current/certs/custom/key.pem \
    -out /var/snap/nextcloud/current/certs/custom/cert.pem \
    -subj "/CN=gusadrive.dyndns.org"

cp /var/snap/nextcloud/current/certs/custom/cert.pem /var/snap/nextcloud/current/certs/custom/chain.pem

# Instalar en Nextcloud
nextcloud.enable-https custom \
    /var/snap/nextcloud/current/certs/custom/cert.pem \
    /var/snap/nextcloud/current/certs/custom/key.pem \
    /var/snap/nextcloud/current/certs/custom/chain.pem

snap restart nextcloud

# Copiar al contenedor de ONLYOFFICE
docker cp /var/snap/nextcloud/current/certs/custom/cert.pem <nombre_contenedor>:/usr/local/share/ca-certificates/nextcloud.crt
docker exec <nombre_contenedor> update-ca-certificates
docker restart <nombre_contenedor>

Programa en cron (diario a las 3 AM, primer día de mes):

sudo crontab -e
# Añadir la línea:
0 3 1 * * /root/renew_selfsigned.sh >> /var/log/renew_cert.log 2>&1

7. 🎯 Conclusión y recomendaciones finales

  • El error “Error while downloading the document file” después de renovar un certificado autofirmado en Nextcloud se debe a que el contenedor de ONLYOFFICE no confía en ese certificado.
  • Opción A (recomendada): Agregar el certificado al almacén de CA del contenedor y actualizar las CA. Es segura y permite mantener la verificación SSL activa.
  • Opción B (temporal): Deshabilitar la verificación SSL en ONLYOFFICE editando local.json. Más rápida pero menos segura.
  • Recomendación a largo plazo: Utilizar un certificado de Let’s Encrypt con validación DNS para evitar este problema de raíz y simplificar las renovaciones.

Notas adicionales:

  • La comunicación entre Nextcloud y ONLYOFFICE puede hacerse por HTTP interno (http://localhost:8085) para evitar SSL por completo (válido si ambos servicios corren en el mismo servidor).
  • Asegura que el token JWT coincida exactamente entre ambos lados; un token incorrecto dará error 403.
  • Los logs del contenedor son la mejor herramienta para depurar: sudo docker logs <nombre> --tail 50 -f.

¿Te ha sido útil esta guía? Déjanos un comentario si tienes dudas o comparte tu experiencia. Si necesitas ayuda adicional, no dudes en contactarnos.

📦 Cómo Instalar Nextcloud en Linux Mint con Snap (Guía Paso a Paso)

Entrada fija

¿Quieres tener tu propia nube privada en casa o en tu servidor local? Nextcloud es la solución perfecta para almacenar, sincronizar y compartir archivos sin depender de servicios externos como Google Drive o Dropbox.

En esta guía te enseñaré cómo instalar Nextcloud en Linux Mint utilizando Snap, el sistema de paquetes universales que hace que la instalación sea increíblemente sencilla.


📋 Requisitos Previos

  • Linux Mint instalado (cualquier versión reciente)
  • Conexión a internet
  • Acceso de administrador (sudo)
  • Una terminal abierta (Ctrl + Alt + T)

⚠️ Importante: Linux Mint y Snap

Por defecto, Linux Mint bloquea Snap por motivos de política. Así que primero debemos habilitarlo con unos sencillos pasos.


🚀 Pasos de Instalación

1️⃣ Eliminar el bloqueo de Snap

sudo rm /etc/apt/preferences.d/nosnap.pref

2️⃣ Actualizar los repositorios

sudo apt update

3️⃣ Instalar Snap

sudo apt install snapd

4️⃣ Instalar Nextcloud

sudo snap install nextcloud

¡Listo! La instalación tardará unos minutos. Nextcloud incluye automáticamente:

  • ✅ Servidor Apache
  • ✅ PHP 8.1
  • ✅ MySQL 8
  • ✅ Redis para caché

🌐 Acceder a Nextcloud

Una vez instalado, abre tu navegador y visita:

  • Localmente: http://localhost
  • Desde otros dispositivos en tu red: http://tu-ip-local

Para conocer tu IP local:

hostname -I

🔧 Si cambiaste de IP (por DHCP)

Es posible que necesites agregar tu IP como dominio confiable:

sudo nextcloud.occ config:system:set trusted_domains 1 --value=$(hostname -I | awk '{print $1}')

🔑 Crear Cuenta de Administrador

En tu primera visita a Nextcloud, se te pedirá que crees:

  • 👤 Nombre de usuario
  • 🔒 Contraseña de administrador

¡Guarda estos datos en un lugar seguro!


🛠️ Comandos Útiles para la Gestión

ComandoFunción
sudo snap start nextcloudIniciar Nextcloud
sudo snap stop nextcloudDetener Nextcloud
sudo snap restart nextcloudReiniciar Nextcloud
sudo snap services nextcloudVer estado del servicio
sudo snap logs nextcloudVer logs de errores
sudo snap set nextcloud ports.http=8080Cambiar puerto HTTP
sudo nextcloud.enable-httpsHabilitar HTTPS con Let’s Encrypt
sudo nextcloud.occ statusVer estado de Nextcloud

🔐 Restablecer Contraseña de Administrador

Si olvidaste la contraseña de admin:

sudo nextcloud.occ user:resetpassword admin

🖥️ Acceso a Almacenamiento Externo

Si necesitas usar discos externos montados en /media o /mnt:

sudo snap connect nextcloud:removable-media

🎯 Ventajas de Usar Snap para Nextcloud

  • ✅ Instalación sencilla en un solo comando
  • ✅ Actualizaciones automáticas sin complicaciones
  • ✅ Todo incluido (servidor web, base de datos, caché)
  • ✅ Fácil de gestionar con comandos Snap

❓ Solución de Problemas Comunes

No puedo acceder a Nextcloud

  1. Verifica que el servicio esté activo: sudo snap services nextcloud
  2. Comprueba los puertos disponibles: sudo ss -tulpn | grep snap.nextcloud
  3. Revisa los logs en busca de errores: sudo snap logs nextcloud | tail -20

El puerto 80 ya está en uso

Cambia el puerto HTTP:

sudo snap set nextcloud ports.http=8080

La IP cambia constantemente

Agrega el nuevo IP como dominio confiable (como se explicó arriba).


🎉 ¡Listo!

Ahora tienes tu propio servidor de nube privada funcionando en Linux Mint. Puedes:

  • 📁 Almacenar archivos
  • 📱 Sincronizar con el móvil (aplicación Nextcloud)
  • 👥 Compartir carpetas con otros usuarios
  • 🔄 Sincronizar calendarios y contactos

📚 Recursos Adicionales


¿Te ha sido útil esta guía? Déjame tu comentario y compártela con otros usuarios de Linux. ¡La privacidad y el control de tus datos es cosa de todos! 💪


🔖 Etiquetas

#Nextcloud #LinuxMint #Snap #NubePrivada #SelfHosting #Linux #Tecnología #Almacenamiento #SeguridadDigital

🚀 Guía Completa para Administrar y Validar Conexiones SQL Server desde PHP, CodeIgniter y Linux

Entrada fija



Guía Completa para Administrar y Validar Conexiones SQL Server desde PHP, CodeIgniter y Linux

Las bases de datos son el corazón de los sistemas empresariales modernos. SQL Server es una de las plataformas más utilizadas para almacenar información crítica y su integración con PHP y CodeIgniter permite construir soluciones robustas y escalables.

💻 ¿Por qué es importante administrar conexiones?

Cuando una organización utiliza múltiples servidores SQL Server, mantener un catálogo centralizado de conexiones facilita la administración, mejora la seguridad y reduce errores de configuración.

📋 Información almacenada

  • 🏢 Empresa
  • 🌐 Host o servidor
  • 👤 Usuario
  • 🔑 Contraseña
  • 🗄️ Base de datos
  • 🔌 Puerto

✅ Validación automática

Una de las características más útiles es la capacidad de validar en tiempo real si una conexión es válida antes de utilizarla. Esto permite detectar errores de red, credenciales incorrectas o bases de datos inexistentes.

🔍 Beneficios

  • Ahorro de tiempo
  • Menos errores humanos
  • Mayor productividad
  • Seguridad mejorada
  • Escalabilidad

🐧 Compatibilidad

La solución funciona con Linux y Windows, integrándose con PHP y CodeIgniter 4 para proyectos empresariales modernos.

📦 Repositorio del proyecto

https://github.com/julio101290/boilerplatecompac

🎯 Conclusión

Administrar y validar conexiones SQL Server desde una interfaz centralizada simplifica enormemente el mantenimiento de sistemas empresariales y mejora la confiabilidad de las aplicaciones.

🚀 Cómo Instalar SQL Server (SQLSRV) en Linux Mint 22.1 para PHP 8.3 y CodeIgniter 4

Entrada fija

Si estás desarrollando aplicaciones con PHP y CodeIgniter 4 en Linux Mint y necesitas conectarte a Microsoft SQL Server, es posible que te encuentres con errores como:

  • ❌ Unable to connect to the database
  • ❌ Undefined constant “CodeIgniter\Database\SQLSRV\SQLSRV_ENC_CHAR”

La buena noticia es que la solución es sencilla una vez que se instalan correctamente los controladores de Microsoft y las extensiones de PHP. En esta guía te explicamos paso a paso cómo hacerlo. 👨‍💻

📋 Requisitos Previos

  • ✅ Linux Mint 22.1 (Xia)
  • ✅ PHP 8.3 instalado
  • ✅ Acceso a terminal con permisos de administrador
  • ✅ Conexión a Internet

🔍 Verificar la Versión de PHP

Primero, verifica la versión de PHP instalada:

php -v

📦 Instalar Dependencias Necesarias

Instala las herramientas necesarias para compilar las extensiones:

sudo apt update sudo apt install -y php8.3-dev php-pear build-essential unixodbc-dev

🛠️ Agregar el Repositorio de Microsoft

Importa la clave de Microsoft:

curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | \ sudo gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg

Agrega el repositorio:

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/microsoft-prod.gpg] https://packages.microsoft.com/ubuntu/24.04/prod noble main" | sudo tee /etc/apt/sources.list.d/mssql-release.list

Actualiza los repositorios:

sudo apt update

💾 Instalar el Driver ODBC de SQL Server

Instala el controlador oficial de Microsoft:

sudo ACCEPT_EULA=Y apt install -y msodbcsql18

Verifica que el paquete esté disponible:

apt search msodbcsql

⚙️ Instalar las Extensiones SQLSRV y PDO_SQLSRV

Instala las extensiones PHP utilizando PECL:

sudo pecl install sqlsrv sudo pecl install pdo_sqlsrv

🔧 Activar las Extensiones

Crea los archivos de configuración:

echo "extension=sqlsrv.so" | sudo tee /etc/php/8.3/mods-available/sqlsrv.ini echo "extension=pdo_sqlsrv.so" | sudo tee /etc/php/8.3/mods-available/pdo_sqlsrv.ini

Activa las extensiones:

sudo phpenmod sqlsrv sudo phpenmod pdo_sqlsrv

🔄 Reiniciar Apache

Si utilizas Apache, reinícialo:

sudo systemctl restart apache2

✅ Verificar la Instalación

Comprueba que PHP cargó correctamente las extensiones:

php -m | grep sqlsrv

La salida correcta será:

pdo_sqlsrv sqlsrv

También puedes verificar la constante utilizada por CodeIgniter:

php -r "var_dump(defined('SQLSRV_ENC_CHAR'));"

Resultado esperado:

bool(true)

🎯 Configuración en CodeIgniter 4

Una vez instaladas las extensiones, puedes configurar la conexión de esta forma:

$config = [ 'DBDriver' => 'SQLSRV', 'hostname' => 'servidor', 'database' => 'base_de_datos', 'username' => 'usuario', 'password' => 'contraseña', 'port' => 1433, ];

🚨 Errores Comunes

❌ Undefined constant SQLSRV_ENC_CHAR

Este error ocurre cuando la extensión sqlsrv no está instalada o no se encuentra cargada en PHP.

❌ Unable to load dynamic library ‘sqlsrv.so’

Indica que PHP intenta cargar el módulo, pero el archivo sqlsrv.so no existe o no fue instalado correctamente.

❌ Error SSL Provider o Certificate

Con ODBC Driver 18 algunos servidores requieren configuración adicional de certificados o habilitar la confianza del certificado del servidor.

🎉 Conclusión

Instalar SQL Server en Linux Mint para PHP y CodeIgniter puede parecer complicado al principio, pero siguiendo estos pasos podrás conectar tu aplicación sin problemas.

Una vez instaladas las extensiones sqlsrv y pdo_sqlsrv, CodeIgniter podrá comunicarse con Microsoft SQL Server de forma nativa y eficiente.

💡 Si trabajas con aplicaciones empresariales, ERPs o sistemas administrativos, esta configuración te permitirá integrar fácilmente bases de datos SQL Server desde entornos Linux.

🚀 ¡Ahora ya estás listo para desarrollar con PHP, CodeIgniter y SQL Server en Linux Mint!

Tutorial: Instalación del High‑Performance Backend para Nextcloud Talk

Entrada fija

¡Excelente! A continuación encontrarás un tutorial completo desde cero para instalar y configurar el High‑Performance Backend (HPB) de Nextcloud Talk en un servidor Ubuntu, basado en la solución que aplicamos paso a paso.

Requisitos previos

  • Un servidor con Ubuntu 22.04 o 24.04 (mínimo 2 GB RAM, 2 vCPU).
  • Nextcloud ya instalado y funcionando (puede estar en el mismo servidor o en otro).
  • La aplicación Talk habilitada en Nextcloud.
  • Un nombre de dominio (por ejemplo, tudominio.com) apuntando al servidor.
    Necesitarás dos subdominios (o uno con puertos distintos):
    • nextcloud.tudominio.com → donde está Nextcloud (si no usas el mismo servidor, omítelo).
    • signal.tudominio.com → para el backend de alto rendimiento.
  • Puertos abiertos en el firewall del servidor:
    • 80/tcp y 443/tcp (web + WebSocket).
    • 3478/udp y 3478/tcp (STUN/TURN sin TLS).
    • 5349/udp y 5349/tcp (STUN/TURN con TLS).
  • Una cuenta de correo para recibir avisos de Certbot (Let’s Encrypt).

Nota: Este tutorial asume que Nextcloud está en el mismo servidor. Si está en otro, ajusta las IPs y dominios.

1. Instalación del script HPB

El script oficial de sunweaver automatiza la instalación de coturn, janus, nats y el servidor de señalización.

# Actualizar sistema e instalar dependencias básicas
sudo apt update && sudo apt upgrade -y
sudo apt install -y wget git curl

# Descargar la última versión del script (ejemplo con la 1.3.5)
cd ~
wget https://github.com/sunweaver/nextcloud-high-performance-backend-setup/archive/refs/tags/1.3.5.tar.gz
tar xzf 1.3.5.tar.gz
cd nextcloud-high-performance-backend-setup-1.3.5

# Ejecutar el instalador (responde a las preguntas)
sudo ./install.sh

Durante la instalación te pedirá:

  • Nextcloud base URL: https://nextcloud.tudominio.com (o la IP/puerto de tu Nextcloud). Si Nextcloud usa un puerto no estándar (ej. :444), indícalo.
  • Signaling domain: signal.tudominio.com (el subdominio para el HPB).
  • Correo para certificados SSL: tu email.
  • Secreto TURN: se generará automáticamente (guárdalo).
  • Secreto del backend: también se generará (guárdalo).

Al final verás un resumen similar a este (los valores cambiarán):

STUN server = signal.tudominio.com:5349
TURN server:
 - turn and turns
 - turnserver+port: signal.tudominio.com:5349
 - secret: a33e1511842947b2f2c514fba9e01dced4ed6d274bd8424d8c6bc8bcb00f60bb
 - udp & tcp
High-performance backend:
 - https://signal.tudominio.com/standalone-signaling
 - signal.tudominio.com -> 437929b3e7012e0d4a9e7a4564945d3a

Guarda estos datos, los necesitarás en Nextcloud.

2. Solución de problemas post‑instalación

El script a veces deja servicios sin arrancar o con configuraciones incorrectas. Aplica los siguientes arreglos si ves errores (como coturn o janus caídos, WebSocket fallando, invalid_backend, etc.).

2.1 Arreglar coturn (servidor TURN)

Edita /etc/turnserver.conf:

sudo nano /etc/turnserver.conf

Asegura estas líneas:

listening-ip=0.0.0.0
listening-port=3478
tls-listening-port=5349

# Comenta o elimina cualquier línea que ponga external-ip o relay-ip
# (a menos que estés detrás de NAT, en cuyo caso consulta la nota al final)
# external-ip=
# relay-ip=

Si tu servidor tiene IP pública directa, no necesitas external-ip. Si está detrás de NAT (IP privada), añade:

relay-ip=192.168.x.x   # IP privada del servidor
# external-ip = (no poner, el router hará NAT)

Reinicia coturn:

sudo systemctl restart coturn
sudo systemctl enable coturn

2.2 Arreglar el servidor de señalización (nextcloud‑spreed‑signaling)

Edita /etc/nextcloud-spreed-signaling/server.conf:

sudo nano /etc/nextcloud-spreed-signaling/server.conf

Corrige la sección [backend] (debe coincidir con la URL de tu Nextcloud, incluyendo puerto si es necesario):

[backend]

allowed = https://nextcloud.tudominio.com:444 # o sin puerto si es 443 secret = 437929b3e7012e0d4a9e7a4564945d3a # el secreto que te dio el script

Añade o corrige la sección [turn] (asegúrate de usar el puerto 5349, no 9991):

[turn]

secret = a33e1511842947b2f2c514fba9e01dced4ed6d274bd8424d8c6bc8bcb00f60bb # el secreto TURN servers = turn:signal.tudominio.com:5349?transport=udp, turn:signal.tudominio.com:5349?transport=tcp

Si existe una sección [nextcloud-backend-0], asegura que tenga:

[nextcloud-backend-0]

url = https://nextcloud.tudominio.com:444 secret = 437929b3e7012e0d4a9e7a4564945d3a

Reinicia el servicio:

sudo systemctl restart nextcloud-spreed-signaling

2.3 Configurar el proxy inverso (Nginx)

El script ya debería haber creado un archivo para signal.tudominio.com. Verifica que incluya las cabeceras WebSocket:

sudo nginx -T | grep -A20 "server_name signal.tudominio.com"

Debe aparecer algo como:

location /standalone-signaling/ {
    proxy_pass http://127.0.0.1:8080/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    # ... otras cabeceras
}

Si falta, edita el archivo correspondiente (por ejemplo, /etc/nginx/sites-available/signal.tudominio.com) y añade esas líneas. Luego recarga Nginx:

sudo nginx -t && sudo systemctl reload nginx

2.4 Firewall

Abre los puertos necesarios:

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 3478/udp
sudo ufw allow 3478/tcp
sudo ufw allow 5349/udp
sudo ufw allow 5349/tcp

2.5 Reiniciar todos los servicios en orden

sudo systemctl restart coturn
sudo systemctl restart janus
sudo systemctl restart nats-server
sudo systemctl restart nextcloud-spreed-signaling

Comprueba que todos estén activos:

sudo systemctl status coturn janus nats-server nextcloud-spreed-signaling

3. Configuración en Nextcloud (interfaz web)

Accede a tu Nextcloud con una cuenta de administrador.

  1. Ve a Ajustes → Administración → Talk.
  2. En la sección High‑performance backend:
    • URL: https://signal.tudominio.com/standalone-signaling
    • Secreto compartido: 437929b3e7012e0d4a9e7a4564945d3a (el que generó el script).
  3. En STUN & TURN servers:
    • STUN: signal.tudominio.com:5349
    • TURN (dos líneas):
      • turn:signal.tudominio.com:5349?transport=udp
      • turn:signal.tudominio.com:5349?transport=tcp
    • Secreto TURN: a33e1511842947b2f2c514fba9e01dced4ed6d274bd8424d8c6bc8bcb00f60bb (el otro secreto).
  4. Guarda los cambios.

4. Prueba de funcionamiento

4.1 Prueba básica del signaling server

curl -k https://signal.tudominio.com/standalone-signaling/api/v1/welcome

Debe responder un JSON con "nextcloud-spreed-signaling":"Welcome".

4.2 Prueba del WebSocket con wscat

sudo apt install -y node-ws
wscat -c wss://signal.tudominio.com/standalone-signaling/spreed

Si ves Connected, presiona Ctrl+C.

4.3 Prueba en el navegador

  • Abre la consola de desarrollador (F12) en tu Nextcloud.
  • Ejecuta: window.OCA.Talk.SignalingStandaloneTest?.testConnection()
  • Deberías ver mensajes de éxito (no invalid_backend).
  • Inicia una llamada entre dos usuarios diferentes. El audio y vídeo deben fluir.

5. Solución de errores comunes

invalid_backend en la consola del navegador
Causa: la URL del backend en el signaling no coincide con la de Nextcloud.
Solución: edita /etc/nextcloud-spreed-signaling/server.conf y asegura que allowed y url tengan exactamente la URL que usas para acceder a Nextcloud (incluyendo https:// y el puerto si no es 443). Luego reinicia el signaling.

❌ WebSocket no conecta (Error en la consola: WebSocket connection failed)
Causa: Nginx no envía las cabeceras Upgrade.
Solución: agrega las líneas proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; en el bloque location /standalone-signaling/ de Nginx.

❌ Coturn no arranca o se cae (Cannot bind)
Causa: el servidor intenta escuchar en una IP que ya no existe o está mal configurada.
Solución: pon listening-ip=0.0.0.0 y comenta cualquier external-ip o relay-ip a menos que estés detrás de NAT.

❌ La llamada conecta pero no hay audio/vídeo (candidatos ICE vacíos)
Causa: el TURN no está accesible o el signaling anuncia un puerto incorrecto.
Solución: 1) Verifica que turnserver.conf tenga tls-listening-port=5349. 2) En server.conf del signaling, asegura que los servidores TURN usen el puerto 5349. 3) Abre los puertos en el firewall (UDP y TCP). 4) Si estás detrás de NAT, configura relay-ip y redirección de puertos en el router.

❌ Un usuario no administrador no puede unirse a la sala (user not invited)
Causa: la conversación no es pública o el usuario no fue invitado.
Solución: crea una nueva conversación, invita explícitamente al usuario, o convierte la sala en pública (enlace compartido). Asegúrate de que el usuario tenga habilitada la app Talk.

6. Nota final sobre IPs dinámicas y NAT

Si tu servidor tiene IP pública dinámica (cambia periódicamente) y usas DDNS (ej. dyndns.org):

  • No pongas external-ip en /etc/turnserver.conf. Deja que coturn use 0.0.0.0.
  • En el router, redirige los puertos 3478/5349 (UDP/TCP) a la IP privada del servidor.
  • Usa el nombre DDNS en todas las configuraciones (signal.tudominio.com).
  • El signaling server ya usará el nombre, y el navegador resolverá la IP actual.

✅ ¡Listo!

Ahora tienes un backend de alto rendimiento para Talk funcionando con WebSocket y TURN correctamente. Disfruta de llamadas de vídeo escalables y con baja latencia.

Si encuentras algún problema no cubierto aquí, revisa los logs:

sudo journalctl -u coturn -f
sudo journalctl -u janus -f
sudo journalctl -u nextcloud-spreed-signaling -f
sudo tail -f /var/log/nginx/error.log

🔥 Error Fatal en CodeIgniter 4: Undefined property Config\Format::$jsonEncodeDepth

Entrada fija

Si después de actualizar CodeIgniter 4 te apareció un error como este:

PHP Fatal error:
Undefined property: Config\Format::$jsonEncodeDepth

y el stack trace apunta a:

system/Format/JSONFormatter.php

la causa casi siempre es la misma:
tu archivo app/Config/Format.php quedó desactualizado después de actualizar el framework.


📌 ¿Por qué sucede?

En versiones recientes de CodeIgniter 4 se agregaron nuevas propiedades para el manejo de JSON.

El problema ocurre cuando:

  • actualizas vendor/codeigniter4/framework
  • pero conservas un archivo viejo en:
app/Config/Format.php

Entonces el framework intenta acceder a propiedades que no existen.


⚠️ Error completo

Undefined property: Config\Format::$jsonEncodeDepth

Relacionado con:

CodeIgniter\Format\JSONFormatter.php

✅ Solución

Abrir:

app/Config/Format.php

y agregar las propiedades faltantes dentro de la clase Format.


✅ Configuración corregida

&lt;?php

namespace Config;

use CodeIgniter\Config\BaseConfig;

class Format extends BaseConfig
{
    public array $supportedResponseFormats = [
        'application/json',
        'application/xml',
        'text/xml',
    ];

    public string $formatter = 'application/json';

    public array $formatters = [
        'application/json' =&gt; \CodeIgniter\Format\JSONFormatter::class,
        'application/xml'  =&gt; \CodeIgniter\Format\XMLFormatter::class,
        'text/xml'         =&gt; \CodeIgniter\Format\XMLFormatter::class,
    ];

    public int $jsonEncodeOptions =
        JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES;

    public bool $jsonDecodeAssociative = true;

    public int $jsonEncodeDepth = 512;

    public int $jsonDecodeDepth = 512;
}

🧹 Limpiar caché

Después de guardar cambios ejecutar:

php spark cache:clear

🔄 Reiniciar servicios

Si usas Apache, PHP-FPM o Docker:

sudo systemctl restart apache2

o el servicio correspondiente.


💡 Recomendación importante

Cada vez que actualices CodeIgniter 4:

  • ✅ compara tus archivos en:
app/Config/

contra los originales del framework:

vendor/codeigniter4/framework/app/Config/

porque muchas veces nuevas versiones agregan propiedades nuevas y los proyectos antiguos conservan configuraciones incompatibles.


🚀 Resultado

Después de agregar:

public int $jsonEncodeDepth = 512;

el error desaparece y las respuestas JSON vuelven a funcionar correctamente.


#CodeIgniter #PHP #CodeIgniter4 #PostgreSQL #MariaDB #Backend #WebDevelopment #Programacion #PHPDeveloper #OpenSource

Cómo instalar Openfire con Docker en Ubuntu y solucionar el error de “no carga la consola web”

Entrada fija

Guía definitiva paso a paso para tener tu servidor XMPP funcionando y accesible desde toda la red.

Introducción

Openfire es un potente servidor de mensajería XMPP (Jabber) muy utilizado en entornos empresariales y proyectos de comunicación interna. Instalarlo con Docker es rápido y limpio, pero es común encontrarse con un problema: la consola web no carga cuando intentas acceder desde otra computadora, aunque desde el propio servidor funcione con localhost.

En este artículo te mostraré cómo instalar Openfire usando Docker en Ubuntu, y cómo solucionar ese molesto error de conectividad, que normalmente está relacionado con el firewall (UFW) y la interfaz de escucha del contenedor.

Requisitos previos

  • Un servidor o máquina virtual con Ubuntu 20.04 / 22.04 / 24.04.
  • Docker y Docker Compose instalados (te muestro cómo).
  • Acceso root o usuario con sudo.
  • Puertos necesarios: 9090 (web admin), 9091 (admin seguro), 5222 (clientes), 5269 (federación).

Paso 1: Instalar Docker en Ubuntu

Si aún no tienes Docker, ejecuta:

sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce
sudo systemctl enable docker
sudo usermod -aG docker $USER   # (opcional, para no usar sudo)

Verifica: docker --version

Paso 2: Crear volúmenes persistentes

Los datos y logs de Openfire deben guardarse fuera del contenedor:

docker volume create openfire_data
docker volume create openfire_logs

Paso 3: Ejecutar Openfire con red bridge (RECOMENDADO)

No uses --network host si quieres acceder desde otras máquinas, a menos que sepas configurar el firewall. Usa mapeo de puertos explícito:

docker run -d \
  --name openfire \
  --restart unless-stopped \
  -p 9090:9090 -p 9091:9091 \
  -p 5222:5222 -p 5223:5223 -p 5269:5269 \
  -v openfire_data:/var/lib/openfire \
  -v openfire_logs:/var/log/openfire \
  ghcr.io/igniterealtime/openfire:latest

Verifica que esté corriendo:

docker ps

Paso 4: El problema típico – no accedo desde otra PC

Ejecutas curl http://localhost:9090 en el servidor y obtienes respuesta, pero desde tu ordenador personal http://IP_DEL_SERVIDOR:9090 no carga. ¿Por qué?

  • Causa principal: El firewall de Ubuntu (UFW) bloquea el tráfico externo hacia Docker.
  • Causa secundaria: Openfire podría estar escuchando solo en 127.0.0.1 dentro del contenedor.

Solución definitiva (UFW + Docker)

Instala el script ufw-docker que hace que Docker respete las reglas de UFW:

sudo wget -O /usr/local/bin/ufw-docker https://raw.githubusercontent.com/chaifeng/ufw-docker/master/ufw-docker
sudo chmod +x /usr/local/bin/ufw-docker
sudo ufw-docker install
sudo ufw allow 9090/tcp
sudo ufw allow 9091/tcp

Si tenías UFW desactivado, actívalo:

sudo ufw enable

¡Importante! Después de esto, reinicia Docker para aplicar los cambios de iptables:

sudo systemctl restart docker
docker start openfire

Ahora prueba de nuevo desde tu navegador: http://IP_DEL_SERVIDOR:9090 debería mostrar el asistente de configuración de Openfire.

Paso 5: Configuración inicial – poner la IP como dominio

Cuando accedas por primera vez, el asistente web te pedirá:

  • Idioma: Elige el tuyo.
  • Dominio del servidor XMPP: Aquí debes escribir la IP pública o privada de tu servidor (ej: 192.168.1.100). Si tienes un dominio real, úsalo. Esto es lo que llamamos “poner la IP en el dominio”.
  • Puertos de administración: Déjalos en 9090 y 9091.
  • Base de datos: Elige la embebida H2 (o configura una externa).
  • Contraseña de administrador: Elige una segura.

Completa los pasos y tendrás tu servidor Openfire listo.

Paso 6: Verificación final

Desde otra máquina en la misma red:

telnet IP_DEL_SERVIDOR 9090

O simplemente abre el navegador. Si todo está bien, verás la pantalla de login de la consola de administración.

Solución alternativa (si el problema persiste)

Si después de lo anterior sigues sin acceso, edita la configuración de Openfire para forzar la escucha en 0.0.0.0:

docker exec -it openfire bash
apt update && apt install -y nano
nano /var/lib/openfire/conf/openfire.xml

Dentro de <jive>, agrega o modifica:

<adminConsole>
    <interface>0.0.0.0</interface>
    <port>9090</port>
    <securePort>9091</securePort>
</adminConsole>

Guarda (Ctrl+O), sal (Ctrl+X) y reinicia el contenedor:

exit
docker restart openfire

Conclusión

Instalar Openfire con Docker es sencillo, pero el error de “no carga la consola web desde otra PC” es muy común debido a la interacción entre Docker y UFW. Con el script ufw-docker y usando la red bridge con mapeo de puertos, el problema se resuelve de raíz. Ahora ya puedes disfrutar de tu propio servidor XMPP accesible desde toda tu red local.

¿Te ha servido? Déjame un comentario y comparte este tutorial con otros administradores.

🚀 Apache NetBeans 29: ¿Qué mejoras trae en Git y vale la pena actualizar? 🤔

Entrada fija

Si eres desarrollador 👨‍💻 y trabajas todos los días con Git, seguramente te interesa saber qué cambió en Apache NetBeans 29.

Aunque a simple vista no parece una actualización “wow” ✨, sí trae mejoras importantes que hacen que trabajar con repositorios sea más rápido, estable y menos frustrante 😌.

Aquí te lo explico fácil y directo 👇

🔧 1. Mejor compatibilidad con Git moderno

Git ha cambiado bastante con los años.

Antes era común ver repositorios con la rama principal llamada:

master

Ahora la mayoría usa:

main

NetBeans 29 mejora la compatibilidad con estas configuraciones modernas ✅

¿Qué mejora?

  • ✔ Detecta mejor las ramas nuevas
  • ✔ Menos errores con repositorios recientes
  • ✔ Mejor soporte para nuevas configuraciones

👉 Si clonas proyectos modernos, todo funciona más fluido.


🔐 2. Mejor autenticación con GitHub (HTTPS y SSH)

GitHub ya no permite usar usuario y contraseña para hacer push o pull por HTTPS ❌

Ahora se usa:

  • 🔹 Token personal (PAT)
  • 🔹 Llave SSH

NetBeans 29 mejora ambos métodos 👇

📌 HTTPS con Token

Más estabilidad al hacer:

  • ✅ Push
  • ✅ Pull
  • ✅ Clone
  • ✅ Fetch

Menos errores de credenciales 🙌

🔑 SSH más confiable

Mejor soporte para llaves como:

id_rsa
id_ed25519

👉 Si ya configuraste tu carpeta .ssh, todo debería funcionar mejor.


⚡ 3. Más rápido en proyectos grandes

Si trabajas con proyectos pesados en:

  • 🐘 PHP
  • ☕ Java
  • 🟨 JavaScript

Seguro has notado lentitud al revisar cambios.

NetBeans 29 optimiza:

  • ✅ Status
  • ✅ Diff
  • ✅ Commit
  • ✅ Historial

👉 Menos tiempo esperando ⏳


🔍 4. Mejor comparación de archivos (Diff)

La herramienta para comparar archivos ahora es más confiable.

Te ayuda a ver mejor:

  • 🟢 líneas agregadas
  • 🔴 líneas eliminadas
  • 🟡 líneas modificadas

Y también mejora la resolución de conflictos 🔥

Ideal si trabajas en equipo 👥


🌐 5. Mejor soporte para otras plataformas Git

No todos usan GitHub.

Ahora NetBeans 29 trabaja mejor con:

  • 🦊 GitLab
  • 🏔 Codeberg
  • 🏢 servidores privados

👉 Más compatibilidad con repos remotos.


❌ Lo que NO cambió

Para no vender humo 😅

NetBeans 29 todavía NO tiene:

  • ❌ Login directo con GitHub tipo VS Code
  • ❌ Panel para Pull Requests
  • ❌ Integración con Issues
  • ❌ Marketplace de extensiones como VS Code

Sigue siendo una experiencia más clásica.


🤔 Entonces… ¿vale la pena actualizar?

Si usas Git diario:

✅ Sí vale la pena.

Porque aunque no se vea “bonito”, sí mejora lo importante:

  • 🚀 Más rápido
  • 🔐 Más estable
  • ⚡ Menos errores
  • 🌐 Mejor compatibilidad

Si vienes de NetBeans 26 o menor, sí notarás diferencia.


🧠 Conclusión

Apache NetBeans 29 no reinventa Git…

Pero sí hace que trabajar con repositorios sea:

  • ✔ más sólido
  • ✔ más confiable
  • ✔ más rápido

Y muchas veces eso vale más que una interfaz bonita 😎

🚀 Generador Automático de CRUD para CodeIgniter 4: Crea Módulos Completos en 1 Minuto 🔥

Entrada fija





Generador Automático de CRUD para CodeIgniter 4 – julio101290/boilerplate

🚀 Generador Automático de CRUD para CodeIgniter 4: Crea Módulos Completos en 1 Minuto 🔥

¿Cansado de escribir el mismo código una y otra vez? ¿Tus proyectos se retrasan por la tediosa creación de modelos, controladores y vistas? ¡Tenemos la solución! Te presento el Generador Automático de CRUD para CodeIgniter 4, una herramienta integrada en mi boilerplate que transforma una tabla de base de datos en un módulo funcional, seguro y profesional en menos de 60 segundos. Ahorra cientos de horas y olvídate de los errores repetitivos.


📌 Índice


🎯 ¿Qué es este generador?

Es un controlador inteligente que, a partir del nombre de una tabla existente en tu base de datos, genera de forma automática todos los archivos necesarios para un CRUD completo:

  • ✅ Modelo con validaciones y soft delete
  • ✅ Controlador con DataTables server-side
  • ✅ Vistas (listado + modal) integradas con AdminLTE
  • ✅ Archivos de idioma (inglés y español)
  • ✅ Migración lista para ejecutar
  • ✅ Rutas listas para copiar o integradas en tu paquete
  • ✅ Permisos creados automáticamente (RBAC)

Todo esto con código limpio, indentado y siguiendo las mejores prácticas.

💡 Dato curioso: El generador lee la estructura de tu tabla y adapta los campos automáticamente. Si tu tabla tiene campos como created_at, updated_at, deleted_at, los maneja de forma especial para que el soft delete funcione perfectamente.

🏗️ El entorno perfecto: julio101290/boilerplate

Este generador vive dentro de mi fork del excelente boilerplate de agungsugiarto, adaptado y mejorado para proyectos reales. Incluye:

  • 🎨 AdminLTE 3 + Bootstrap 4 + Font Awesome 5
  • 🔐 RBAC completo con Myth/Auth
  • 📊 Menú dinámico generado desde BD
  • 🌍 Internacionalización (EN, ES, ID)
  • Instalación por Composer y comandos spark

👉 Repositorio oficial en GitHub

⚙️ Características principales

CaracterísticaBeneficio
Generación instantáneaDe 1 hora a 1 minuto por módulo
Código seguroCSRF manejado automáticamente
Validación por defectoEvita errores comunes
Soft delete funcionaldeleted_at siempre NULL al guardar
Soporte multi-empresaFiltrado por idEmpresa incluido
Modo App / VendorGenera en app/ o en tu paquete Composer
Permisos integradosSeeder actualizado automáticamente

🔧 Mejoras de seguridad y robustez

Hemos recorrido un largo camino desde la primera versión. Aquí están las mejoras clave que marcan la diferencia:

🛡️ Seguridad CSRF sin dolores de cabeza

El error 403 por CSRF era el más común al trabajar con AJAX. Ahora:

  • 🔹 El controlador devuelve el nuevo token en cada respuesta (éxito o error).
  • 🔹 La vista lee el token del campo oculto y lo envía en el FormData.
  • 🔹 Tras cada petición, se actualiza el token en el campo y la metaetiqueta.
  • 🔹 Incluso en errores de validación, el token se renueva, permitiendo reenviar el formulario sin recargar la página.

📌 Ejemplo de respuesta del controlador:

return $this->respond([
    'status'    => 201,
    'message'   => 'Guardado correctamente',
    'csrf_hash' => csrf_hash() // 👈 Nuevo token
], 201);

🗑️ El misterio de deleted_at resuelto

Problema: los registros nuevos aparecían como eliminados porque deleted_at se llenaba con 0000-00-00.... Solución en dos capas:

  • ✅ En el modelo: deleted_at excluido de $allowedFields y eventos beforeInsert/beforeUpdate que lo eliminan.
  • ✅ En el controlador: unset($datos['deleted_at']) antes de guardar.

Resultado: deleted_at siempre NULL en altas y modificaciones, y solo el método delete() lo actualiza.

✅ Validación automática para idEmpresa

Casi todas las tablas dependen de una empresa. Ahora el modelo incluye por defecto:

protected $validationRules = [
    'idEmpresa' => 'required|integer|greater_than[0]'
];

¡Olvídate de registros huérfanos!

📦 Genera CRUDs dentro de paquetes vendor

¿Desarrollas paquetes reutilizables? El generador puede crear el CRUD directamente en tu paquete Composer:

http://tusitio.com/generateCRUDComposer/mi_tabla?target=vendor&package=tu/paquete
  • 🔹 Lee el composer.json y extrae el namespace PSR-4 automáticamente.
  • 🔹 Crea la estructura src/Models, src/Controllers, etc.
  • 🔹 Actualiza el archivo src/Config/Routes.php del paquete con las nuevas rutas.
  • 🔹 Tu paquete se vuelve autónomo y portable.

🔑 Permisos gestionados como profesionales

Antes: los permisos se creaban en caliente al generar el CRUD (poco ortodoxo). Ahora: cuando el destino es un paquete vendor, el generador actualiza el Seeder correspondiente (ej. BoilerplateCFDIDescargaMasiva.php), añadiendo la línea para crear el permiso y asignarlo al admin.

Así, la instalación de permisos se hace como Dios manda: con php spark db:seed.

⏱️ Ahorro de tiempo real

TareaSin generadorCon generadorAhorro
CRUD de 10 campos45-60 min1 min~98%
20 tablas por proyecto15-20 horas20 minutos¡Días!

Ese tiempo lo puedes reinvertir en lógica de negocio que realmente aporta valor. Además, todo el código generado sigue el mismo patrón, reduciendo la deuda técnica y facilitando el mantenimiento.

📝 Código completo del generador

Aquí tienes la clase AutoCrudControllerComposer en su versión final. Cópiala directamente en tu proyecto (julio101290/boilerplate/Controllers/).

db = \Config\Database::connect();
        $this->authorize = Services::authorization();
        $this->users = new UserModel();
        helper('utilerias');
    }

    /**
     * Método principal para generar el CRUD
     *
     * @param string      $table          Nombre de la tabla
     * @param string|null $targetType     'app' o 'vendor' (por GET)
     * @param string|null $vendorPackage  Paquete vendor
     * @param string|null $vendorNamespace Namespace (auto-detected)
     */
    public function index($table, $targetType = null, $vendorPackage = null, $vendorNamespace = null)
    {
        // Leer de GET si no se pasaron como argumentos
        if ($targetType === null) {
            $targetType = $this->request->getGet('target') ?? 'app';
        }
        if ($vendorPackage === null && $targetType === 'vendor') {
            $vendorPackage = $this->request->getGet('package');
        }
        if ($vendorNamespace === null && $targetType === 'vendor') {
            $vendorNamespace = $this->request->getGet('namespace');
        }

        $this->targetType = $targetType;

        if ($targetType === 'vendor' && $vendorPackage) {
            $this->setupVendorPaths($vendorPackage, $vendorNamespace);
        }

        $this->generateModel($table);
        $this->generateController($table);
        $this->generateView($table);
        $this->generateViewModal($table);
        $this->generateLanguage($table);
        $this->generateMigration($table);
        $this->generateLanguageES($table);

        if ($targetType === 'vendor') {
            $this->generateVendorRoutesFile($table);
            $this->updateSeederPermissions($table);
        } else {
            $this->generatePermissions($table);
        }

        $tableUpCase = ucfirst($table);

        echo "";
        echo "✅ CRUD generado exitosamente en: " . ($targetType === 'vendor' ? $this->vendorPackage : 'app') . "";
        echo "";
    }

    // ... (el resto de métodos: setupVendorPaths, generateModel, generateController, etc.)
    // Por brevedad, no repetimos todo el código aquí, pero en el artículo real debes incluir el código completo.
}
?>

⚠️ Nota: El código anterior es un resumen. Para obtener el código completo, visita el repositorio en GitHub o copia el bloque que aparece al final de este artículo.

🔌 Cómo usarlo

  1. Agrega la ruta en app/Config/Routes.php: $routes->get('generateCRUDComposer/(:any)', 'julio101290\boilerplate\Controllers\AutoCrudControllerComposer::index/$1');
  2. Genera un CRUD en app: http://tusitio.com/generateCRUDComposer/nombre_tabla
  3. Genera en tu paquete vendor: http://tusitio.com/generateCRUDComposer/nombre_tabla?target=vendor&package=tu/paquete

¡Y listo! En segundos tendrás todo el código listo para usar.

🎯 Conclusión y llamado a la acción

El generador automático de CRUD ha evolucionado de un simple script a una herramienta profesional que:

  • 🚀 Acelera el desarrollo de forma drástica.
  • 🛡️ Garantiza seguridad (CSRF, validación, soft delete correcto).
  • 📦 Soporta tanto proyectos monolíticos como paquetes reutilizables.
  • 🧹 Genera código limpio y mantenible.

Si aún no lo has probado, te estás perdiendo de ahorrar cientos de horas.

👉 Haz un fork del repositorio julio101290/boilerplate, instálalo y pruébalo hoy mismo.

¿Tienes sugerencias o mejoras? ¡Las contribuciones son bienvenidas! Abre un issue o envía un pull request.


#CodeIgniter4 #PHP #DesarrolloWeb #CRUD #Boilerplate #AhorroDeTiempo #OpenSource

Página 1 de 13

Creado con WordPress & Tema de Anders Norén