Guía de despliegue

Instalar n8n en un VPS con Docker: guía completa 2026

Desplegar en un VPS Cloud →

Tutorial

Automatización

Instalar n8n en un VPS con Docker: guía completa 2026

n8n es un orquestador de automatizaciones de código abierto: conecta sus APIs, dispara workflows por evento y, autoalojado, funciona sin límite de ejecuciones ni suscripción cloud. Esta guía cubre la instalación completa en VPS con Docker, la configuración del reverse proxy, las variables de entorno críticas, dos errores de producción críticos — crash V8 con más de 30 workflows simultáneos y 502 Bad Gateway nginx — la migración desde el modo npm, y la seguridad de los datos de ejecución persistidos que puso de relieve el advisory GHSA-vrv8-j27g-g7cr de agosto de 2026. En un VPS ServOrbit, n8n puede instalarse desde la creación del servidor: la primera parte de esta guía indica dónde encontrar su dirección y cómo abrirlo, y la instalación a mano se mantiene al final del artículo, como alternativa.

19 min de lectura15 pasos
Contenido· n8n instalado al crear su VPS1/17
  1. 01n8n instalado al crear su VPS
  2. 02Abrir el n8n instalado por ServOrbit
  3. 03Por qué alojar n8n en su VPS
  4. 04Las ventajas concretas de un n8n autoalojado
  5. 05Asegurar las ejecuciones persistidas (advisory GHSA-vrv8-j27g-g7cr)
  6. 06Cuatro gestos para corregir y prevenir
  7. 07Crash V8 fatal con más de 30 workflows activos
  8. 08502 Bad Gateway persistente detrás de nginx
  9. 09Breaking changes que conviene conocer (v1.27–v1.31)
  10. 10Resolución de los errores frecuentes
  11. 11SQLite o PostgreSQL: la elección que lo cambia todo en producción
  12. 12Cuatro configuraciones críticas para una producción estable
  13. 13Mantener y hacer evolucionar la instancia
  14. 14Instalar a mano (alternativa)
  15. 15Requisitos previos con cifras
  16. 16Instalación paso a paso
  17. 17Endurecimiento y modo queue

n8n instalado al crear su VPS

Si eligió n8n al contratar su VPS ServOrbit, no hay nada que instalar. Al crear el VPS, ServOrbit instala Docker si falta y arranca n8n con su base de datos PostgreSQL 16 mediante Docker Compose. La interfaz escucha en 127.0.0.1:5678, el bucle local del servidor: no se publica nada en su dirección IP y todavía no hay ningún dominio asociado. Los cuatro pasos siguientes bastan para abrirlo. La instalación a mano, para otro servidor o para rehacerlo todo usted mismo, se describe al final del artículo.

Abrir el n8n instalado por ServOrbit

  1. Encontrar la dirección y los accesos

    El correo «n8n ya está instalada» y la ficha de su VPS en el área de cliente, sección «Aplicaciones instaladas», le indican cómo abrir la aplicación: su dirección si hay un dominio configurado y, si no, el comando del túnel SSH y el puerto. Allí encontrará también el enlace a esta guía y el botón «Soporte».

  2. Abrir n8n sin dominio

    Desde su ordenador, ejecute ssh -L 5678:127.0.0.1:5678 root@<ip-del-vps>, mantenga la sesión abierta y abra http://localhost:5678. El puerto puede haberse reasignado durante la instalación: utilice el que muestra su área de cliente, ya que 5678 es solo el valor del catálogo.

  3. Conectarse por primera vez

    Hágalo sin esperar: la primera pantalla crea la cuenta de propietario (correo electrónico, nombre, contraseña de al menos 8 caracteres con una mayúscula y una cifra) y el primer visitante se convierte en propietario de la instancia. Después cree su primer flujo de trabajo: un disparador (Webhook, Cron, correo electrónico…) y luego las aplicaciones que desee conectar.

  4. Publicar en HTTPS en un dominio

    Cuando n8n se instala desde su área de cliente con una dirección elegida —su propio dominio o un subdominio gratuito de ServOrbit—, la plataforma configura el vhost nginx y el certificado Let's Encrypt. Una instalación hecha al crear el VPS, o sin dirección, se publica desde la ficha del VPS: botón «Asociar un dominio» del bloque de la aplicación (un dominio de su cuenta, el subdominio gratuito o un nombre que usted apunte al servidor). Con el dominio ya configurado, añada N8N_HOST=<dominio>, N8N_PROTOCOL=https y N8N_WEBHOOK_URL=https://<dominio>/ (WEBHOOK_URL antes de n8n 2.35.0) al bloque environment del servicio n8n, en el archivo Compose de la aplicación (docker compose ls muestra su carpeta), y ejecute docker compose up -d. Sin estas variables, las URL de webhook que genera n8n siguen apuntando a localhost y son inaccesibles.

