Si has decidido que n8n es la plataforma perfecta para automatizar los procesos de tu empresa, el siguiente paso crítico es decidir cómo implementarlo. Si aún no tienes claro cuáles son las diferencias entre la versión autoalojada y la versión en la nube de n8n, en este artículo podrás encontrar una comparativa en detalle de ambas versiones.
Esta guía te llevará paso a paso desde cero hasta tener una instancia de n8n completamente funcional, segura, y optimizada en tus propios servidores para uso empresarial. No necesitas ser un experto en servidores - solo seguir las instrucciones cuidadosamente y dedicar aproximadamente 30 minutos a la configuración inicial.
Índice
- Requisitos del servidor y especificaciones técnicas
- Preparación del servidor: configuración inicial
- Instalación de Docker y Docker Compose
- Configuración de n8n con PostgreSQL
- Configuración de SSL y dominio personalizado
- Configuración de seguridad y acceso
- Respaldos automáticos y recuperación
- Monitoreo y mantenimiento
- Optimización de rendimiento
- Solución de problemas comunes
- Actualización y escalamiento
Requisitos del servidor y especificaciones técnicas
La elección del servidor es probablemente la decisión más importante para garantizar que tu instancia de n8n funcione de manera óptima durante años. Un servidor subdimensionado se convertirá en un cuello de botella que limitará tus automatizaciones más ambiciosas, mientras que uno sobredimensionado desperdiciará recursos y aumentará costes innecesariamente.
Aunque n8n es bastante ligero, los requerimientos varían según la cantidad de workflows que ejecutes y su comlejidad. Un workflow que procesa archivos pesados o que que ejecuta transformaciones de datos complejas requiere mucha más RAM que uno que simplemente envía notificaciones por email. En la siguiente tabla se detallan las especificaciones requeridas aproximadas según el volumen de ejecución:
Uso | CPU | RAM | Almacenamiento | Ejecuciones/mes | Coste aprox. |
---|---|---|---|---|---|
Básico | 2 cores | 4GB | 40GB SSD | Hasta 25.000 | 15-25€/mes |
Intensivo | 4 cores | 8GB | 80GB SSD | Hasta 100.000 | 40-60€/mes |
Ilimitado | 8+ cores | 16GB+ | 160GB+ SSD | Ilimitadas | 80-150€/mes |
En términos de proveedores, un VPS (servidor privado virtual) es una muy buena opción y muy económica, con planes dede 5€ al mes, como Hostinger, ServerCheap o Ionos. Por otro lado, AWS y Google Cloud son opciones sólidas si ya tienes infraestructura en esas plataformas.
El sistema operativo recomendado es Ubuntu Server 22.04 LTS o 24.04 LTS ya que tiene soporte a largo plazo, excelente compatibilidad con Docker, y actualizaciones de seguridad regulares. CentOS y Debian también funcionan bien, pero Ubuntu tiene la mejor documentación y comunidad para este tipo de implementaciones.
Preparación del servidor: configuración inicial
Una vez que tengas tu servidor aprovisionado, el primer paso es asegurar y preparar el entorno. Esta configuración inicial es crítica para la seguridad a largo plazo de tu instancia. Vamos a configurar usuarios, firewalls, y actualizaciones automáticas antes de instalar n8n.
Primero, actualiza el sistema y crea un usuario administrativo separado del root. Nunca es buena idea ejecutar aplicaciones como root por razones de seguridad:
sudo apt update && sudo apt upgrade -y
sudo adduser n8nadmin
sudo usermod -aG sudo n8nadmin
Configura un firewall básico que solo permita tráfico SSH, HTTP, y HTTPS. Esto bloquea todos los demás puertos por defecto, reduciendo significativamente la superficie de ataque:
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw enable
Habilita actualizaciones automáticas de seguridad para mantener el sistema parcheado sin intervención manual. Esto es especialmente importante para servidores que van a ejecutar 24/7:
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
Si planeas acceder al servidor desde IPs específicas, puedes restringir el acceso SSH solo a esas direcciones para mayor seguridad. También considera configurar autenticación con llaves SSH en lugar de contraseñas.
Instalación de Docker y Docker Compose
Docker simplifica enormemente la instalación y gestión de n8n al encapsular toda la aplicación y sus dependencias en contenedores aislados. Esto significa que no tienes que preocuparte por conflictos de versiones, dependencias del sistema, o configuraciones complejas.
Primero, instala Docker siguiendo el método oficial recomendado. Evita instalar Docker desde los repositorios de Ubuntu porque suelen tener versiones desactualizadas:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
Instala Docker Compose, que necesitaremos para orquestar múltiples contenedores (n8n + PostgreSQL + Nginx):
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Verifica que ambas instalaciones funcionan correctamente:
docker --version
docker-compose --version
Para completar la configuración, cierra sesión y vuelve a conectarte para que los cambios de grupo tomen efecto. Esto te permitirá ejecutar comandos Docker sin sudo.
Configuración de n8n con PostgreSQL
Ahora viene la parte más importante: configurar n8n con una base de datos PostgreSQL robusta. Aunque n8n puede ejecutarse con SQLite para desarrollo, PostgreSQL es esencial para uso empresarial porque ofrece mejor rendimiento, concurrencia, y capacidades de respaldo.
Crea un directorio de trabajo y el archivo de configuración de Docker Compose:
mkdir /home/n8nadmin/n8n-docker
cd /home/n8nadmin/n8n-docker
Crea un archivo docker-compose.yml
con la siguiente configuración. Esta configuración incluye n8n, PostgreSQL, y todas las variables de entorno necesarias:
version: '3.8'
services:
postgres:
image: postgres:13
restart: unless-stopped
environment:
POSTGRES_DB: n8n
POSTGRES_USER: n8n
POSTGRES_PASSWORD: tu_password_seguro_aqui
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- n8n-network
n8n:
image: n8nio/n8n:latest
restart: unless-stopped
environment:
N8N_BASIC_AUTH_ACTIVE: true
N8N_BASIC_AUTH_USER: admin
N8N_BASIC_AUTH_PASSWORD: tu_password_admin_aqui
N8N_HOST: tu-dominio.com
N8N_PORT: 5678
N8N_PROTOCOL: https
WEBHOOK_URL: https://tu-dominio.com
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_DATABASE: n8n
DB_POSTGRESDB_USER: n8n
DB_POSTGRESDB_PASSWORD: tu_password_seguro_aqui
N8N_ENCRYPTION_KEY: una_clave_de_encriptacion_muy_larga_y_aleatoria
ports:
- '5678:5678'
volumes:
- n8n_data:/home/node/.n8n
depends_on:
- postgres
networks:
- n8n-network
volumes:
postgres_data:
n8n_data:
networks:
n8n-network:
driver: bridge
Variables críticas a personalizar:
- Reemplaza
tu_password_seguro_aqui
con una contraseña fuerte para PostgreSQL - Reemplaza
tu_password_admin_aqui
con una contraseña segura para el admin de n8n - Reemplaza
tu-dominio.com
con tu dominio real - Genera una clave de encriptación aleatoria larga para
N8N_ENCRYPTION_KEY
Para generar una clave de encriptación segura, puedes usar:
openssl rand -base64 32
Una vez configurado el archivo, inicia los servicios:
docker-compose up -d
Verifica que todo esté funcionando:
docker-compose ps
docker-compose logs n8n
Configuración de SSL y dominio personalizado
Para uso empresarial, necesitas configurar HTTPS con un certificado SSL válido. Esto no solo es importante para seguridad, sino que muchas APIs modernas requieren HTTPS para webhooks. Usaremos Nginx como proxy reverso y Let’s Encrypt para certificados gratuitos.
Primero, apunta tu dominio al IP de tu servidor configurando un registro A en tu proveedor de DNS. Esto puede tardar hasta 24 horas en propagarse completamente.
Instala Nginx y Certbot para manejar el proxy reverso y los certificados SSL:
sudo apt install nginx certbot python3-certbot-nginx -y
Crea una configuración de Nginx para tu sitio. Reemplaza tu-dominio.com
con tu dominio real:
sudo nano /etc/nginx/sites-available/n8n
Contenido del archivo:
server {
listen 80;
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 86400s;
proxy_send_timeout 86400s;
}
}
Habilita el sitio y reinicia Nginx:
sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
Genera el certificado SSL:
sudo certbot --nginx -d tu-dominio.com
Configura renovación automática del certificado:
sudo crontab -e
Añade esta línea:
0 12 * * * /usr/bin/certbot renew --quiet
Configuración de seguridad y acceso
Con n8n ejecutándose públicamente, la seguridad debe ser una prioridad absoluta. Más allá de la autenticación básica que configuramos, hay varias capas adicionales de seguridad que debes implementar para proteger tu instancia.
Restricción de acceso por IP es una de las medidas más efectivas si tienes IPs fijas. Puedes configurar Nginx para solo permitir acceso desde direcciones específicas:
location / {
allow 123.456.789.0/24; # Tu red de oficina
allow 98.765.432.1; # Tu IP de casa
deny all;
proxy_pass http://localhost:5678;
# ... resto de configuración
}
Configuración de fail2ban para proteger contra ataques de fuerza bruta:
sudo apt install fail2ban -y
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Configura reglas específicas para Nginx en /etc/fail2ban/jail.local
:
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 3600
Configuración de variables de entorno seguras separando credenciales del archivo docker-compose. Crea un archivo .env
:
nano .env
Contenido:
POSTGRES_PASSWORD=tu_password_muy_seguro
N8N_BASIC_AUTH_PASSWORD=tu_password_admin_muy_seguro
N8N_ENCRYPTION_KEY=tu_clave_de_encriptacion_super_larga
Luego modifica tu docker-compose.yml
para usar estas variables:
environment:
N8N_BASIC_AUTH_PASSWORD: ${N8N_BASIC_AUTH_PASSWORD}
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
Configuración de logging de auditoría para monitorear accesos:
n8n:
environment:
N8N_LOG_LEVEL: info
N8N_LOG_OUTPUT: file
volumes:
- ./logs:/home/node/.n8n/logs
Respaldos automáticos y recuperación
Los respaldos son absolutamente críticos para cualquier sistema empresarial. Perder workflows de automatización puede paralizar operaciones por días. Vamos a configurar respaldos automáticos diarios tanto de la base de datos como de los archivos de configuración.
Crea un script de respaldo para PostgreSQL:
mkdir /home/n8nadmin/backups
nano /home/n8nadmin/backup-n8n.sh
Contenido del script:
#!/bin/bash
# Configuración
BACKUP_DIR="/home/n8nadmin/backups"
DATE=$(date +%Y%m%d_%H%M%S)
CONTAINER_NAME="n8n-docker_postgres_1"
DB_NAME="n8n"
DB_USER="n8n"
# Crear directorio si no existe
mkdir -p $BACKUP_DIR
# Backup de PostgreSQL
docker exec $CONTAINER_NAME pg_dump -U $DB_USER $DB_NAME > $BACKUP_DIR/n8n_db_$DATE.sql
# Backup de archivos de configuración
tar -czf $BACKUP_DIR/n8n_files_$DATE.tar.gz -C /home/n8nadmin n8n-docker
# Eliminar respaldos antiguos (mantener 30 días)
find $BACKUP_DIR -name "*.sql" -mtime +30 -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete
echo "Backup completado: $DATE"
Haz el script ejecutable y configura un cron job:
chmod +x /home/n8nadmin/backup-n8n.sh
crontab -e
Añade esta línea para ejecutar respaldos diarios a las 2 AM:
0 2 * * * /home/n8nadmin/backup-n8n.sh >> /home/n8nadmin/backup.log 2>&1
Script de restauración para emergencias:
nano /home/n8nadmin/restore-n8n.sh
#!/bin/bash
if [ "$#" -ne 1 ]; then
echo "Uso: $0 <archivo_backup.sql>"
exit 1
fi
BACKUP_FILE=$1
CONTAINER_NAME="n8n-docker_postgres_1"
DB_NAME="n8n"
DB_USER="n8n"
# Detener n8n
docker-compose stop n8n
# Restaurar base de datos
docker exec -i $CONTAINER_NAME psql -U $DB_USER -d $DB_NAME < $BACKUP_FILE
# Reiniciar servicios
docker-compose start n8n
echo "Restauración completada"
Monitoreo y mantenimiento
Un sistema de monitoreo robusto te alertará sobre problemas antes de que afecten tus workflows críticos. Vamos a configurar monitoreo básico usando herramientas integradas y scripts personalizados.
Script de monitoreo de salud que verifica que todos los servicios estén funcionando:
nano /home/n8nadmin/health-check.sh
#!/bin/bash
# Verificar que los contenedores estén ejecutándose
if ! docker-compose ps | grep -q "Up"; then
echo "ERROR: Contenedores no están ejecutándose" | mail -s "n8n Alert" admin@tuempresa.com
exit 1
fi
# Verificar que n8n responda en HTTP
if ! curl -f http://localhost:5678 > /dev/null 2>&1; then
echo "ERROR: n8n no responde" | mail -s "n8n Alert" admin@tuempresa.com
exit 1
fi
# Verificar espacio en disco
DISK_USAGE=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt 85 ]; then
echo "WARNING: Disco al ${DISK_USAGE}%" | mail -s "n8n Disk Warning" admin@tuempresa.com
fi
echo "Todos los checks pasaron - $(date)"
Configura el script para ejecutarse cada 5 minutos:
chmod +x /home/n8nadmin/health-check.sh
crontab -e
Añade:
*/5 * * * * /home/n8nadmin/health-check.sh >> /home/n8nadmin/health.log 2>&1
Monitoreo de logs para identificar errores:
nano /home/n8nadmin/log-monitor.sh
#!/bin/bash
# Buscar errores en logs de n8n
ERRORS=$(docker-compose logs n8n --since 1h | grep -i error | wc -l)
if [ $ERRORS -gt 5 ]; then
echo "WARNING: $ERRORS errores detectados en la última hora" | mail -s "n8n Error Alert" admin@tuempresa.com
docker-compose logs n8n --since 1h | grep -i error | tail -10 >> /tmp/n8n-errors.log
fi
Optimización de rendimiento
Para obtener el máximo rendimiento de tu instancia de n8n, especialmente cuando manejas workflows complejos o grandes volúmenes de datos, hay varias optimizaciones que puedes implementar.
Configuración de memoria y CPU en Docker Compose:
n8n:
image: n8nio/n8n:latest
deploy:
resources:
limits:
memory: 2G
cpus: '1.0'
reservations:
memory: 1G
cpus: '0.5'
Configuración de PostgreSQL optimizada para mejor rendimiento:
postgres:
image: postgres:13
environment:
POSTGRES_DB: n8n
POSTGRES_USER: n8n
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
command: |
postgres -c max_connections=100
-c shared_buffers=256MB
-c effective_cache_size=1GB
-c maintenance_work_mem=64MB
-c checkpoint_completion_target=0.9
-c wal_buffers=16MB
-c default_statistics_target=100
Variables de entorno de n8n para optimización:
environment:
N8N_PAYLOAD_SIZE_MAX: 16
N8N_METRICS: true
EXECUTIONS_DATA_PRUNE: true
EXECUTIONS_DATA_MAX_AGE: 168 # 7 días
N8N_LOG_LEVEL: warn
Solución de problemas comunes
Durante la operación de tu instancia de n8n, pueden surgir varios problemas comunes. Aquí están las soluciones para los más frecuentes:
n8n no inicia después de reiniciar el servidor:
# Verificar estado de Docker
sudo systemctl status docker
sudo systemctl start docker
# Verificar logs
docker-compose logs
Base de datos corrupta o problemas de conexión:
# Reiniciar solo PostgreSQL
docker-compose restart postgres
# Verificar conexión a la base de datos
docker-compose exec postgres psql -U n8n -d n8n -c "SELECT version();"
Certificados SSL expirados:
# Verificar estado del certificado
sudo certbot certificates
# Renovar manualmente
sudo certbot renew --force-renewal
# Reiniciar Nginx
sudo systemctl restart nginx
Alto uso de memoria:
# Verificar uso de recursos
docker stats
# Limpiar ejecuciones antiguas
docker-compose exec n8n npm run start -- prune
Problemas de permisos:
# Verificar permisos de volúmenes
sudo chown -R 1000:1000 /var/lib/docker/volumes/n8n-docker_n8n_data
# Reiniciar contenedores
docker-compose restart
Actualización y escalamiento
Mantener tu instancia de n8n actualizada es crítico para seguridad y nuevas funcionalidades. También es importante planificar el escalamiento según crezcan tus necesidades.
Proceso de actualización seguro:
# Crear respaldo antes de actualizar
./backup-n8n.sh
# Detener servicios
docker-compose down
# Actualizar imágenes
docker-compose pull
# Reiniciar con nuevas imágenes
docker-compose up -d
# Verificar que todo funciona
docker-compose logs -f n8n
Escalamiento horizontal para alta disponibilidad:
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- '80:80'
- '443:443'
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- n8n-1
- n8n-2
n8n-1:
image: n8nio/n8n:latest
environment:
N8N_WORKERS_AUTO_START: true
# ... resto de configuración
n8n-2:
image: n8nio/n8n:latest
environment:
N8N_WORKERS_AUTO_START: true
# ... resto de configuración
Migración a servidor más potente:
# En servidor actual
./backup-n8n.sh
scp backups/* user@nuevo-servidor:/home/user/
# En nuevo servidor
# Configurar n8n según esta guía
./restore-n8n.sh backup_file.sql
# Actualizar DNS para apuntar al nuevo servidor
Con esta configuración completa, tendrás una instancia de n8n robusta, segura, y escalable que puede manejar las necesidades de automatización más exigentes. La inversión inicial en tiempo se recupera rápidamente con la flexibilidad, control, y ahorro de costes que proporciona el autoalojamiento.
Recuerda que esta configuración es el punto de partida. Según tus necesidades específicas, puedes añadir características adicionales como clustering, replicación de base de datos, integración con sistemas de monitoreo enterprise, o configuraciones de red más complejas.