|

Instalar n8n con Docker: guía paso a paso

Si querés instalar n8n con Docker, el comando base es docker run -it --rm -p 5678:5678 n8nio/n8n, que te levanta una instancia en localhost:5678 en menos de dos minutos. Para producción, el camino correcto es Docker Compose con volúmenes persistentes, variables de entorno y un reverse proxy con SSL.

En 30 segundos

  • n8n corre oficialmente en Docker desde la imagen n8nio/n8n en Docker Hub, con soporte para SQLite (desarrollo) y PostgreSQL (producción).
  • El método recomendado para producción es Docker Compose con volúmenes nombrados para que los datos sobrevivan reinicios.
  • La variable N8N_ENCRYPTION_KEY es crítica: si la perdés, perdés el acceso a todas las credenciales guardadas.
  • Para webhooks funcionando desde internet, necesitás configurar WEBHOOK_URL con tu dominio real, no localhost.
  • Los errores EACCES en el volumen son el problema más común y tienen solución simple: cambiar el propietario del directorio.

¿Por qué n8n con Docker? Ventajas y cuándo usarlo

n8n es una plataforma de automatización de workflows de código abierto que te permite conectar aplicaciones, APIs y servicios sin escribir demasiado código. Tiene más de 400 integraciones nativas y soporta lógica condicional, bucles, transformación de datos y ejecución de código JavaScript o Python directamente en los nodos.

Docker es la forma recomendada de instalarlo porque te da aislamiento real: n8n corre en su propio contenedor sin interferir con el resto del sistema. Actualizás a una versión nueva cambiando un número en el docker-compose.yml y haciendo docker compose pull. Si algo sale mal, volvés atrás igual de fácil. Instalarlo directamente sobre Node.js requiere gestionar versiones de Node, dependencias globales y conflictos con otros proyectos. Sin aislamiento, eventualmente todo se rompe de una manera que cuesta horas diagnosticar.

¿Cuándo no usar Docker? Si estás en Windows sin WSL2 y no querés lidiar con la configuración inicial, o si necesitás integraciones muy específicas con el sistema de archivos local. En esos casos la instalación directa vía npm zafa, pero para cualquier cosa en un servidor, Docker.

Requisitos previos: Docker y Docker Compose

Necesitás Docker Engine 27.x o superior y Docker Compose v2 (el que usa docker compose en vez de docker-compose). En Linux instalás con el script oficial o vía apt/yum. En Windows y Mac, Docker Desktop incluye ambos.

En Windows, activá WSL2 antes de instalar Docker Desktop. Sin WSL2, Docker corre sobre Hyper-V y el rendimiento de I/O en volúmenes es notablemente peor, lo que se nota cuando n8n escribe la base de datos SQLite constantemente. Lo explicamos a fondo en guía completa de automatización con n8n.

Verificá que todo está en orden:

docker --version # Docker version 27.x o superior
docker compose version # Docker Compose version v2.x

Si docker compose da error pero docker-compose funciona, estás en la versión v1 (obsoleta). Actualizá.

Instalación rápida: instalar n8n con Docker en 5 minutos

Para probarlo rápido, un solo comando:

docker run -it --rm -p 5678:5678 n8nio/n8n

Abrís http://localhost:5678, configurás el usuario administrador y ya estás dentro. El flag --rm borra el contenedor cuando lo cerrás. Eso significa que todos los workflows que creás desaparecen. Sirve para conocer la interfaz, nada más.

Para conservar los datos entre reinicios sin pasar todavía a Docker Compose:

docker run -d \
 --name n8n \
 -p 5678:5678 \
 -v n8n_data:/home/node/.n8n \
 n8nio/n8n

El volumen nombrado n8n_data persiste los datos. El flag -d lo corre en background. Eso sí, para producción real necesitás más que esto.

Configuración profesional con Docker Compose

Primero, la estructura de directorios:

mkdir -p ~/n8n && cd ~/n8n

Creás dos archivos: .env con las variables sensibles y docker-compose.yml con la configuración de servicios.

El .env mínimo:

N8N_ENCRYPTION_KEY=una-clave-aleatoria-larga-y-unica
N8N_HOST=tudominio.com
N8N_PORT=5678
N8N_PROTOCOL=https
WEBHOOK_URL=https://tudominio.com
TZ=America/Argentina/Buenos_Aires

Y el docker-compose.yml con SQLite (suficiente para cargas medias):

version: "3.8"

services:
 n8n:
 image: n8nio/n8n:latest
 restart: unless-stopped
 ports:
 - "5678:5678"
 env_file:
 - .env
 volumes:
 - n8n_data:/home/node/.n8n

volumes:
 n8n_data:

Levantás con:

docker compose up -d

Para producción con PostgreSQL (recomendado si tenés más de 50 workflows o ejecuciones frecuentes), el compose se extiende para incluir un servicio de base de datos. PostgreSQL maneja concurrencia mejor que SQLite cuando varios workflows corren en paralelo (spoiler: SQLite con muchas ejecuciones simultáneas empieza a mostrar errores de “database is locked”).

