Configuración de Docker Compose para n8n Workflow Automation + PostgreSQL
Cuándo usar esta combinación
Utiliza esta arquitectura cuando lleves n8n a entornos de producción o staging con flujos de trabajo críticos. Por defecto, n8n utiliza SQLite, lo que genera cuellos de botella por bloqueos de base de datos (database is locked) bajo concurrencia moderada. PostgreSQL desacopla la capa de persistencia, permitiendo alta concurrencia, retención masiva de logs de ejecución, escalabilidad horizontal (modo queue con Redis a futuro), transaccionalidad robusta y respaldos consistentes en caliente mediante herramientas estándar (pg_dump, WAL archiving).
Configuración docker-compose.yml
version: '3.8'
networks:
n8n-internal:
driver: bridge
volumes:
postgres_data:
n8n_data:
services:
postgres:
image: postgres:16-alpine
container_name: n8n_postgres
restart: unless-stopped
environment:
POSTGRES_USER: n8n_user
POSTGRES_PASSWORD: ChangeMeSuperSecurePassword123!
POSTGRES_DB: n8n_db
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- n8n-internal
healthcheck:
test: ["CMD-SHELL", "pg_isready -U n8n_user -d n8n_db"]
interval: 5s
timeout: 5s
retries: 5
n8n:
image: docker.n8n.io/n8nio/n8n:latest
container_name: n8n_app
restart: unless-stopped
ports:
- "127.0.0.1:5678:5678"
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n_db
- DB_POSTGRESDB_USER=n8n_user
- DB_POSTGRESDB_PASSWORD=ChangeMeSuperSecurePassword123!
- N8N_ENCRYPTION_KEY=CHANGE_ME_GENERATE_32_HEX_STRING
- WEBHOOK_URL=https://n8n.tudominio.com/
- EXECUTIONS_DATA_PRUNE=true
- EXECUTIONS_DATA_MAX_AGE=168
- N8N_DEFAULT_BINARY_DATA_MODE=filesystem
volumes:
- n8n_data:/home/node/.n8n
networks:
- n8n-internal
depends_on:
postgres:
condition: service_healthy
Variables de Entorno Críticas para Producción
N8N_ENCRYPTION_KEY: Clave criptográfica para cifrar todas las credenciales almacenadas (API Keys, OAuth tokens, passwords). Si se pierde o se altera tras el despliegue inicial, todas las credenciales guardadas serán irrecuperables.POSTGRES_PASSWORD/DB_POSTGRESDB_PASSWORD: Contraseña de acceso a la base de datos PostgreSQL. Debe ser robusta (mínimo 24 caracteres alfanuméricos y símbolos).WEBHOOK_URL: URL pública canónica bajo HTTPS (ej.https://n8n.example.com/). Si no se define correctamente, los webhooks y callbacks de autenticación OAuth2 fallarán al registrar endpoints internos o URLs conlocalhost.
Consejo de Seguridad y Rendimiento
- Rendimiento (Pruning de ejecuciones): Habilita siempre
EXECUTIONS_DATA_PRUNE=truejunto conEXECUTIONS_DATA_MAX_AGE(ej. 168 horas / 7 días). Sin esto, la tablaexecution_entityen PostgreSQL acumula millones de filas rápidamente, degradando el I/O del disco y colapsando el tamaño de los backups. - Seguridad de Red: No expongas el puerto de PostgreSQL (
5432) al exterior y enlaza el puerto de n8n exclusivamente a la interfaz local (127.0.0.1:5678), forzando el tráfico a través de un Reverse Proxy (Traefik, Nginx o Caddy) con terminación TLS y políticas de rate limiting.
Checklist de Seguridad antes de desplegar
- Cambiar las contraseñas por defecto en el archivo .env
- Mapear volúmenes persistentes en el VPS
- Configurar las reglas de firewall para los puertos requeridos