Self-hostear n8n en un VPS de 6 € : Docker + Caddy con SSL automático en ~10 minutos (guía + los 4 errores que comete todo el mundo)

Hola a todos :waving_hand:

Llevo la infraestructura de una pequeña empresa de hosting española (PulsarHost — lo aclaro por delante), y después de ayudar a bastantes clientes a migrar de n8n Cloud a self-hosted, he escrito el setup que recomendamos. Comparto aquí la receta completa porque los mismos 4 errores aparecen una y otra vez.

El stack: n8n + Caddy como reverse proxy. Caddy obtiene y renueva el certificado de Let’s Encrypt automáticamente — cero configuración SSL, para siempre.

Requisitos previos: un VPS con Ubuntu/Debian (con 1 vCPU / 2 GB de RAM basta para empezar), un subdominio con registro A apuntando al servidor, y acceso SSH.

1 — Instalar Docker

curl -fsSL https://get.docker.com | sh

2 — ~/n8n/compose.yaml

services:
  n8n:
    image: docker.n8n.io/n8nio/n8n
    restart: unless-stopped
    environment:
      - N8N_HOST=n8n.tudominio.com
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://n8n.tudominio.com/
      - GENERIC_TIMEZONE=Europe/Madrid
      - TZ=Europe/Madrid
    volumes:
      - n8n_data:/home/node/.n8n

  caddy:
    image: caddy:2
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data

volumes:
  n8n_data:
  caddy_data:

3 — ~/n8n/Caddyfile

n8n.tudominio.com {
    reverse_proxy n8n:5678
}

4 — Arrancar

cd ~/n8n && docker compose up -d

Abre https://n8n.tudominio.com, crea la cuenta de propietario, y listo.

Los 4 errores que comete todo el mundo

  1. Los webhooks muestran localhost:5678 → has quitado WEBHOOK_URL. Está en el compose de arriba por algo.
  2. Los Schedule Triggers se disparan a horas raras → sin GENERIC_TIMEZONE, los crons corren en UTC y tu “todos los días a las 9” se desplaza con el cambio de hora.
  3. El contenedor muere por OOM al mover ficheros → n8n carga los datos binarios en RAM por defecto. Añade N8N_DEFAULT_BINARY_DATA_MODE=filesystem si tus workflows tocan ficheros.
  4. Exponer el puerto 5678 directamente → siempre detrás del proxy con TLS. Firewall: 80, 443 y tu puerto SSH, nada más.

Notas de dimensionado (de uso real)

  • n8n en reposo consume ~300-500 MB de RAM. Con 2 GB en total vas sobrado para uso personal / docenas de workflows ligeros.
  • 2 vCPU / 4-6 GB es el punto dulce para producción con webhooks constantes + community nodes.
  • SQLite (el que viene por defecto) aguanta miles de ejecuciones al día en un solo nodo — no corras a Postgres hasta que necesites queue mode o varios editores.
  • El mantenimiento son de verdad ~15 min/mes: docker compose pull && docker compose up -d + revisar tu backup semanal del volumen n8n_data.

Escribí una versión más larga de esta guía con la comparativa de costes completa frente a n8n Cloud (el modelo de ejecuciones, dónde saltan los planes, TCO a 12 meses) y una tabla de dimensionado de RAM por escenario: Self-hostear n8n en un VPS: guía completa y precios (2026) — PulsarHost

Encantado de responder dudas sobre cualquier parte — sobre todo del reverse proxy y la memoria, que es donde se rompen la mayoría de los setups.