Variables de entorno críticas para producción

VariableQué haceValor recomendado
N8N_ENCRYPTION_KEYCifra las credenciales almacenadas (OAuth tokens, API keys). Sin esto, se generan automáticamente pero cambian al reiniciar.String aleatorio de 32+ caracteres. Generá con openssl rand -base64 32
N8N_HOSTHostname para la UI y para construir URLs internasTu dominio sin protocolo: n8n.miempresa.com
WEBHOOK_URLURL base que n8n usa para registrar webhooks en servicios externoshttps://n8n.miempresa.com
N8N_PROTOCOLhttp o https para la URL de la UIhttps en producción
N8N_PROXY_HOPSCuántos proxies hay delante de n8n (para leer la IP real del cliente)1 si usás Nginx o Traefik
DB_TYPETipo de base de datospostgresdb para PostgreSQL, omitir para SQLite
DB_POSTGRESDB_HOSTHost del servidor PostgreSQLpostgres (nombre del servicio en compose)
TZTimezone para los cron triggers y logsAmerica/Argentina/Buenos_Aires
N8N_BASIC_AUTH_ACTIVEActiva autenticación básica HTTP (útil antes de tener SSL)true con usuario y password
instalar n8n con docker diagrama explicativo

La N8N_ENCRYPTION_KEY merece un párrafo aparte. Si la perdés o cambiás, todas las credenciales guardadas en n8n quedan ilegibles. No podés recuperarlas. Tenés que volver a configurar cada integración manualmente. Guardala en un gestor de contraseñas o en tu vault de secretos, no solo en el .env del servidor. Relacionado: analizar costos según tu escala.

Persistencia de datos: volúmenes y base de datos

El directorio crítico dentro del contenedor es /home/node/.n8n. Ahí van los workflows, credenciales cifradas, la base de datos SQLite y la configuración. Si no montás un volumen sobre ese path, al parar el contenedor perdés todo.

Dos opciones para el volumen:

  • Volumen nombrado (n8n_data:/home/node/.n8n): Docker gestiona dónde guarda los datos en el host. Más fácil, menos control. Para hacer backup: docker run --rm -v n8n_data:/data -v $(pwd):/backup ubuntu tar czf /backup/n8n_backup.tar.gz /data
  • Bind mount (./n8n_data:/home/node/.n8n): vos elegís la carpeta en el host. Más fácil de hacer backup y migrar. El problema: los permisos (el usuario node dentro del contenedor tiene UID 1000, y si la carpeta en el host pertenece a root, empiezan los errores EACCES).

Para migrar a otra máquina, copiás el volumen o la carpeta, movés el .env (con la misma N8N_ENCRYPTION_KEY), levantás el compose y n8n arranca con todos los workflows y credenciales intactos. Con la misma clave de cifrado, digo (si la cambiás, recordá lo del párrafo anterior).

Seguridad en producción: SSL/HTTPS y reverse proxy

n8n no maneja SSL por sí solo en producción. Lo estándar es ponerle un reverse proxy adelante.

Traefik con Let’s Encrypt (la opción más cómoda)

Traefik renueva los certificados automáticamente y se configura via labels en el docker-compose.yml. Si ya tenés varios servicios en el servidor, es el camino recomendado según la documentación oficial de n8n. El certificado se emite la primera vez que el dominio recibe tráfico y se renueva solo.

Nginx con Certbot (más control, más pasos)

Si preferís Nginx, el proxy pass básico al puerto 5678 funciona, pero necesitás agregar los headers para WebSockets (n8n los usa para actualizaciones en tiempo real en la UI). Sin esos headers, la interfaz se ve estática y los cambios no se reflejan sin recargar.

Los headers críticos para Nginx:

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;

En ambos casos, configurá N8N_PROTOCOL=https y WEBHOOK_URL=https://tudominio.com en el .env. Si n8n cree que corre en http cuando en realidad llega tráfico https a través del proxy, los webhooks van a generar URLs con el protocolo equivocado y van a fallar.

Solución de problemas comunes en n8n Docker

Error EACCES: permission denied

El síntoma: el contenedor arranca y muere inmediatamente. Los logs muestran algo como EACCES: permission denied, mkdir '/home/node/.n8n'. Tema relacionado: errores comunes en producción.

La causa: si usás bind mount y la carpeta la creaste como root (o con otro usuario), el proceso de n8n que corre como usuario node (UID 1000) no puede escribir ahí. La solución:

sudo chown -R 1000:1000 ./n8n_data

Si usás volúmenes nombrados en vez de bind mounts, este problema no aparece.

Webhooks apuntan a localhost

Creás un webhook trigger en n8n y la URL que te muestra es http://localhost:5678/webhook/.... Los servicios externos no pueden llegar a tu localhost.

