The source code for this blog is available on GitHub.

Blog.

Cómo instalar N8N en un VPS Plesk (Ionos)

Cover Image for Cómo instalar N8N en un VPS Plesk (Ionos)
Ludbig
Ludbig

Cómo instalar n8n con PostgreSQL en un VPS con Plesk y Cloudflare (SSL Full Strict)

En esta guía aprenderás a desplegar n8n (herramienta de automatización de flujos) junto con PostgreSQL, corriendo en Docker Compose dentro de un VPS con Plesk, y protegido por Cloudflare en modo SSL Full (strict).

Incluye solución a los errores más comunes que aparecen al montar este stack.


1. Requisitos previos

  • VPS con Plesk (con Docker instalado).
  • Dominio gestionado en Cloudflare.
  • Acceso SSH al servidor.
  • Docker + Compose plugin moderno (docker compose, no docker-compose).

Si aún tienes la versión vieja:

sudo apt-get remove -y docker-compose
sudo apt-get update
sudo apt-get install -y docker-compose-plugin
docker compose version

2. Estructura y permisos en el host

Crearemos los directorios donde se guardarán los datos persistentes:

sudo mkdir -p /home/docker/n8n/{n8n_data,postgres}
sudo chown -R 1000:1000 /home/docker/n8n/n8n_data   # n8n corre como uid 1000
sudo chown -R 999:999  /home/docker/n8n/postgres    # postgres corre como uid 999

3. Archivo docker-compose.yml

Crea /home/docker/n8n/docker-compose.yml:

version: "3.9"

networks:
  n8n-net:
    driver: bridge

services:
  postgres:
    image: postgres:16
    container_name: postgres
    restart: unless-stopped
    environment:
      POSTGRES_DB: n8n
      POSTGRES_USER: espartacode_n8n
      POSTGRES_PASSWORD: <TU_PASS_PG>
    volumes:
      - /home/docker/n8n/postgres:/var/lib/postgresql/data
    networks: [n8n-net]

  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    depends_on:
      - postgres
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_PORT: 5432
      DB_POSTGRESDB_DATABASE: n8n
      DB_POSTGRESDB_USER: espartacode_n8n
      DB_POSTGRESDB_PASSWORD: <TU_PASS_PG>

      N8N_HOST: espartacode.ludbig.com
      N8N_PROTOCOL: https
      WEBHOOK_URL: https://espartacode.ludbig.com/
      N8N_TRUST_PROXY: "true"
      N8N_PORT: 5678

      N8N_ENCRYPTION_KEY: "<TU_CLAVE_32+>"
      GENERIC_TIMEZONE: Europe/Madrid
      N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
      N8N_DIAGNOSTICS_ENABLED: "false"
      N8N_VERSION_NOTIFICATIONS_ENABLED: "false"
      N8N_SKIP_WEBHOOK_DEREGISTRATION_ON_SHUTDOWN: "true"
    ports:
      - "5678:5678"
    volumes:
      - /home/docker/n8n/n8n_data:/home/node/.n8n
    networks: [n8n-net]

🔑 Genera una clave segura para N8N_ENCRYPTION_KEY:

openssl rand -base64 32

4. Levantar el stack

cd /home/docker/n8n
docker compose up -d
docker compose logs -f postgres | tail -n 50   # busca "ready to accept connections"
docker compose logs -f n8n | tail -n 80        # busca "Migrations finished"

5. Cloudflare (SSL)

  • En el DNS de Cloudflare, pon el subdominio de n8n en Proxied (naranja).
  • En SSL/TLS → Encryption mode, selecciona Full (strict).
  • Puedes usar un Origin Certificate de Cloudflare en Plesk o simplemente Let’s Encrypt.

6. Plesk (reverse proxy)

En el subdominio (espartacode.ludbig.com):

  • Instala un certificado válido.
  • Configura un Proxy Rule hacia http://127.0.0.1:5678.
  • En nginx → Additional directives añade:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;

Esto habilita WebSockets (necesarios para el editor de n8n).


7. Primer acceso

  1. Abre https://espartacode.ludbig.com.
  2. Crea el usuario administrador.
  3. Verifica en Settings que Webhook URL apunta al dominio público.
  4. Desactiva sign-up público si no lo necesitas.

8. Copias de seguridad

Datos a respaldar:

  • /home/docker/n8n/n8n_data
  • /home/docker/n8n/postgres
  • docker-compose.yml

Backup rápido:

sudo tar -czf /root/backup-n8n-$(date +%F).tgz   -C /home/docker/n8n n8n_data postgres docker-compose.yml

Restauración = extraer y docker compose up -d.


9. Problemas comunes y soluciones

A) EACCES: permission denied, open '/home/node/.n8n/config'

  • Dueño incorrecto del volumen.
sudo chown -R 1000:1000 /home/docker/n8n/n8n_data
sudo chmod 600 /home/docker/n8n/n8n_data/config

B) connect ECONNREFUSED ::1:5432

  • Variables mal escritas o contenedores en distinta red.
  • Usa DB_POSTGRESDB_HOST=postgres y asegúrate de que ambos estén en n8n-net.

C) password authentication failed / role does not exist

  • La carpeta de Postgres ya existía y no creó el usuario.
  • Solución rápida:
docker compose down
sudo rm -rf /home/docker/n8n/postgres/*
docker compose up -d

D) Mismatching encryption keys

  • El archivo config y la var N8N_ENCRYPTION_KEY no coinciden.
echo '{"encryptionKey":"<TU_CLAVE_32+>"}' | sudo tee /home/docker/n8n/n8n_data/config
sudo chown 1000:1000 /home/docker/n8n/n8n_data/config
sudo chmod 600 /home/docker/n8n/n8n_data/config
docker compose restart n8n

E) Error de docker-compose (legacy, chunked)

  • Usa el plugin moderno: docker compose up -d.

Conclusión

Con este setup tienes n8n corriendo en tu VPS con Postgres como backend confiable, protegido por Cloudflare SSL Full strict y gestionado cómodamente desde Plesk para certificados y proxy.

Tu stack es reproducible, fácil de respaldar y con los permisos y claves bien configurados para evitar errores típicos.