Hola a todos ![]()
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
- Los webhooks muestran
localhost:5678→ has quitadoWEBHOOK_URL. Está en el compose de arriba por algo. - 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. - El contenedor muere por OOM al mover ficheros → n8n carga los datos binarios en RAM por defecto. Añade
N8N_DEFAULT_BINARY_DATA_MODE=filesystemsi tus workflows tocan ficheros. - 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 volumenn8n_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.