¿La causa? No configuraste WEBHOOK_URL. Con esa variable seteada al dominio público, n8n genera URLs correctas. Sin ella, usa el hostname del contenedor.

Puerto 5678 ocupado

Si docker compose up falla con “port is already allocated”, otro proceso usa el 5678. Para encontrarlo: sudo ss -tlnp | grep 5678 en Linux o netstat -ano | findstr 5678 en Windows. Cambiá el mapeo de puerto en el compose ("5679:5678") si no podés liberar el puerto.

Comandos útiles para diagnosticar

# Ver logs en tiempo real
docker compose logs -f n8n

# Ver estado de los contenedores
docker compose ps

# Entrar al contenedor para inspeccionar
docker compose exec n8n sh

# Reiniciar solo n8n sin bajar la base de datos
docker compose restart n8n

Errores comunes al instalar n8n con Docker

Usar :latest sin fijarse la versión. La imagen n8nio/n8n:latest está bien para empezar, pero en producción conviene fijar la versión (n8nio/n8n:1.x.x). n8n tiene actualizaciones frecuentes y alguna migración de base de datos rompió setups en el pasado. Con versión fija, controlás cuándo actualizás.

Para profundizar en esto, mirá Need help to setup n8n through Docker.

Si querés profundizar, acá tenemos un artículo sobre Need help to setup n8n through Docker.

No hacer backup antes de actualizar. Antes de docker compose pull && docker compose up -d, copiá el volumen. Las migraciones de base de datos son en general limpias, pero “en general” no es suficiente cuando corrés workflows de producción. Cubrimos ese tema en detalle en workflows avanzados de enriquecimiento.

Omitir restart: unless-stopped. Sin esta directiva, si el servidor se reinicia, n8n no arranca automáticamente. Los workflows dejan de ejecutarse y lo notás recién cuando alguien se queja de que un proceso no corrió. Una línea en el compose lo previene.

Exponer el puerto 5678 directamente a internet. Si el servidor tiene IP pública y el firewall permite el 5678, cualquiera puede acceder a tu n8n. Poné un reverse proxy adelante, cerrá el puerto en el firewall y exponé solo el 443. Si necesitás hosting con buena conectividad para tu servidor n8n, donweb.com tiene VPS con IPs en Argentina.

Preguntas Frecuentes

¿Cómo instalo n8n en Docker desde cero en Linux?

Instalás Docker Engine y Docker Compose v2, creás un directorio con un archivo docker-compose.yml y un .env con las variables mínimas (N8N_ENCRYPTION_KEY, WEBHOOK_URL, TZ), y corrés docker compose up -d. n8n queda disponible en el puerto 5678. El proceso completo toma menos de 10 minutos si Docker ya está instalado.

¿Cuál es la diferencia entre docker run y Docker Compose para n8n?

docker run es un comando único para levantar un contenedor rápido, útil para probar. Docker Compose define la configuración en un archivo YAML que podés versionar y reproducir en cualquier servidor. Para n8n en producción, Docker Compose es el estándar porque permite definir variables de entorno, volúmenes, red y políticas de reinicio en un solo lugar.

¿Cómo evito que se pierdan mis datos en n8n Docker al reiniciar?

Montando un volumen sobre /home/node/.n8n. Con un volumen nombrado en el compose (n8n_data:/home/node/.n8n), los datos persisten aunque el contenedor se detenga o borre. Si no montás ese volumen, los workflows y credenciales desaparecen al reiniciar.

¿Cómo configuro HTTPS/SSL en n8n con Docker?

La forma recomendada es un reverse proxy (Traefik o Nginx) adelante del contenedor de n8n, con certificados de Let’s Encrypt. n8n no maneja SSL directamente en producción. Configurás N8N_PROTOCOL=https y WEBHOOK_URL=https://tudominio.com para que la aplicación genere URLs correctas, y el SSL lo termina el proxy.

¿Cómo arreglo el error EACCES en n8n Docker?

El error EACCES aparece cuando el usuario del contenedor (UID 1000) no tiene permisos sobre el directorio montado. La solución es cambiar el propietario del directorio en el host: sudo chown -R 1000:1000 ./n8n_data. Si usás volúmenes nombrados en vez de bind mounts, Docker maneja los permisos automáticamente y el error no aparece.

Conclusión

Instalar n8n con Docker es directo cuando entendés las tres cosas que importan: el volumen (sin él perdés todo), la N8N_ENCRYPTION_KEY (sin ella perdés las credenciales) y la WEBHOOK_URL (sin ella los webhooks no funcionan desde internet). El resto son detalles que se ajustan según el caso.

Para un setup de desarrollo, un docker run con volumen alcanza. Para producción, Docker Compose con PostgreSQL, un reverse proxy con SSL y un script de backup automático es el mínimo razonable. n8n tiene versiones activas y documentación actualizada, así que si algo cambió entre que escribí esto y que lo estás leyendo, la documentación oficial de instalación con Docker es la primera fuente.

Fuentes

Similar Posts