itsez.dev
📖Tutorial

Cómo instalar n8n en un VPS

2026-07-30·4 min de lectura·APIs y automatización

n8n conecta APIs y servicios mediante workflows visuales que puedes operar en tu propia infraestructura. Esta guía ejecuta n8n con PostgreSQL y Docker Compose, mantiene el editor detrás de HTTPS y configura las URLs necesarias para webhooks fiables.

Requisitos previos

Usa un VPS limpio con Ubuntu 22.04 o 24.04, SSH, IP pública y al menos 2 GB de RAM. Añade memoria si tus workflows ejecutan código, procesan archivos o trabajan en paralelo. Crea un registro A como n8n.example.com apuntando al VPS y reserva los puertos 80 y 443 para el reverse proxy.

Necesitas Docker Engine, el plugin de Compose, un destino de backup y una clave de cifrado aleatoria. No pegues tokens de APIs en el Compose. Guárdalos como credenciales de n8n o en un gestor de secretos.

Paso 1, Conectarte a tu servidor

Actualiza el servidor y crea una carpeta privada:

ssh root@SERVER_IP
apt update && apt upgrade -y
apt install -y ca-certificates curl
mkdir -p /opt/n8n
cd /opt/n8n
chmod 750 /opt/n8n

Comprueba que los puertos 80 y 443 están libres. Si hay un web server antiguo, identifica antes qué depende de él. El editor de n8n no debería quedar expuesto directamente en un puerto público.

Paso 2, Instalar Docker y Docker Compose

Instala Docker siguiendo las instrucciones oficiales para Ubuntu y comprueba el plugin de Compose:

docker --version
docker compose version
systemctl enable --now docker

Usa una fuente de paquetes soportada y mantén el engine actualizado. No añadas el socket de Docker a un contenedor público que no lo necesite.

Paso 3, Ejecutar n8n con Docker Compose

Crea .env y sustituye los placeholders con valores aleatorios. La clave de cifrado debe conservarse durante toda la vida de la instalación:

POSTGRES_DB=n8n
POSTGRES_USER=n8n
POSTGRES_PASSWORD=REPLACE_WITH_A_RANDOM_VALUE
N8N_ENCRYPTION_KEY=REPLACE_WITH_A_LONG_RANDOM_VALUE
N8N_HOST=n8n.example.com
N8N_PROTOCOL=https
N8N_WEBHOOK_URL=https://n8n.example.com/
N8N_EDITOR_BASE_URL=https://n8n.example.com/
N8N_PROXY_HOPS=1

Crea compose.yaml:

services:
  db:
    image: postgres:16
    restart: unless-stopped
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - db_data:/var/lib/postgresql/data

  n8n:
    image: docker.n8n.io/n8nio/n8n:latest
    restart: unless-stopped
    depends_on:
      - db
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: db
      DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
      DB_POSTGRESDB_USER: ${POSTGRES_USER}
      DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
      N8N_HOST: ${N8N_HOST}
      N8N_PROTOCOL: ${N8N_PROTOCOL}
      N8N_WEBHOOK_URL: ${N8N_WEBHOOK_URL}
      N8N_EDITOR_BASE_URL: ${N8N_EDITOR_BASE_URL}
      N8N_PROXY_HOPS: 1
    ports:
      - "127.0.0.1:5678:5678"
    volumes:
      - n8n_data:/home/node/.n8n

volumes:
  db_data:
  n8n_data:

Arranca el proyecto y revisa los logs:

docker compose up -d
docker compose ps
docker compose logs --tail 100 n8n

Después de probar, fija las versiones de las imágenes en producción en lugar de actualizar siempre con latest.

Paso 4, Configurar el proxy inverso

Configura Caddy, Nginx o el proxy de tu plataforma para enviar n8n.example.com a 127.0.0.1:5678. El proxy debe incluir estas tres cabeceras para que los webhooks funcionen correctamente:

  • X-Forwarded-For — conserva la IP original del cliente
  • X-Forwarded-Host — conserva el hostname original
  • X-Forwarded-Proto — conserva el protocolo original (HTTP/HTTPS)

El proxy debe gestionar HTTPS y mantener 5678 ligado a localhost y bloqueado en el firewall.

Prueba el editor y un webhook. Si un proveedor no alcanza el webhook, comprueba DNS, certificado, cabeceras y N8N_WEBHOOK_URL antes de modificar el workflow.

Paso 5, Primer acceso y configuración inicial

Abre https://n8n.example.com y crea la cuenta propietaria. n8n exige esto desde v0.200+, así que el primer usuario en registrarse se convierte en el propietario de la instancia. Activa la gestión de usuarios y limita las invitaciones. Crea una credencial de prueba, ejecuta un workflow sencillo y verifica que los datos sobreviven a un reinicio.

Revisa la retención de ejecuciones y desactiva el almacenamiento detallado si no lo necesitas. Las credenciales deben crearse dentro de n8n, no quedar codificadas en nodos o archivos de entorno que se compartan.

Mantenimiento

Haz backup del volumen n8n_data (que contiene la clave de cifrado), de PostgreSQL y de la clave de cifrado al mismo tiempo. Si se pierde el volumen n8n_data, todas las credenciales guardadas se vuelven irrecuperables. Un backup de la base de datos sin la clave de cifrado no puede descifrar las credenciales. Actualiza según las notas de versión, prueba los workflows y conserva una copia de rollback.

Monitoriza memoria, disco, tiempo de cola y ejecuciones fallidas. Para cargas mayores, adopta el modo queue documentado por n8n y separa workers en lugar de hacer crecer indefinidamente un solo contenedor.

Herramientas mencionadas

n8n

Plataforma open-source de automatización de workflows para conectar apps y crear automatizaciones visualmente.

FreemiumSin tarjetaOSS

Community edition gratuita auto-hospedada con workflows ilimitados. Cloud gratis con 5 workflows activos.

SOBRE NOSOTROS

Honesto, independiente, sin relleno.

Sin patrocinios. Solo un análisis claro de qué hace, cuánto cuesta y lo que debes saber antes de comprometerte.

Leer más

FAQ

Preguntas frecuentes

n8n debe usar SQLite o PostgreSQL en producción?

Usa PostgreSQL para una instalación estable o colaborativa. SQLite sirve para evaluar rápido, pero tampoco elimina la necesidad de hacer backups.

Por qué los webhooks necesitan una URL pública?

Los servicios externos deben poder llegar al endpoint. Define la URL HTTPS pública y pasa las peticiones por el reverse proxy.

Dónde guarda n8n las credenciales?

Las credenciales se cifran con la clave configurada. Mantén esa clave fuera del repositorio y guárdala junto con la base de datos.