Cómo instalar n8n en VPS Ubuntu 22.04 — guía production 2026 (Docker + Nginx + SSL)
Instalación production-grade de n8n en Ubuntu 22.04 con stack Docker Compose + PostgreSQL + Nginx reverse proxy + Let's Encrypt SSL + backups automáticos S3/B2. Costo total mensual: USD 12-24 + tu tiempo ops 2-4h/mes. Tiempo setup: 2-4h con experiencia, 6-12h primera vez. Si no quieres DevOps: delegamos desde USD 19/mes.
Esta no es la décima guía "n8n en 5 minutos" copiada de docs oficiales. Es el playbook que usamos para instalar n8n en producción para clientes — incluye los gotchas reales que la documentación n8n.io no destaca: backups verificables, hardening Ubuntu, SSL alineado, monitoring básico.
Prerrequisitos — checklist antes de empezar
- VPS Ubuntu 22.04 LTS con 2GB RAM mínimo (DigitalOcean São Paulo USD 12 recomendado — ver guía hosting)
- Dominio propio con acceso DNS — recomendamos subdominio (ej:
n8n.tuempresa.cl) - SSH key configurada en el VPS (no password)
- Tarjeta de crédito para SMTP provider (SparkPost, AWS SES, Postmark)
- 2-6 horas dedicadas sin interrupciones
Paso 1 — Hardening básico Ubuntu
# Conectar como root inicialmente
ssh root@<tu_ip_vps>
# Crear usuario regular (NO operar como root)
adduser n8nadmin
usermod -aG sudo n8nadmin
rsync --archive --chown=n8nadmin:n8nadmin ~/.ssh /home/n8nadmin
# Disable root login + password auth
sed -i 's/^#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sed -i 's/^PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl restart ssh
# Firewall ufw — solo SSH + HTTP + HTTPS
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw --force enable
# fail2ban contra brute force
apt update && apt install -y fail2ban
systemctl enable --now fail2ban
Test login con nuevo usuario antes de cerrar sesión root:
ssh n8nadmin@<tu_ip_vps>
sudo whoami # debe retornar "root"
Paso 2 — DNS
En tu DNS provider (Cloudflare, Route53, etc):
# A record
n8n.tuempresa.cl A <ip_del_vps>
# Verificar propagación
dig n8n.tuempresa.cl +short
# Debe retornar el IP del VPS
Paso 3 — Instalar Docker + Compose
# Como n8nadmin (sudo)
curl -fsSL https://get.docker.com | sudo sh
# Agregar usuario al grupo docker (sin sudo para docker commands)
sudo usermod -aG docker $USER
newgrp docker
# Verificar
docker --version
docker compose version
# Si compose plugin falta:
sudo apt install docker-compose-plugin
Paso 4 — Crear docker-compose.yml para n8n + PostgreSQL
mkdir -p ~/n8n && cd ~/n8n
nano docker-compose.yml
Contenido:
services:
postgres:
image: postgres:15
container_name: n8n-postgres
restart: unless-stopped
environment:
POSTGRES_USER: n8n
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: n8n
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- n8n_network
n8n:
image: n8nio/n8n:latest
container_name: n8n
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_POSTGRESDB_USER: n8n
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
N8N_BASIC_AUTH_ACTIVE: "true"
N8N_BASIC_AUTH_USER: ${N8N_USER}
N8N_BASIC_AUTH_PASSWORD: ${N8N_PASSWORD}
N8N_HOST: n8n.tuempresa.cl
N8N_PROTOCOL: https
N8N_PORT: 5678
WEBHOOK_URL: https://n8n.tuempresa.cl/
GENERIC_TIMEZONE: America/Santiago
TZ: America/Santiago
volumes:
- n8n_data:/home/node/.n8n
networks:
- n8n_network
depends_on:
- postgres
volumes:
postgres_data:
n8n_data:
networks:
n8n_network:
driver: bridge
Crear archivo .env con credenciales (NO commit a Git):
cat > .env <<EOF
POSTGRES_PASSWORD=$(openssl rand -base64 32)
N8N_USER=admin
N8N_PASSWORD=$(openssl rand -base64 24)
EOF
chmod 600 .env
Levantar stack:
docker compose up -d
docker compose logs -f n8n # ver logs iniciales, esperar "Editor is now accessible"
Paso 5 — Nginx reverse proxy
sudo apt install -y nginx
sudo nano /etc/nginx/sites-available/n8n.tuempresa.cl
Config:
server {
listen 80;
server_name n8n.tuempresa.cl;
location / {
proxy_pass http://127.0.0.1:5678;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 86400;
}
client_max_body_size 50M;
}
sudo ln -s /etc/nginx/sites-available/n8n.tuempresa.cl /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Paso 6 — SSL Let's Encrypt
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d n8n.tuempresa.cl
# Cuando pregunte, seleccionar "Redirect HTTP to HTTPS"
# Auto-renovación
sudo systemctl status certbot.timer
# Debe estar "active (waiting)"
Acceder al editor: https://n8n.tuempresa.cl → login con basic auth (user/password del .env).
Paso 7 — Configurar backups automáticos
Script /usr/local/bin/n8n-backup.sh:
#!/bin/bash
DATE=$(date +%Y%m%d-%H%M)
BACKUP_DIR="/tmp/n8n-backup-$DATE"
mkdir -p "$BACKUP_DIR"
# PostgreSQL dump
docker exec n8n-postgres pg_dump -U n8n n8n | gzip > "$BACKUP_DIR/n8n-db.sql.gz"
# n8n data volume (workflows, credentials, settings)
docker run --rm \
-v n8n_n8n_data:/data \
-v "$BACKUP_DIR":/backup \
alpine tar czf /backup/n8n-data.tar.gz -C /data .
# Upload a B2 (rclone configurado previamente)
rclone copy "$BACKUP_DIR/" b2:n8n-backups/$DATE/
# Cleanup local + remote viejos
rm -rf "$BACKUP_DIR"
rclone delete --min-age 90d b2:n8n-backups/
sudo chmod +x /usr/local/bin/n8n-backup.sh
sudo crontab -e
# Agregar:
0 3 * * * /usr/local/bin/n8n-backup.sh >> /var/log/n8n-backup.log 2>&1
Paso 8 — SMTP para notificaciones
Editar docker-compose.yml en sección n8n environment:
N8N_SMTP_HOST: smtp.sparkpostmail.com
N8N_SMTP_PORT: 587
N8N_SMTP_USER: SMTP_Injection
N8N_SMTP_PASS: ${SPARKPOST_API_KEY}
N8N_SMTP_SENDER: n8n@tuempresa.cl
N8N_EMAIL_MODE: smtp
# Aplicar
docker compose up -d
Verificación final — checklist
| Check | Cómo | Esperado |
|---|---|---|
| n8n responde HTTPS | curl -I https://n8n.tuempresa.cl | HTTP/2 200 (after login) |
| SSL válido | certbot certificates | Expires > 60 days |
| Editor accesible | Browser → URL | Login Basic Auth funciona |
| Backups corriendo | rclone ls b2:n8n-backups | Listado backups recientes |
| Container saludable | docker ps | STATUS "Up X minutes" |
| Logs sin errors | docker compose logs --tail 50 | Sin tracebacks ni "ECONNREFUSED" |
¿No quieres operar n8n self-hosted?
Te ofrecemos n8n gestionado desde USD 19/mes. Setup, monitor 24/7, backups, updates, soporte WhatsApp ES. Tú solo usas el editor.
Hablar por WhatsAppPreguntas frecuentes
¿Qué VPS necesito para n8n production en 2026?
Para 5K-15K executions/mes: 2GB RAM, 2 vCPU, 50GB SSD (USD 12/mes DO São Paulo). Para 15K-50K: 4GB RAM, 2 vCPU, 80GB SSD (USD 24/mes). Para 50K+: 8GB RAM, 4 vCPU. n8n escala vertical bien hasta 100K executions/mes.
¿Por qué Docker Compose y no npm install?
Docker Compose te da PostgreSQL containerizado, updates de un comando, rollback fácil, menos conflicts con OS, backups por volumes simples. Instalación npm requiere PM2 para daemon, más config manual. Para production, Docker Compose es estándar industria.
¿Qué SMTP usar para notificaciones n8n?
SparkPost (free 500/día, USD 25/mes 100K), Postmark (USD 15/mes 10K, mejor transactional), AWS SES (USD 0.10/1K, más barato a escala). NO uses Gmail/Outlook — bloquean masivos.
¿Cómo hago backups de n8n y workflows?
3 capas: (1) Volume Docker persistente; (2) Dump diario PostgreSQL via pg_dump + rclone a S3/B2; (3) Export JSON workflows críticos. Retención mínima 30 días, ideal 90 días + restore test mensual.
¿Cuánto tiempo toma instalación completa?
Con experiencia Linux: 2-4 horas. Primera vez sin experiencia: 6-12 horas. Profesional: 1-2 horas + hardening. Antes de production: 24-48h warmup + smoke tests.
¿Y si no quiero hacer DevOps?
Ofrecemos n8n gestionado desde USD 19/mes: instalamos en DO São Paulo, configuramos SMTP, SSL, monitor 24/7, backups, updates n8n, soporte WhatsApp ES. Tú solo usas n8n editor.