Por qué alojar n8n en su VPS

La versión cloud de n8n factura por ejecución más allá del plan y limita el número de workflows activos. En su VPS, el único coste es el del servidor, con independencia del número de automatizaciones o de llamadas API. Conserva además el control total sobre los credentials, las cargas útiles de los webhooks y el historial de ejecuciones — ningún dato transita por una infraestructura de terceros.

Las ventajas concretas de un n8n autoalojado

  • Ejecuciones sin límite: ningún tope mensual, ningún sobrecoste al escalar.
  • Credentials y payloads de webhooks confinados en su servidor, sin tránsito externo.
  • Acceso a los nodes comunitarios y a la ejecución de código personalizado sin restricción.
  • Webhooks en su propio dominio, configurables para cada integración entrante.
  • Coste previsible: un precio de VPS fijo, independiente del volumen de automatizaciones.
  • Persistencia controlada de los workflows y del historial en volúmenes de los que usted hace copia de seguridad.
  • Compatibilidad con Ollama, Flowise o cualquier otro servicio Docker en la misma red interna.

Asegurar las ejecuciones persistidas (advisory GHSA-vrv8-j27g-g7cr)

En agosto de 2026, el advisory GHSA-vrv8-j27g-g7cr reveló que tres nodes vuelcan los credentials descifrados en los datos de ejecución persistidos en caso de error: el node Strapi (tokens OAuth escritos en claro en execution_data), el node SeaTable (claves API inscritas en los logs de ejecución de error) y el node Mailcheck (credenciales SMTP persistidas en execution_data). Estos secretos quedan legibles para cualquier usuario con acceso a los logs de ejecución en la interfaz de n8n. En una instancia sin pruning, se acumulan indefinidamente.

Cuatro gestos para corregir y prevenir

  1. Actualizar a la versión que corrige el advisory

    La actualización es la única corrección completa para los tres nodes. Compruebe su versión actual: docker exec n8n n8n --version. Descargue la última imagen y relance: docker compose pull && docker compose up -d. Para la rama estable, la corrección está disponible a partir de la versión 2.35.4; para la rama v1, a partir de la versión 1.123.73.

  2. Activar el pruning de las ejecuciones

    Añada dos variables en la sección environment del servicio n8n: EXECUTIONS_DATA_PRUNE=true y EXECUTIONS_DATA_MAX_AGE=168 (7 días, expresado en horas). Reinicie el contenedor: docker compose restart n8n.

  3. Restringir el acceso a los logs de ejecución

    En modo multiusuario, compruebe en Ajustes → Usuarios que solo los administradores pueden consultar los logs de ejecución.

  4. Medida cautelar antes de la actualización

    En una instancia todavía sin actualizar: desactive o retire los workflows que utilizan los nodes Strapi, SeaTable o Mailcheck.

Crash V8 fatal con más de 30 workflows activos

Síntoma. La instancia n8n se detiene bruscamente con el error FATAL ERROR: invalid-mark-compact are transition en los logs de Docker. El contenedor se reinicia si restart: unless-stopped está configurado, pero el crash se reproduce en cuanto la carga vuelve a pasar el mismo umbral.

