Qué cambia con n8n 3.0 y por qué actuar ahora
La documentación oficial de breaking changes de n8n 3.0 es clara: «Self-hosted n8n will require a Docker-based deployment. n8n 3.0 will no longer support installations run using npm or npx n8n.» No es una advertencia de deprecación gradual — es una fecha límite firme. En octubre de 2026, cualquier instancia lanzada mediante npx n8n o un paquete npm global no podrá actualizarse y quedará congelada en la última versión 2.x sin parches de seguridad.
Riesgos de posponer la migración a octubre
- Migración bajo presión — migrar en urgencia mientras corren automatizaciones críticas expone a errores de configuración difíciles de diagnosticar.
- Pérdida de datos SQLite — el issue #22341 de GitHub documenta casos donde contenedores Docker actualizados sin precauciones provocaron una regresión de la base de datos: los flujos de trabajo vuelven al estado de una copia de seguridad antigua.
- Sin parches de seguridad — una instancia npm congelada en 2.x no recibe parches de seguridad ni correcciones de estabilidad para la rama 3.x.
- Incompatibilidad creciente — las integraciones, nodos comunitarios y webhooks dependen de APIs que evolucionan; quedarse en una versión muerta genera deuda de incompatibilidad creciente.
- Duración impredecible — una migración bien preparada tarda una hora; una improvisada puede ocupar un día entero con los flujos de trabajo parados.
Requisitos previos antes de empezar
Este procedimiento está orientado a una instancia n8n existente en producción. Si partes de cero, consulta el artículo dedicado a la instalación de n8n en VPS.
Lo que necesitas
- VPS con acceso root — Ubuntu 22.04 o Debian 12 recomendados, mínimo 2 vCPU y 2 GB de RAM para n8n solo, 4 GB si añades PostgreSQL en el mismo servidor.
- Docker Engine y Docker Compose v2 — comprueba con
docker --versionydocker compose version(sintaxis sin guión, plugin v2). - PostgreSQL recomendado — n8n admite SQLite y PostgreSQL, pero SQLite en Docker conlleva riesgos de pérdida de datos en actualizaciones mal gestionadas (cf. issue #22341).
- Acceso a la instancia npm actual — la migración requiere exportar los flujos de trabajo mediante la API REST antes de detener la instancia antigua.
- Un nombre de dominio y un certificado TLS —
your-domain.comcon Let's Encrypt vía Nginx como reverse proxy. - Una ventana de mantenimiento planificada — aunque sea breve, evita perder ejecuciones en curso.
Detectar tu modo de lanzamiento actual
Antes de nada, identifica con precisión cómo está lanzada tu instancia n8n. El comando a usar depende del modo de supervisión.
Detectar, exportar, desplegar y validar
Identificar el proceso n8n
Busca el ejecutable en ejecución:
which n8nmuestra la ruta si n8n está instalado globalmente vía npm. Luego comprueba si un servicio del sistema lo supervisa:systemctl status n8n. Si no existe servicio systemd, busca un proceso activo:ps aux | grep n8n. Un resultado connpx n8nconfirma una instalación npm.Localizar el archivo de configuración y la base de datos
El directorio de datos predeterminado es
~/.n8n/. Comprueba su contenido:ls -la ~/.n8n/. El archivodatabase.sqliteindica una base SQLite. Anota la ruta completa — la necesitarás para la exportación.Exportar todos tus flujos de trabajo mediante la API REST
Obtén primero una clave API desde la interfaz (
Settings → API → Create API Key), luego exporta:curl -s -H 'X-N8N-API-KEY: TU_CLAVE' http://localhost:5678/api/v1/workflows | python3 -m json.tool > workflows-export-$(date +%Y%m%d).json. Verifica que el archivo contiene tus flujos antes de cualquier operación.Detener correctamente la instancia npm
Si está supervisada por systemd:
systemctl stop n8n && systemctl disable n8n. Si está lanzada manualmente, identifica el PID (pgrep -f n8n) y luegokill -SIGTERM <PID>. Espera unos segundos a que n8n termine las ejecuciones en curso.Crear el archivo docker-compose.yml con PostgreSQL
Crea un directorio dedicado:
mkdir -p /opt/n8n && cd /opt/n8n. Luego crea el archivodocker-compose.ymlcon el contenido completo mostrado en la versión francesa, adaptando contraseñas y usandoyour-domain.com. La versión está fijada enn8nio/n8n:2.38.4(estable a 2026-09-09). Nunca uses:latest.Arrancar el stack e importar los flujos de trabajo
Lanza el stack:
docker compose up -d. Espera a que ambos contenedores estén sanos:docker compose ps. Una vez n8n accesible enhttp://127.0.0.1:5678, importa los flujos de trabajo vía API y verifica en la interfaz que están presentes y activos.Configurar Nginx como reverse proxy con TLS
Instala Nginx y Certbot:
apt install nginx certbot python3-certbot-nginx -y. Crea la configuración Nginx con proxy_pass ahttp://127.0.0.1:5678, cabeceras WebSocket y timeout de lectura de 300 segundos. Activa el sitio y obtén el certificado:certbot --nginx -d your-domain.com.Validar que la migración ha tenido éxito
Realiza estas comprobaciones en orden: 1) accede a
https://your-domain.com— la página de inicio de sesión aparece sin advertencia TLS; 2) verifica que tus flujos de trabajo están presentes y activos; 3) lanza manualmente un flujo simple para validar la ejecución completa; 4) actualiza los webhooks si servicios externos apuntan a la URL o puerto anteriores; 5) revisa los logs después de 24 horas:docker compose logs n8n --since 24h | grep -i error.
Fija siempre una versión, nunca uses :latest
Usar n8nio/n8n:latest en tu docker-compose.yml te expone a actualizaciones automáticas no controladas durante un docker compose pull. En una base SQLite, un salto de versión mayor sin migración previa puede desencadenar el escenario descrito en el issue #22341. Fija siempre una versión específica (n8nio/n8n:2.38.4) y planifica tus actualizaciones. Para pasar a una nueva versión: docker compose pull && docker compose up -d.
Resolución de problemas: casos comunes tras la migración
Estos son los problemas más frecuentes durante esta transición.
Problemas y soluciones
- Flujos vacíos tras la importación — verifica que el formato JSON exportado coincide con lo que espera la API de importación; algunas versiones de n8n exportan
{ data: [] }, otras un array directo. - Webhooks que no responden —
WEBHOOK_URLdebe coincidir exactamente con la URL pública de tu instancia (conhttps://). - Credenciales inaccesibles — las credenciales están cifradas con
N8N_ENCRYPTION_KEY. Recupérala desde~/.n8n/.n8n_encryption_keyen la instancia npm y configúrala como variable de entorno. - Regresión de la base SQLite (issue #22341) — si has conservado SQLite temporalmente, asegúrate de que el volumen Docker esté montado de forma persistente. La migración a PostgreSQL sigue siendo la solución definitiva.
- Error
ECONNREFUSEDen PostgreSQL — la condicióndepends_on.postgres.condition: service_healthyy el healthcheckpg_isreadygarantizan que n8n espere a que PostgreSQL esté listo.
Una migración que hacer ahora, no en octubre
La versión estable de n8n en el momento de este artículo es la 2.38.4. Tienes varias semanas para llevar a cabo esta migración en buenas condiciones: exportar correctamente tus flujos de trabajo, probar el stack Docker en un servidor de pruebas, y luego cambiar la producción con un plan de rollback real. En octubre, cuando n8n 3.0 esté disponible, solo necesitarás cambiar el número de versión en tu docker-compose.yml — cinco minutos. La diferencia entre cinco minutos y un día estresante empieza ahora.