Cómo Instalar n8n con Docker en un VPS Linux (Guía 2026)

Esta guía explica paso a paso cómo instalar n8n con Docker en un VPS Linux (Ubuntu 24.04 LTS recomendado), publicarlo con tu dominio, activar SSL con Let’s Encrypt y dejarlo funcionando en producción de forma estable. Sin rodeos, sin pasos innecesarios.

n8n es una herramienta de automatización de workflows open-source. Con un VPS puedes tener n8n self-hosted: tus datos en tu servidor, sin límites por ejecución y sin pagar por cada workflow activo. Exactamente lo que necesitas si usas n8n en serio.


Requisitos previos

Antes de empezar necesitas:

  • Un VPS con Ubuntu 24.04 LTS (también funciona con Debian 12). Mínimo 1 vCPU y 2 GB RAM para uso personal; 2 vCPU y 4 GB RAM para producción con varios workflows activos. Consulta los planes VPS para n8n de BlumHost con los requisitos detallados.
  • Un dominio o subdominio apuntando a la IP del VPS (registro A configurado y propagado)
  • Acceso SSH al servidor con usuario root o con sudo
  • Conocimientos básicos de terminal Linux (no necesitas ser experto, esta guía cubre cada comando)

Paso 1: Preparar el servidor

Conéctate al VPS por SSH y actualiza el sistema:

apt update && apt upgrade -y

Instala paquetes básicos que necesitaremos:

apt install -y curl wget git ufw

Configura el firewall para permitir solo los puertos necesarios:

ufw allow ssh
ufw allow 80
ufw allow 443
ufw enable

Confirma con y cuando te lo pregunte. Ahora el servidor solo acepta conexiones SSH, HTTP y HTTPS.


Paso 2: Instalar Docker y Docker Compose

N8N se despliega con Docker, que es la forma más limpia y mantenible de instalarlo. Docker Compose permite definir todos los servicios (n8n + base de datos + proxy) en un solo archivo.

Instala Docker con el script oficial:

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

Verifica que Docker está funcionando:

docker --version
docker compose version

Deberías ver algo como Docker version 26.x.x y Docker Compose version v2.x.x.


Paso 3: Instalar Nginx como reverse proxy

n8n corre en el puerto 5678. Para publicarlo en el puerto 443 (HTTPS) con tu dominio, necesitas un reverse proxy. Nginx es la opción más sencilla.

apt install -y nginx

Paso 4: Obtener el certificado SSL con Certbot

apt install -y certbot python3-certbot-nginx
certbot --nginx -d tu-dominio.com

Sustituye tu-dominio.com por tu dominio real. Certbot pedirá un email para notificaciones de renovación y configurará el certificado automáticamente.


Paso 5: Crear la estructura de directorios

mkdir -p /opt/n8n
cd /opt/n8n

Paso 6: Crear el archivo docker-compose.yml

Crea el archivo de configuración principal:

nano /opt/n8n/docker-compose.yml

Pega el siguiente contenido, sustituyendo los valores en MAYÚSCULAS:

version: '3.8'

services:
  postgres:
    image: postgres:16
    restart: always
    environment:
      POSTGRES_DB: n8n
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: TU_CONTRASEÑA_POSTGRES
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n8n"]
      interval: 10s
      timeout: 5s
      retries: 5

  n8n:
    image: n8nio/n8n:latest
    restart: always
    ports:
      - "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=TU_CONTRASEÑA_POSTGRES
      - N8N_HOST=tu-dominio.com
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://tu-dominio.com/
      - GENERIC_TIMEZONE=Europe/Madrid
      - TZ=Europe/Madrid
      - N8N_ENCRYPTION_KEY=UNA_CLAVE_ALEATORIA_32_CARACTERES
    volumes:
      - n8n_data:/home/node/.n8n
    depends_on:
      postgres:
        condition: service_healthy

volumes:
  postgres_data:
  n8n_data:

Variables que debes personalizar:
TU_CONTRASEÑA_POSTGRES: una contraseña segura para la base de datos (usa letras, números y símbolos)
tu-dominio.com: tu dominio o subdominio real
UNA_CLAVE_ALEATORIA_32_CARACTERES: genera una clave con openssl rand -hex 16

Para generar la clave de cifrado:

openssl rand -hex 16

Guarda y cierra el archivo (Ctrl+X, Y, Enter).


Paso 7: Configurar Nginx como reverse proxy para n8n

Crea la configuración de Nginx para tu dominio:

nano /etc/nginx/sites-available/n8n

Pega este contenido (sustituye tu-dominio.com):

server {
    server_name tu-dominio.com;

    location / {
        proxy_pass http://localhost: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_cache_bypass $http_upgrade;
        proxy_read_timeout 300s;
        proxy_connect_timeout 75s;
    }

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/tu-dominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/tu-dominio.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
    if ($host = tu-dominio.com) {
        return 301 https://$host$request_uri;
    }
    listen 80;
    server_name tu-dominio.com;
    return 404;
}

