Cómo instalar n8n en VPS Ubuntu 22.04 — guía production 2026 (Docker + Nginx + SSL)

📅 Publicado 13 may 2026 ⏱ Lectura ~16 min 🔧 n8n 1.x · Ubuntu 22.04 LTS · Docker Compose
TL;DR — Esta guía cubre

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

⚠️ Aviso: esta guía es para Ubuntu 22.04 LTS. Para 20.04 los paquetes son ligeramente diferentes. Para 24.04 funciona idéntico pero PHP/Node versions pueden ser más nuevas (sin problema).

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

CheckCómoEsperado
n8n responde HTTPScurl -I https://n8n.tuempresa.clHTTP/2 200 (after login)
SSL válidocertbot certificatesExpires > 60 days
Editor accesibleBrowser → URLLogin Basic Auth funciona
Backups corriendorclone ls b2:n8n-backupsListado backups recientes
Container saludabledocker psSTATUS "Up X minutes"
Logs sin errorsdocker compose logs --tail 50Sin 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 WhatsApp

Preguntas 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.