Causa. Este error es un pánico del motor V8 durante un ciclo de garbage collection. Se desencadena cuando el heap de V8 está saturado — típicamente a partir de 30 workflows ejecutándose simultáneamente en un VPS con menos de 2 GB de RAM.

Corrección inmediata. Añada NODE_OPTIONS=--max-old-space-size=2048 en el entorno. Reinicie el contenedor: docker compose restart n8n.

Corrección estructural. Asigne al menos 2 GB de RAM a la VM por encima de 30 workflows activos. Para más de 50 workflows, prefiera el modo queue con Redis. Fuente: community.n8n.io thread #308425.

502 Bad Gateway persistente detrás de nginx

Síntoma. Las peticiones cortas tienen éxito pero ciertos workflows devuelven 502 Bad Gateway desde nginx exactamente 60 segundos después del inicio de la ejecución.

Causa. nginx espera por defecto 60 segundos una respuesta del backend (proxy_read_timeout = 60 s). Si la ejecución tarda más, nginx corta la conexión.

Corrección. Añada en el bloque location de nginx:

proxy_read_timeout 300;
proxy_send_timeout 300;

Recargue nginx: nginx -t && systemctl reload nginx. Fuente: community.n8n.io thread #274581.

Breaking changes que conviene conocer (v1.27–v1.31)

Tres cambios de las versiones recientes pueden romper silenciosamente una instancia existente.

Renombrado del parámetro OAuth 2.0 en HTTP Request. Las peticiones autenticadas con OAuth 2.0 pueden dejar de funcionar sin mensaje de error explícito.

Formato de la URL de webhook. Si ha copiado URL de webhook fijas en servicios de terceros, vuelva a comprobarlas tras la actualización.

Obsolescencia de $item(). Su reemplazo es $input.item o $('Nombre del node').item.

La lista completa está disponible en la documentación oficial de n8n.

Resolución de los errores frecuentes

El puerto 5678 es inaccesible. Compruebe que el contenedor funciona y que escucha en 127.0.0.1:5678.

Los webhooks muestran localhost. La variable N8N_WEBHOOK_URL está ausente — añádala con la barra final y reinicie.

Error de permisos en el volumen. chown -R 1000:1000 /opt/n8n/data y reinicie el contenedor.

La base PostgreSQL rechaza la conexión. Compruebe la red Docker y las variables de entorno.

Crash V8 brutal. Añada NODE_OPTIONS=--max-old-space-size=2048. Vea la sección dedicada.

502 Bad Gateway persistente. Lleve proxy_read_timeout a 300 s. Vea la sección dedicada.

Credentials visibles en los logs. Actualice n8n y active el pruning. Vea la sección dedicada.