Activa la configuración:

ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx

nginx -t debe devolver syntax is ok y test is successful. Si hay errores, revisa que el dominio en el archivo coincide exactamente con el del certificado SSL.


Paso 8: Arrancar N8N

cd /opt/n8n
docker compose up -d

Docker descargará las imágenes (puede tardar 2-3 minutos la primera vez) y arrancará los servicios. Verifica que todo está corriendo:

docker compose ps

Deberías ver dos servicios con estado Up: postgres y n8n.

Espera 30-60 segundos y abre tu navegador en https://tu-dominio.com. Verás el wizard de configuración inicial de n8n para crear el usuario administrador.


Paso 9: Configurar autenticación básica

La primera vez que accedes a n8n, el wizard te pedirá crear una cuenta de administrador. Elige una contraseña fuerte.

Para mayor seguridad, considera también:

Limitar acceso por IP si n8n es solo para tu equipo (añadir en la configuración de Nginx o con ufw):

# Solo desde IPs específicas
ufw allow from TU_IP_FIJA to any port 443

Activar autenticación de dos factores desde el panel de n8n: Settings → Personal → Two-factor authentication.


Paso 10: Configurar renovación automática del SSL

Certbot renueva el certificado automáticamente, pero hay que asegurarse de que el servicio de renovación está activo:

systemctl status certbot.timer

Si está activo, perfecto. Si no:

systemctl enable certbot.timer
systemctl start certbot.timer

Comandos útiles para el mantenimiento diario

Ver logs de n8n en tiempo real:

cd /opt/n8n && docker compose logs -f n8n

Actualizar n8n a la última versión:

cd /opt/n8n
docker compose pull
docker compose up -d

Reiniciar n8n:

cd /opt/n8n && docker compose restart n8n

Parar todos los servicios:

cd /opt/n8n && docker compose down

Ver uso de recursos:

docker stats

Buenas prácticas para n8n en producción

Usa PostgreSQL (ya está en el docker-compose). La configuración anterior ya usa PostgreSQL en lugar de SQLite. PostgreSQL es imprescindible para producción: escala mejor, permite backups consistentes y no tiene los límites de concurrencia de SQLite.

Configura backups de la base de datos. El VPS tiene backups diarios del disco completo incluidos, pero también puedes hacer backups específicos de PostgreSQL:

docker exec -t n8n-postgres-1 pg_dump -U n8n n8n > /backup/n8n_$(date +%Y%m%d).sql

Puedes automatizarlo con un cron: crontab -e y añade:

0 3 * * * docker exec -t n8n-postgres-1 pg_dump -U n8n n8n > /opt/backups/n8n_$(date +\%Y\%m\%d).sql

Controla el historial de ejecuciones. n8n guarda el historial de todas las ejecuciones en la base de datos. Con el tiempo, esto puede crecer mucho. Configura el límite en Settings → Executions → Save data of successful executions: elige «Latest X» en lugar de «All».

Monitoriza el uso de recursos. El VPS II (2 vCPU, 4 GB RAM) es suficiente para la mayoría de instalaciones de producción con n8n. Monitoriza con htop o docker stats si notas lentitud.


Solución de problemas habituales

N8N no arranca (error de base de datos):

docker compose logs postgres

Si ves errores de permisos, prueba:

docker compose down -v
docker compose up -d

Esto borra los volúmenes y los recrea. Cuidado: perderás los datos de n8n si ya tenías workflows guardados.

Los webhooks no funcionan:
Verifica que WEBHOOK_URL en el docker-compose.yml es exactamente https://tu-dominio.com/ (con la barra al final). Reinicia n8n después de cualquier cambio en las variables de entorno.

SSL caducado o error de certificado:

certbot renew --force-renewal
systemctl reload nginx

N8N va lento:
Comprueba el uso de RAM con free -h. Si el sistema usa swap de forma intensiva, es señal de que necesitas más RAM. Considera el VPS II (4 GB RAM) para producción con muchos workflows.


Próximos pasos

Con n8n instalado y funcionando, puedes:

  • Conectar tus primeras integraciones desde el panel de n8n
  • Explorar los más de 400 nodos disponibles (Slack, Gmail, Webhook, HTTP Request, bases de datos…)
  • Configurar workers para workflows intensivos si tienes colas grandes
  • Añadir más instancias de n8n si necesitas escalar horizontalmente

Si tienes dudas durante la instalación o quieres que te ayudemos a configurarlo, abre un ticket de soporte tras contratar tu VPS y te guiamos paso a paso.


Esta guía cubre la instalación básica de producción. Para configuraciones avanzadas (múltiples workers, balanceo de carga, integración con Redis), consulta la documentación oficial de n8n.

Miguel Taboada

Ingeniero en Telecomunicaciones e Informática. Creé BlumHost para ofrecer un hosting distinto a los demás, que ofrezca la mejor atención al cliente, al menor precio y con la mejor calidad.

Ver todas las entradas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *