Saltar al contenido principal
Saltar al contenido principal

Cómo desplegar n8n en un servidor con HestiaCP (sin Docker): Guía completa

GM

GM

5 min lectura

Guía real, funcional y escrita con precisión Nada de información basura, nada de pasos vagos como “coloca el archivo en la carpeta” sin decir cuál. Esta es una guía directa, completa y con un equilibrio perfecto entre explicación y ejecución.

Instalar n8n en un servidor que utiliza HestiaCP puede sonar más complicado de lo que realmente es, sobre todo si decides hacerlo sin Docker. Pero en realidad, si entiendes cómo funciona la arquitectura interna de HestiaCP y cómo integrar PM2 + Node.js detrás del proxy reverso de Nginx, el proceso se vuelve limpio, estable y muy profesional.

Aquí tienes una implementación pensada para producción —sin exponer puertos, sin malas prácticas, sin mezclar carpetas del panel— y evitando fugas de seguridad.


🧩 Arquitectura del despliegue

Arquitectura de Despliegue n8n HestiaCP

HestiaCP se queda con:

  • SSL
  • Proxy reverso
  • Manejo de dominios
  • Firewall
  • Gestión de usuario
  • Integración con backups

Y n8n vive en un entorno separado, bajo un usuario del panel, ejecutado por PM2.


🛠️ Requisitos previos

ℹ️

Todo el proceso se ejecuta como root, excepto donde se indique claramente lo contrario.

  • Ubuntu Server (20.04 o superior)
  • HestiaCP instalado
  • Dominio apuntando a tu servidor
  • Certificado SSL activo (Hestia lo gestiona solo)
  • Node.js 18+ o 20+ LTS
  • PM2

1. Instalar Node.js y PM2 (como root)

curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt install -y nodejs
npm install -g pm2

Verifica:

node -v
npm -v
pm2 -v

2. Crear dominio en HestiaCP

En el panel, con el usuario final (ejemplo: usuario):

  1. Ir a Web → Add Web Domain.
  2. Dominio: n8n.midominio.com
  3. SSL: activado
  4. Forzar SSL: activado
  5. Guardar
💡

Si no encuentras las plantillas personalizadas todavía, no importa: las añadiremos en el siguiente paso.


3. Crear plantillas de Nginx para n8n

HestiaCP permite crear plantillas de proxy reverso. Aquí usaremos una plantilla optimizada para n8n.

Ruta de plantillas:

/usr/local/hestia/data/templates/web/nginx/

3.1. Crear n8n.tpl (HTTP)

cat > /usr/local/hestia/data/templates/web/nginx/n8n.tpl << 'EOF'
server {
    listen %ip%:%proxy_port%;
    server_name %domain_idn% %alias_idn%;
 
    location / {
        proxy_pass http://127.0.0.1:5678;
        proxy_http_version 1.1;
 
        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_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
 
        proxy_connect_timeout 300s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;
    }
 
    include %home%/%user%/conf/web/%domain%/nginx.conf_*;
}
EOF

3.2. Crear n8n.stpl (HTTPS)

cat > /usr/local/hestia/data/templates/web/nginx/n8n.stpl << 'EOF'
server {
    listen %ip%:%proxy_ssl_port% ssl;
    server_name %domain_idn% %alias_idn%;
 
    ssl_certificate     %ssl_pem%;
    ssl_certificate_key %ssl_key%;
 
    add_header Alt-Svc 'h3=":%proxy_ssl_port%"';
 
    location / {
        proxy_pass http://127.0.0.1:5678;
        proxy_http_version 1.1;
 
        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_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
 
        proxy_connect_timeout 300s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;
    }
 
    include %home%/%user%/conf/web/%domain%/nginx.ssl.conf_*;
}
EOF

Activa permisos:

chmod 644 /usr/local/hestia/data/templates/web/nginx/n8n.*

3.3. Aplicar plantilla al dominio

v-change-web-domain-proxy-tpl usuario n8n.midominio.com n8n
v-rebuild-user usuario
systemctl reload nginx

4. Preparar entorno para n8n (sin mezclarlo con public_html)

💜

Nunca instales n8n dentro de public_html. Crea un entorno dedicado.

mkdir -p /home/usuario/n8n/.n8n/logs
chown -R usuario:usuario /home/usuario/n8n

5. Instalar n8n (como usuario del panel)

cd /home/usuario/n8n
sudo -u usuario npm init -y
sudo -u usuario npm install n8n

Verifica:

sudo -u usuario npx n8n --version

6. Crear archivo .env

Ruta:

/home/usuario/n8n/.env

Contenido recomendado:

N8N_PROTOCOL=http
N8N_HOST=127.0.0.1
N8N_PORT=5678
 
N8N_EDITOR_BASE_URL=https://n8n.midominio.com/
WEBHOOK_URL=https://n8n.midominio.com/
 
TRUST_PROXY=1
EXPRESS_TRUST_PROXY=true
N8N_PROXY_HOPS=1
 
N8N_BASIC_AUTH_ACTIVE=true
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=CambiaEstaClave123
 
DB_TYPE=sqlite
N8N_USER_FOLDER=/home/usuario/n8n
 
GENERIC_TIMEZONE=America/Mexico_City
⚠️

Muy importante Usa una contraseña real, larga y aleatoria.

Permisos:

chmod 600 /home/usuario/n8n/.env

7. Crear script de inicio start.sh

Ruta:

/home/usuario/n8n/start.sh
#!/bin/bash
set -a
while IFS='=' read -r key value; do
  [[ -z "$key" || "$key" =~ ^# ]] && continue
  export "$key"="$value"
done < /home/usuario/n8n/.env
set +a
 
cd /home/usuario/n8n
exec /usr/bin/env npx n8n
chmod +x /home/usuario/n8n/start.sh

8. Crear archivo de configuración PM2

Ruta:

/home/usuario/n8n/ecosystem.config.js
module.exports = {
  apps: [{
    name: 'n8n-app',
    script: '/home/usuario/n8n/start.sh',
    interpreter: '/bin/bash',
    env: { NODE_ENV: 'production' },
    instances: 1,
    exec_mode: 'fork',
    autorestart: true,
    watch: false,
    max_memory_restart: '1G'
  }]
};

9. Iniciar n8n con PM2

cd /home/usuario/n8n
sudo -u usuario pm2 start ecosystem.config.js
sudo -u usuario pm2 save
sudo -u usuario pm2 startup

Copia y ejecuta el comando que PM2 te muestre.

Verifica:

sudo -u usuario pm2 status
sudo -u usuario pm2 logs n8n-app

10. Verificar que todo funcione

curl -I https://n8n.midominio.com

Debe devolver 200.

Desde navegador:

https://n8n.midominio.com

Si ves la pantalla de login o de registro del usuario owner, todo está funcionando.


🛡️ Seguridad recomendada

  • No exponer el puerto 5678
  • Forzar HTTPS
  • Activar autenticación básica en n8n
  • Mantener .env con permisos 600
  • Evitar colocar n8n dentro de public_html
  • Actualizar n8n regularmente

🔄 Actualizar n8n (seguro)

cd /home/usuario/n8n
sudo -u usuario pm2 stop n8n-app
sudo -u usuario npm update n8n
sudo -u usuario pm2 start n8n-app

🧰 Comandos útiles

sudo -u usuario pm2 logs n8n-app
sudo -u usuario pm2 restart n8n-app