Contenido

Tutorial de autoalojamiento de n8n: Docker Compose, PostgreSQL y HTTPS

Después de comprobar que todo funciona en tu propio ordenador, necesitarás implementar n8n en un servidor con una dirección fija para mantener tus flujos de trabajo en funcionamiento las 24 horas y permitir que servicios externos, como Webhook y Telegram, se conecten.

Requisitos

  • Un servidor Linux en la nube (VPS). Para un uso ligero bastan 1 o 2 núcleos y 2 GB de memoria; necesitarás más si tienes muchos flujos de trabajo o quieres ejecutar modelos de IA localmente.
  • Un dominio y un registro DNS A para un subdominio (por ejemplo, n8n.example.com) que apunte a la dirección IP del servidor.
  • Docker y Docker Compose instalados en el servidor (consulta Tutorial de Docker: instalación).
  • Los puertos 80 y 443 abiertos en el firewall.

Arquitectura

Internet ──HTTPS──▶ Caddy (certificado automático) ──▶ n8n:5678 ──▶ PostgreSQL
  • Caddy: proxy inverso que solicita y renueva automáticamente los certificados de Let's Encrypt
  • PostgreSQL: base de datos recomendada para producción (SQLite, la opción predeterminada, sirve para uso personal o pruebas)
  • Ni n8n ni la base de datos quedan expuestos directamente a Internet

A partir de n8n 2.x, MySQL y MariaDB ya no son compatibles como bases de datos de n8n. Usa PostgreSQL o SQLite.

Archivos

Crea el directorio /opt/n8n en el servidor:

/opt/n8n/
├── compose.yaml
├── .env
└── Caddyfile

.env

DOMAIN=n8n.example.com
POSTGRES_PASSWORD=Reemplaza por una contraseña aleatoria y muy larga
N8N_ENCRYPTION_KEY=Reemplaza por otra cadena aleatoria y muy larga

Genera una cadena aleatoria:

openssl rand -hex 32

N8N_ENCRYPTION_KEY cifra todas las credenciales. Haz una copia de seguridad en otro lugar; si la pierdes, no podrás usar ninguna credencial.

Caddyfile

{$DOMAIN} {
    reverse_proxy n8n:5678
}

compose.yaml

services:
  caddy:
    image: caddy:2
    ports:
      - "80:80"
      - "443:443"
    environment:
      DOMAIN: ${DOMAIN}
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
    restart: unless-stopped

  postgres:
    image: postgres:17
    environment:
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: n8n
    volumes:
      - pg_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n8n -d n8n"]
      interval: 5s
      retries: 10
    restart: unless-stopped

  n8n:
    image: n8nio/n8n:2.42.7   # Cambia a la versión fija que quieras usar
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_PORT: 5432
      DB_POSTGRESDB_DATABASE: n8n
      DB_POSTGRESDB_USER: n8n
      DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
      N8N_HOST: ${DOMAIN}
      N8N_PORT: 5678
      N8N_PROTOCOL: https
      N8N_WEBHOOK_URL: https://${DOMAIN}/
      N8N_PROXY_HOPS: 1
      NODE_ENV: production
      GENERIC_TIMEZONE: Asia/Taipei
      TZ: Asia/Taipei
      N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
      EXECUTIONS_DATA_PRUNE: "true"
      EXECUTIONS_DATA_MAX_AGE: 336
    volumes:
      - n8n_data:/home/node/.n8n
    depends_on:
      postgres:
        condition: service_healthy
    restart: unless-stopped

volumes:
  caddy_data:
  pg_data:
  n8n_data:

Explicación de las variables de entorno importantes

VariableDescripción
N8N_HOST, N8N_PROTOCOLDominio y protocolo externos; afectan, entre otras cosas, a las URL de retorno de OAuth
N8N_WEBHOOK_URLURL externa de Webhook. Si no la configuras, el nodo Webhook mostrará http://localhost:5678/.... En versiones anteriores a n8n 2.30, usa WEBHOOK_URL
N8N_PROXY_HOPSConfigúralo en 1 si n8n está detrás de un proxy inverso para que pueda obtener la IP real del usuario
N8N_ENCRYPTION_KEYClave de cifrado de credenciales
GENERIC_TIMEZONEZona horaria que usan las programaciones
EXECUTIONS_DATA_PRUNE, EXECUTIONS_DATA_MAX_AGEElimina automáticamente los registros de ejecución que superen el límite indicado (336 horas = 14 días) para evitar que la base de datos crezca sin límite

Inicio

cd /opt/n8n
docker compose up -d
docker compose logs -f n8n

En unos minutos, Caddy obtendrá el certificado automáticamente. Abre https://n8n.example.com y crea la cuenta de propietario.

Crea la cuenta de inmediato. Antes de configurar la cuenta de propietario, cualquier persona que visite esta dirección puede adelantarse y crear una cuenta.

Recomendaciones de seguridad

  • Usa una etiqueta de imagen con una versión fija, no latest, y lee las notas de la versión antes de actualizar.
  • Abre solo los puertos 22, 80 y 443 en el servidor, y permite el acceso SSH únicamente con claves.
  • Activa la verificación en dos pasos para tu cuenta (en los ajustes personales).
  • En la versión 2.x, los nodos peligrosos que no necesitas (por ejemplo, los que ejecutan comandos del sistema) ya están desactivados de forma predeterminada. No los habilites sin motivo.
  • Haz copias de seguridad periódicamente (consulta Copias de seguridad y actualizaciones).

Uso de modelos de IA locales

Para que n8n use modelos locales de Ollama, puedes añadir el servicio ollama al mismo archivo compose.yaml. Consulta Conectar n8n con Ollama. Ten en cuenta que los modelos de IA necesitan mucha memoria y capacidad de cálculo; un VPS pequeño normalmente no puede ejecutarlos.

Ejecuciones a gran escala: queue mode

Si tienes muchos flujos de trabajo y se ejecutan con frecuencia, puedes activar queue mode: el proceso principal recibe los desencadenantes y los distribuye a varios workers, que los ejecutan en paralelo mediante una cola de Redis. Se trata de una implementación avanzada; consulta la explicación de queue mode en la documentación oficial.

Actualizado 12 de octubre de 2026