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

GM
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

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 pm2Verifica:
node -v
npm -v
pm2 -v2. Crear dominio en HestiaCP
En el panel, con el usuario final (ejemplo: usuario):
- Ir a Web → Add Web Domain.
- Dominio:
n8n.midominio.com - SSL: activado
- Forzar SSL: activado
- 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_*;
}
EOF3.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_*;
}
EOFActiva 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 nginx4. 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/n8n5. Instalar n8n (como usuario del panel)
cd /home/usuario/n8n
sudo -u usuario npm init -y
sudo -u usuario npm install n8nVerifica:
sudo -u usuario npx n8n --version6. 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_CityMuy importante Usa una contraseña real, larga y aleatoria.
Permisos:
chmod 600 /home/usuario/n8n/.env7. 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 n8nchmod +x /home/usuario/n8n/start.sh8. 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 startupCopia y ejecuta el comando que PM2 te muestre.
Verifica:
sudo -u usuario pm2 status
sudo -u usuario pm2 logs n8n-app10. Verificar que todo funcione
curl -I https://n8n.midominio.comDebe 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
.envcon 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