En esta lección configuraremos un clúster local de n8n con base de datos PostgreSQL.
Por defecto, n8n utiliza SQLite para almacenar ejecuciones y configuraciones. Si bien SQLite es excelente para pruebas rápidas de cinco minutos, en un entorno de producción o de alto tráfico genera bloqueos de base de datos (database is locked) y degrada severamente el rendimiento.
La Arquitectura del Servicio
Montaremos dos contenedores interconectados en una red puente (bridge):
- postgres: Base de datos dedicada para las credenciales, workflows e historial de ejecuciones de n8n.
- n8n: El motor de ejecución, configurado con variables de entorno que apuntan al contenedor PostgreSQL.
Los secretos no van dentro del docker-compose.yml: el archivo los lee de un .env que vive junto a él y que nunca se sube a Git. Descarga el compose y, justo debajo, crea el .env.
Base para entorno local y punto de partida para un VPS: secretos en .env, versión de n8n fijada y puerto publicado solo en loopback.
Tres decisiones de seguridad de este template:
- Puerto en loopback:
127.0.0.1:5678:5678hace que n8n solo responda desde tu propia máquina. Con"5678:5678"Docker lo publicaría por HTTP en todas las interfaces, y en un VPS esas reglas de Docker se saltanufw. - Versión fijada:
N8N_VERSIONevita que undocker compose pullte actualice a una versión sin validar. Usa la que probaste, tomada de las notas de versión de n8n, y actualízala de forma deliberada. N8N_ENCRYPTION_KEYexplícita: es la clave que cifra las credenciales guardadas en n8n. Si no la defines, n8n genera una y la deja solo dentro del volumenn8n_data.
El archivo .env
Crea un archivo .env en el mismo directorio que el compose. Genera los secretos con openssl y reemplaza los placeholders:
POSTGRES_USER=n8n_user
POSTGRES_DB=n8n_db
# Genera con: openssl rand -hex 32
POSTGRES_PASSWORD=reemplaza-por-un-secreto-generado
# Genera con: openssl rand -hex 32
N8N_ENCRYPTION_KEY=reemplaza-por-otra-clave-generada
# Pon la versión de n8n que validaste (notas de versión de n8n)
N8N_VERSION=reemplaza-por-la-version-validada
Para generar cada secreto, ejecuta openssl rand -hex 32 y pega el resultado en su variable. Usa un valor distinto para cada una.
Añade .env a tu .gitignore antes de tu primer commit. Guarda una copia de N8N_ENCRYPTION_KEY en un gestor de contraseñas: si la pierdes, n8n no podrá descifrar las credenciales almacenadas y tendrás que volver a crearlas todas.
Comandos de Puesta en Marcha
Crea un directorio de trabajo y levanta los servicios en segundo plano con Docker Compose:
# 1. Crear directorio del proyecto
mkdir n8n-workspace && cd n8n-workspace
# 2. Guardar docker-compose.n8n.yml junto al .env, validar y levantar
docker compose -f docker-compose.n8n.yml config --quiet
docker compose -f docker-compose.n8n.yml up -d
# 3. Comprobar el estado y logs de los servicios
docker compose -f docker-compose.n8n.yml ps
docker compose -f docker-compose.n8n.yml logs -f n8n
Una vez que los logs indiquen Editor is now accessible via: http://localhost:5678, abre tu navegador en http://localhost:5678.
Mantén el puerto 5678 en loopback y publica n8n a través de un proxy inverso con TLS (Caddy, Nginx o Traefik). Define N8N_HOST, N8N_PROTOCOL=https y WEBHOOK_URL con tu dominio, y no desactives N8N_SECURE_COOKIE. Este template es un punto de partida: antes de exponerlo, añade también copias de seguridad de PostgreSQL y de la clave de cifrado.
Observa las variables EXECUTIONS_DATA_PRUNE=true y EXECUTIONS_DATA_MAX_AGE=168 (7 días). En producción, si no configuras la poda automática, la tabla de ejecuciones de PostgreSQL crecerá gigabytes en pocas semanas y saturará el disco del servidor.
Checklist de Validación Práctica
Puesta en marcha del laboratorio local
Completa cada verificación técnica en tu terminal:
Validación Teórica
¿Por qué se utiliza la directiva condition: service_healthy en depends_on dentro de docker-compose?
¿Cómo valoras el contenido técnico de esta lección?
Tu feedback nos ayuda a mejorar los laboratorios prácticos de Eje Z.