Rollback silencioso de SQLite bajo carga. Síntoma: ejecuciones desaparecidas o resultados inconsistentes sin error visible bajo alta concurrencia. Causa: SQLite no soporta escrituras concurrentes (issue GitHub n8n #32284). Solución única: migrar a PostgreSQL.

SQLite o PostgreSQL: la elección que lo cambia todo en producción

SQLite es un motor de pruebas, no un motor de producción. Es perfectamente adecuado para descubrir n8n en local o validar un workflow antes de desplegarlo. En cuanto su instancia recibe tráfico real — múltiples workflows lanzados en paralelo, webhooks entrantes, ejecuciones planificadas simultáneas — SQLite se convierte en un riesgo. El issue GitHub n8n #32284 documenta rollbacks silenciosos bajo carga concurrente: las ejecuciones desaparecen del historial sin mensajes de error, y los resultados intermedios se escriben de forma parcial.

Migrar a PostgreSQL. El procedimiento en tres pasos:

1. Exporte los workflows existentes: n8n export:workflow --all --output=/opt/n8n/workflows-backup.json
2. Modifique el .env para cambiar el motor: DB_TYPE=postgresdb con las variables correspondientes.
3. Reinicie todo (docker compose up -d) e importe: n8n import:workflow --input=/opt/n8n/workflows-backup.json.

Almacenamiento persistente independiente. El volumen PostgreSQL (pg_data) debe montarse en un almacenamiento persistente independiente del host. Verifique siempre con docker volume ls que el volumen existe.

Dimensionamiento. PostgreSQL consume entre 50 y 100 MB de RAM adicional en carga ligera. Planifique al menos 2 GB de RAM para n8n + PostgreSQL en el mismo VPS; 4 GB si ejecuta regularmente workflows de IA o importaciones voluminosas.

Cuatro configuraciones críticas para una producción estable

Estos cuatro puntos concentran la mayor parte de los incidentes reportados en community.n8n.io y DEV Community en 2026. Cada uno es independiente y puede aplicarse a una instancia existente sin redespliegue completo.

1. N8N_WEBHOOK_URL es obligatorio en el .env. Sin esta variable, n8n reconstruye la URL de webhook combinando el hostname interno del contenedor y el puerto 5678. El resultado es una URL inutilizable desde cualquier servicio externo. Además, la URL cambia en cada recreación del contenedor. Establezca N8N_WEBHOOK_URL=https://n8n.su-dominio.com/ (con barra final) y no la omita nunca.

2. RAM mínima 2 GB, recomendada de 4 a 8 GB. Un VPS con 1 GB de RAM es insuficiente en cuanto n8n ejecuta varios workflows simultáneamente. El OOM killer de Linux termina el proceso Node.js sin log explícito en n8n, creando un ciclo de crashes difícil de diagnosticar. El mínimo documentado por n8n para producción es 2 GB; 4 a 8 GB se recomiendan para instancias con workflows de IA o más de 20 workflows activos.

3. Headers WebSocket de nginx son obligatorios para el editor. La interfaz de n8n se comunica con el backend vía WebSocket para la ejecución en tiempo real. Sin estos dos headers en el bloque location de nginx, la conexión WebSocket es rechazada y el editor queda inaccesible o se congela:

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

Caddy los gestiona automáticamente; con nginx deben añadirse explícitamente.

4. Purga automática del historial de ejecución. Sin purga, la tabla de ejecuciones crece indefinidamente. En una instancia activa durante meses puede llegar a varios gigabytes y degradar significativamente el rendimiento. Active la purga con:

EXECUTIONS_DATA_PRUNE=true
EXECUTIONS_DATA_MAX_AGE=168

El valor 168 corresponde a 7 días expresados en horas. Ajuste según su necesidad de retención.

Mantener y hacer evolucionar la instancia

Para las actualizaciones, dos enfoques: Watchtower o una tarea cron manual (docker pull n8nio/n8n:latest && docker compose up -d). En ambos casos, lea las notas de versión antes de una actualización mayor. Mantenga sus exportaciones de workflows al día en un repositorio git.

Para los advisories de seguridad, siga la página GitHub Security Advisories del repositorio n8n.

Instalar a mano (alternativa)

Las secciones siguientes describen la instalación manual de n8n con Docker Compose: para un servidor en el que ServOrbit no instaló n8n, o para reconstruirlo todo usted mismo. En un VPS en el que ServOrbit lo instaló, no las necesita.

Requisitos previos con cifras

Antes de empezar, compruebe que su VPS cumple los requisitos siguientes. Para un uso moderado, 1 vCPU y 1 GB de RAM bastan; prevea 2 vCPU y 2 GB en cuanto ejecute workflows pesados o concurrentes, y 4 GB si conecta una base PostgreSQL dedicada o integra un modelo de IA local. Cuente con 10 GB de disco como mínimo para Docker, los volúmenes y los logs. El puerto 5678 no debe exponerse directamente — n8n solo escucha en 127.0.0.1:5678 y todas las peticiones pasan por el reverse proxy en el puerto 443. Se requiere un subdominio (por ejemplo n8n.su-dominio.com) que apunte a la IP del VPS para HTTPS y los webhooks entrantes. Son necesarios Docker Engine 24+ y Docker Compose v2.

Instalación paso a paso

  1. Actualizar el VPS e instalar Docker

    Conéctese por SSH y actualice los paquetes: apt update && apt upgrade -y. Instale después Docker con el script oficial: curl -fsSL https://get.docker.com | sh. Compruebe la instalación: docker --version && docker compose version. Cree el directorio de trabajo: mkdir -p /opt/n8n && cd /opt/n8n.

  2. Crear el archivo docker-compose.yaml

    Cree docker-compose.yaml con el servicio n8n, un volumen con nombre para la persistencia y las variables de entorno esenciales. Declare image: n8nio/n8n:latest, restart: unless-stopped, y monte n8n_data:/home/node/.n8n. Exponga únicamente en 127.0.0.1:5678:5678 para evitar cualquier exposición pública directa del puerto.

  3. Fijar las variables de entorno críticas

    En la sección environment del servicio, declare como mínimo: N8N_HOST=n8n.su-dominio.com, N8N_WEBHOOK_URL=https://n8n.su-dominio.com/ y N8N_PROXY_HOPS=1. El acceso no se configura con una variable: la autenticación básica se retiró de n8n 1.0, y es la gestión de usuarios integrada la que protege la instancia — en el primer arranque, usted crea la cuenta de propietario. Para producción, guarde estos valores en un archivo .env adyacente y refiéralo con env_file: .env.

  4. Arrancar el contenedor

    Lance: docker compose up -d. Compruebe que el contenedor funciona: docker compose ps. Consulte los logs: docker compose logs -f n8n. n8n está listo cuando aparece en los logs la línea Editor is now accessible via: http://localhost:5678/.

  5. Configurar el reverse proxy con Caddy (recomendado)

    Caddy es el reverse proxy más sencillo para n8n: gestiona el certificado Let's Encrypt y su renovación sin configuración adicional. Instale Caddy (apt install caddy) y edite /etc/caddy/Caddyfile para añadir: n8n.su-dominio.com { reverse_proxy localhost:5678 }. Recargue: systemctl reload caddy. Con nginx, añada en su bloque location: proxy_set_header X-Forwarded-Host $host;, proxy_set_header X-Forwarded-Proto $scheme; y proxy_set_header X-Real-IP $remote_addr;.

  6. Comprobar los webhooks entrantes

    En el editor de n8n, cree un workflow de prueba con un node Webhook. La URL mostrada en modo producción debe ser exactamente https://n8n.su-dominio.com/webhook/<su-ruta>. Dispare la llamada desde su máquina local: curl -X POST https://n8n.su-dominio.com/webhook/test -d '{}'. Si la URL mostrada contiene localhost o el puerto 5678, la variable N8N_WEBHOOK_URL no se tiene en cuenta.

  7. Conectar PostgreSQL para producción

    SQLite sirve para probar; en producción, prefiera PostgreSQL. Añada un servicio postgres:15 al mismo docker-compose.yaml, con un volumen dedicado pg_data. En el servicio n8n, añada: DB_TYPE=postgresdb, DB_POSTGRESDB_HOST=postgres, DB_POSTGRESDB_DATABASE=n8n, DB_POSTGRESDB_USER=n8n, DB_POSTGRESDB_PASSWORD=<contraseña>. Reinicie el conjunto: docker compose up -d.

Endurecimiento y modo queue

Tres reflejos de producción: (1) No exponer nunca el puerto 5678 en la interfaz pública — mantenga el enlace 127.0.0.1:5678. (2) Cree la cuenta de propietario en el primer arranque: la autenticación básica se retiró de n8n 1.0, la gestión de usuarios integrada protege la instancia y el primer visitante se convierte en su propietario. (3) Para workflows de IA o de larga duración, pase al modo queue con una instancia worker separada y una cola Redis.

Su VPS para n8n

ServOrbit ofrece VPS Linux con acceso root, IPv4 dedicada y SSD, listos para alojar Docker y n8n sin configuración adicional. Consulte la página de desarrolladores para elegir la configuración adecuada a sus workflows.