n8n con Docker Compose en Producción: Setup Completo con Nginx y SSL

N8n con Docker Compose producción es uno de los usos más prácticos de n8n. Usar n8n con Docker Compose en producción es la forma más robusta y mantenible de desplegar tu instancia self-hosted. En esta guía configuramos PostgreSQL como base de datos, Nginx como proxy inverso, SSL automático y backups programados.

Por qué usar Docker Compose para n8n en producción

Docker Compose te permite definir toda la infraestructura en un solo archivo. Ventajas clave:

  • Reproducibilidad: el mismo archivo funciona en cualquier servidor
  • Fácil actualización: un comando actualiza todos los servicios
  • Aislamiento: n8n corre en su propio contenedor sin afectar el sistema
  • PostgreSQL incluido: mucho más estable que SQLite para uso intensivo

Arquitectura del setup

Para un despliegue de producción sólido necesitas cuatro piezas:

  • n8n — el motor de automatización
  • PostgreSQL — base de datos persistente
  • Nginx — proxy inverso con terminación SSL
  • Certbot — certificados Let's Encrypt gratuitos

docker-compose.yml completo

Crea /opt/n8n/docker-compose.yml con este contenido:

version: "3.8"

services:
  postgres:
    image: postgres:15
    restart: always
    environment:
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: n8n
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n8n"]
      interval: 10s
      retries: 5

  n8n:
    image: n8nio/n8n
    restart: always
    depends_on:
      postgres:
        condition: service_healthy
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_DATABASE=n8n
      - DB_POSTGRESDB_USER=n8n
      - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
      - N8N_HOST=${DOMAIN}
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://${DOMAIN}/
      - GENERIC_TIMEZONE=Europe/Madrid
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
    volumes:
      - n8n_data:/home/node/.n8n

volumes:
  postgres_data:
  n8n_data:

Archivo .env con variables seguras

Nunca escribas contraseñas directamente en el compose. Crea /opt/n8n/.env:

DOMAIN=n8n.tudominio.com
POSTGRES_PASSWORD=password_muy_segura
N8N_ENCRYPTION_KEY=clave_aleatoria_32_caracteres

Genera claves seguras con:

openssl rand -hex 32

Configuración de Nginx con WebSockets

n8n con Docker Compose en producción requiere soporte de WebSockets en Nginx para que la interfaz funcione en tiempo real:

server {
    server_name n8n.tudominio.com;

    location / {
        proxy_pass http://127.0.0.1:5678;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 300s;
    }
}

Activa SSL automáticamente:

certbot --nginx -d n8n.tudominio.com

Arrancar y verificar el stack

cd /opt/n8n
docker compose up -d
docker compose ps       # todos deben estar "healthy"
docker compose logs -f n8n

Actualizar sin downtime

docker compose pull
docker compose up -d --no-deps n8n

Descarga la nueva imagen y reinicia solo n8n, sin tocar la base de datos.

Backup automático de PostgreSQL

#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
docker compose -f /opt/n8n/docker-compose.yml exec -T postgres \
  pg_dump -U n8n n8n > /backups/n8n_$DATE.sql
find /backups -name "*.sql" -mtime +7 -delete

Programa el script en cron:

0 3 * * * /opt/n8n/backup.sh

Conclusión

Un setup de n8n con Docker Compose en producción con PostgreSQL + Nginx + SSL es el estándar para proyectos serios. Dedica una hora a configurarlo correctamente desde el principio y tendrás una plataforma estable, actualizable y con backups automáticos que funcionará sin problemas durante años.