Guía de instalación de n8n en servidor Linux
¿Qué es n8n?
n8n (pronunciado "n-ocho-n") es una plataforma de automatización de flujos de trabajo de código abierto y autohospedada. Permite conectar diferentes aplicaciones y servicios entre sí para automatizar tareas repetitivas, todo a través de una interfaz visual intuitiva de tipo "arrastrar y soltar".
n8n se presenta a menudo como una alternativa autohospedada a soluciones SaaS como Zapier, Make (anteriormente Integromat) o Microsoft Power Automate, con la ventaja de mantener el control total sobre sus datos.
Funcionalidades principales
- +400 integraciones nativas : Gmail, Slack, Notion, GitHub, Google Sheets, Stripe, bases de datos, APIs REST, etc.
- Editor visual de flujos de trabajo : Creación de flujos de trabajo mediante arrastrar y soltar
- Nodos de IA integrados : Soporte nativo de OpenAI, Ollama y otros modelos LLM
- Ejecución por eventos : Webhooks, programación cron, disparadores manuales
- Código personalizado : Posibilidad de integrar JavaScript o Python en los flujos de trabajo
- API completa : Gestión programática de flujos de trabajo
- Múltiples usuarios : Gestión de equipos y permisos (versión Enterprise)
Casos de uso típicos
- Sincronización automática de datos entre aplicaciones
- Notificaciones y alertas automatizadas
- Recopilación y procesamiento de clientes potenciales de marketing
- Automatización de informes y paneles de control
- Integración con herramientas de IA para análisis de datos
- Automatización DevOps (CI/CD, monitoreo, alertas)
Versión documentada
Esta guía cubre la instalación de n8n versión 1.123.x (versión estable recomendada para producción).
ℹ️ Nota : La versión 2.0 está actualmente en beta (diciembre 2025). Trae mejoras de seguridad y estabilidad, pero requiere una migración. Para un entorno de producción, recomendamos la versión estable 1.x.
Requisitos previos
Configuración de hardware
| Recurso | Mínimo | Recomendado (Producción) |
|---|---|---|
| CPU | 2 núcleos | 4 núcleos |
| RAM | 2 GB | 4-8 GB |
| Almacenamiento | 10 GB SSD | 50 GB SSD |
| Ancho de banda | 100 Mbps | 1 Gbps |
💡 Consejo : Para flujos de trabajo complejos o un uso intensivo con muchos usuarios, considere 8 GB de RAM y un mínimo de 4 núcleos de CPU.
Software requerido
| Software | Versión mínima | Rol |
|---|---|---|
| Sistema operativo | Debian 12 / Ubuntu 22.04+ | OS servidor |
| Docker | 20.10+ | Contenerización |
| Docker Compose | 2.0+ (plugin) | Orquestación de contenedores |
| Nginx | 1.18+ | Proxy inverso |
| Certbot | 2.0+ | Certificados SSL Let's Encrypt |
Puertos de red utilizados
| Puerto | Protocolo | Uso | Exposición |
|---|---|---|---|
| 22 | TCP | SSH | Externo (administración) |
| 80 | TCP | HTTP (redirección HTTPS) | Externo |
| 443 | TCP | HTTPS | Externo |
| 5678 | TCP | n8n (interno) | Solo localhost |
| 5432 | TCP | PostgreSQL (interno) | Solo localhost |
Nombre de dominio y DNS
Antes de comenzar, asegúrese de tener :
- Un nombre de dominio o subdominio (ej:
n8n.votredomaine.fr) - Un registro DNS de tipo A apuntando a la IP pública de su servidor
Ejemplo de configuración DNS :
n8n.votredomaine.fr. IN A 203.0.113.50
Instalación paso a paso
Etapa 1 : Actualización del sistema
Conéctese a su servidor por SSH y actualice los paquetes :
sudo apt update && sudo apt upgrade -y
Este comando actualiza la lista de paquetes disponibles e instala las últimas versiones de los paquetes instalados.
Etapa 2 : Instalación de Docker
Instale las dependencias necesarias :
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
Agregue la clave GPG oficial de Docker :
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release && echo "$ID")/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Agregue el repositorio de Docker :
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/$(. /etc/os-release && echo "$ID") $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Instale Docker Engine y el complemento Compose :
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
Agregue su usuario al grupo docker (para evitar el uso de sudo) :
sudo usermod -aG docker $USER
newgrp docker
Punto de verificación : Verifique la instalación :
docker --version
docker compose version
Debería ver las versiones instaladas (Docker 24.x+ y Compose 2.x+).
Etapa 3 : Creación de la estructura de directorios
Cree el directorio de trabajo para n8n :
sudo mkdir -p /opt/docker-compose/n8n
cd /opt/docker-compose/n8n
Cree los subdirectorios para los datos persistentes :
sudo mkdir -p n8n_data postgres_data
Asigne los permisos correctos :
sudo chown -R 1000:1000 n8n_data
sudo chown -R 999:999 postgres_data
ℹ️ Explicación : Los UID 1000 y 999 corresponden respectivamente a los usuarios
node(en el contenedor n8n) ypostgres(en el contenedor PostgreSQL).
Etapa 4 : Creación del archivo de entorno
Cree el archivo .env para almacenar las variables sensibles :
sudo nano /opt/docker-compose/n8n/.env
Agregue el siguiente contenido modificando los valores :
# ===========================================
# Configuration n8n - OuiHeberg
# ===========================================
# Domain and URL
N8N_HOST=n8n.yourdomain.fr
N8N_PORT=5678
N8N_PROTOCOL=https
WEBHOOK_URL=https://n8n.yourdomain.fr/
# Security
N8N_ENCRYPTION_KEY=YourEncryptionKey32CharactersMin!
N8N_PROXY_HOPS=1
# Timezone
GENERIC_TIMEZONE=Europe/Paris
TZ=Europe/Paris
# PostgreSQL database
DB_TYPE=postgresdb
DB_POSTGRESDB_HOST=postgres
DB_POSTGRESDB_PORT=5432
DB_POSTGRESDB_DATABASE=n8n
DB_POSTGRESDB_USER=n8n
DB_POSTGRESDB_PASSWORD=YourPostgresPassword123!
# PostgreSQL variables (for the container)
POSTGRES_DB=n8n
POSTGRES_USER=n8n
POSTGRES_PASSWORD=YourPostgresPassword123!
POSTGRES_NON_ROOT_USER=n8n
POSTGRES_NON_ROOT_PASSWORD=YourPostgresPassword123!
⚠️ Important: Replace the following:
n8n.yourdomain.frwith your actual domainYourEncryptionKey32CharactersMin!with a unique and complex key (min. 32 characters)YourPostgresPassword123!with a secure password
Generate a secure encryption key:
openssl rand -hex 32
Step 5: Creating the Docker Compose file
Create the docker-compose.yml file:
sudo nano /opt/docker-compose/n8n/docker-compose.yml
Add the following content:
version: '3.8'
services:
# ===========================================
# PostgreSQL database
# ===========================================
postgres:
image: postgres:15-alpine
container_name: n8n-postgres
restart: unless-stopped
environment:
- POSTGRES_DB=${POSTGRES_DB}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
volumes:
- ./postgres_data:/var/lib/postgresql/data
networks:
- n8n-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
# ===========================================
# n8n application
# ===========================================
n8n:
image: docker.n8n.io/n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
# General configuration
- N8N_HOST=${N8N_HOST}
- N8N_PORT=${N8N_PORT}
- N8N_PROTOCOL=${N8N_PROTOCOL}
- WEBHOOK_URL=${WEBHOOK_URL}
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- N8N_PROXY_HOPS=${N8N_PROXY_HOPS}
# Timezone
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
- TZ=${TZ}
# Database
- DB_TYPE=${DB_TYPE}
- DB_POSTGRESDB_HOST=${DB_POSTGRESDB_HOST}
- DB_POSTGRESDB_PORT=${DB_POSTGRESDB_PORT}
- DB_POSTGRESDB_DATABASE=${DB_POSTGRESDB_DATABASE}
- DB_POSTGRESDB_USER=${DB_POSTGRESDB_USER}
- DB_POSTGRESDB_PASSWORD=${DB_POSTGRESDB_PASSWORD}
ports:
- "127.0.0.1:5678:5678"
volumes:
- ./n8n_data:/home/node/.n8n
networks:
- n8n-network
networks:
n8n-network:
driver: bridge
💡 Note: Port 5678 is exposed only on
127.0.0.1(localhost) for security reasons. External access will be through the Nginx reverse proxy.
Step 6: Starting the containers
Launch the containers in the background:
cd /opt/docker-compose/n8n
docker compose up -d
Checkpoint: Check that the containers are running:
docker compose ps
You should see the two containers (n8n and n8n-postgres) with status Up or running (healthy).
Check logs in case of issues:
docker compose logs -f n8n
Test local access:
curl http://localhost:5678/healthz
The response should be {"status":"ok"}.
Configuration
Nginx reverse proxy configuration
Nginx Installation
sudo apt install -y nginx
Check if Nginx is active:
sudo systemctl status nginx
Creating the configuration file
Create the configuration file for n8n:
sudo nano /etc/nginx/sites-available/n8n
Add the following content:
# ===========================================
# Nginx Configuration for n8n - OuiHeberg
# ===========================================
# Map for WebSocket management
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
# HTTP to HTTPS redirection
server {
listen 80;
listen [::]:80;
server_name n8n.yourdomain.fr;
# Permanent redirection to HTTPS
return 301 https://$host$request_uri;
}
# HTTPS configuration
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name n8n.yourdomain.fr;
# SSL Certificates (to be configured by Certbot)
# ssl_certificate /etc/letsencrypt/live/n8n.yourdomain.fr/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/n8n.yourdomain.fr/privkey.pem;
# Recommended SSL settings
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
# Security headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# Maximum upload size (important for workflows with files)
client_max_body_size 50M;
# Timeouts for long workflows
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
location / {
proxy_pass http://127.0.0.1:5678;
proxy_http_version 1.1;
# WebSocket support (essential for the n8n editor)
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
# Proxy headers
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 X-Forwarded-Host $host;
# Disable buffering for real-time events
proxy_buffering off;
proxy_cache off;
chunked_transfer_encoding off;
}
}
⚠️ Important: Replace
n8n.yourdomain.frwith your actual domain.
Enable the configuration:
sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
Remove the default configuration if it exists:
sudo rm -f /etc/nginx/sites-enabled/default
Test the Nginx configuration:
sudo nginx -t
Obtaining the Let's Encrypt SSL certificate
Install Certbot with the Nginx plugin:
sudo apt install -y certbot python3-certbot-nginx
Obtain the SSL certificate:
sudo certbot --nginx -d n8n.yourdomain.fr
Siga las instrucciones:
- Ingrese su dirección de correo electrónico
- Acepte los términos de uso
- Elija si desea compartir su correo electrónico con la EFF
- Certbot configurará automáticamente Nginx para HTTPS
Punto de verificación: Verifique la renovación automática:
sudo certbot renew --dry-run
Reinicie Nginx para aplicar todos los cambios:
sudo systemctl restart nginx
Variables de entorno importantes
| Variable | Descripción | Valor por defecto |
|---|---|---|
N8N_HOST |
Nombre de dominio de la instancia | localhost |
N8N_PORT |
Puerto de escucha interno | 5678 |
N8N_PROTOCOL |
Protocole (http/https) | http |
WEBHOOK_URL |
URL pública para los webhooks | - |
N8N_ENCRYPTION_KEY |
Clave de cifrado de las credenciales | - |
N8N_PROXY_HOPS |
Número de proxies delante de n8n | 0 |
GENERIC_TIMEZONE |
Fuso horario | UTC |
DB_TYPE |
Tipo de base de datos (postgresdb/sqlite) | sqlite |
N8N_METRICS |
Activar las métricas Prometheus | false |
N8N_LOG_LEVEL |
Nivel de log (info/debug/warn/error) | info |
Primera utilización
Acceso a la interfaz
Abra su navegador y acceda a:
https://n8n.votredomaine.fr
Configuración inicial
En el primer acceso, n8n le pedirá que cree una cuenta de propietario:
- Email: Ingrese su dirección de correo electrónico profesional
- Nombre y Apellido: Sus datos de identidad
- Contraseña: Elija una contraseña segura (mín. 8 caracteres, mayúsculas, números, caracteres especiales)
Creación de la cuenta administrador
Después de completar el formulario:
- Haga clic en "Create account" (Crear una cuenta)
- Aparecerá un popup para activar la licencia comunitaria (gratuita)
- Haga clic en "Activate" para disfrutar de todas las funcionalidades self-hosted
💡 Consejo: La licencia comunitaria es gratuita y brinda acceso a todas las funcionalidades de automatización sin restricciones.
Primer flujo de trabajo
Para probar su instalación:
- Haga clic en "Create Workflow" en el menú lateral
- Haga clic en el "+" para agregar un nodo
- Busque "Schedule Trigger" y agréguelo
- Agregue un nodo "Set" para definir datos
- Conecte los dos nodos
- Haga clic en "Execute Workflow" para probar
Mantenimiento
Actualización de n8n
Para actualizar n8n a la última versión:
cd /opt/docker-compose/n8n
# Detener los contenedores
docker compose down
# Descargar la nueva imagen
docker compose pull
# Reiniciar
docker compose up -d
# Verificación
docker compose ps
⚠️ Antes de cualquier actualización importante (ej: 1.x a 2.x), consulte las notas de la versión y realice una copia de seguridad completa.
Copia de seguridad
Copia de seguridad completa (recomendada)
Cree un script de copia de seguridad /opt/docker-compose/n8n/backup.sh:
#!/bin/bash
# ===========================================
# Script de copia de seguridad n8n - OuiHeberg
# ===========================================
BACKUP_DIR="/opt/backups/n8n"
DATE=$(date +%Y%m%d_%H%M%S)
N8N_DIR="/opt/docker-compose/n8n"
# Creación del directorio de copia de seguridad
mkdir -p $BACKUP_DIR
# Copia de seguridad de la base de datos PostgreSQL
docker exec n8n-postgres pg_dump -U n8n n8n > $BACKUP_DIR/n8n_db_$DATE.sql
# Copia de seguridad de los archivos n8n
tar -czf $BACKUP_DIR/n8n_data_$DATE.tar.gz -C $N8N_DIR n8n_data
# Copia de seguridad de los archivos de configuración
tar -czf $BACKUP_DIR/n8n_config_$DATE.tar.gz -C $N8N_DIR .env docker-compose.yml
# Limpieza de copias de seguridad de más de 30 días
find $BACKUP_DIR -type f -mtime +30 -delete
echo "Copia de seguridad terminada: $DATE"
Haga que el script sea ejecutable y prográmelo:
sudo chmod +x /opt/docker-compose/n8n/backup.sh
# Agregar al cron (copia de seguridad diaria a las 3 de la madrugada)
echo "0 3 * * * /opt/docker-compose/n8n/backup.sh >> /var/log/n8n-backup.log 2>&1" | sudo tee -a /etc/crontab
Restauración
Para restaurar desde una copia de seguridad:
cd /opt/docker-compose/n8n
# Detener los contenedores
docker compose down
# Restaurar la base de datos
cat /opt/backups/n8n/n8n_db_YYYYMMDD_HHMMSS.sql | docker exec -i n8n-postgres psql -U n8n n8n
# Restaurar los archivos n8n
tar -xzf /opt/backups/n8n/n8n_data_YYYYMMDD_HHMMSS.tar.gz -C /opt/docker-compose/n8n/
# Reiniciar
docker compose up -d
Logs y monitoreo
Consulta de logs
# Logs n8n en tiempo real
docker compose logs -f n8n
# Logs PostgreSQL
docker compose logs -f postgres
# Últimas 100 líneas de logs n8n
docker compose logs --tail=100 n8n
Verificación del estado de los servicios
# Estado de los contenedores
docker compose ps
# Uso de recursos
docker stats n8n n8n-postgres
# Espacio en disco utilizado
docker system df
Endpoint de salud
n8n expone un endpoint de salud accesible localmente:
curl http://localhost:5678/healthz
Depuración
Problemas comunes y soluciones
1. "Connection lost" en el editor
Causa: Problema de WebSocket con el reverse proxy.
Solución:
# Verifique la configuración Nginx
sudo nginx -t
# Asegúrese de que estas líneas estén presentes en la configuración Nginx:
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection $connection_upgrade;
2. Los webhooks no funcionan
Causa: URL de webhook incorrecta o variable WEBHOOK_URL no definida.
Solución:
- Verifique el archivo
.env:grep WEBHOOK_URL /opt/docker-compose/n8n/.env - La URL debe ser
https://n8n.votredomaine.fr/ - Reinicie n8n después de la modificación:
docker compose restart n8n
3. Error "EACCES: permission denied"
Causa: Permisos incorrectos en los volúmenes.
Solución:
sudo chown -R 1000:1000 /opt/docker-compose/n8n/n8n_data
sudo chown -R 999:999 /opt/docker-compose/n8n/postgres_data
sudo chmod -R 755 /opt/docker-compose/n8n/n8n_data
4. "Connection to database failed"
Causa: PostgreSQL no está listo o credenciales incorrectas.
Solución:
- Verifique el estado de PostgreSQL:
docker compose logs postgres - Verifique la coherencia de las variables en
.env - Prueba la conexión:
docker exec -it n8n-postgres psql -U n8n -d n8n -c "SELECT 1;"
5. La interfaz es lenta o no responde
Causa: Recursos insuficientes.
Solución:
# Verificar el uso de recursos
docker stats
# Si la RAM está saturada, aumentarla o agregar límites:
# En docker-compose.yml, bajo el servicio n8n:
# deploy:
# resources:
# limits:
# memory: 2G
Comandos de diagnóstico
# Estado completo del sistema Docker
docker system info
# Inspección del contenedor n8n
docker inspect n8n
# Verificación de las redes Docker
docker network ls
docker network inspect n8n_n8n-network
# Prueba de conectividad interna
docker exec n8n ping -c 3 postgres
# Verificación de los puertos utilizados
sudo netstat -tlnp | grep -E "80|443|5678"
Dónde encontrar ayuda
- Documentación oficial: https://docs.n8n.io
- Foro comunitario: https://community.n8n.io
- GitHub Issues: https://github.com/n8n-io/n8n/issues
- Discord: Serveur communautaire n8n
Recursos
Enlaces oficiales
| Recurso | URL |
|---|---|
| Site officiel | https://n8n.io |
| Documentación | https://docs.n8n.io |
| GitHub | https://github.com/n8n-io/n8n |
| Docker Hub | https://hub.docker.com/r/n8nio/n8n |
| Foro | https://community.n8n.io |
| Notes de version | https://docs.n8n.io/release-notes/ |
| Blog oficial | https://blog.n8n.io |
Plantillas de flujos de trabajo
n8n propone una biblioteca de flujos de trabajo listos para usar:
Integraciones populares
- Google Workspace (Gmail, Sheets, Drive, Calendar)
- Slack, Discord, Microsoft Teams
- GitHub, GitLab, Bitbucket
- Notion, Airtable, Coda
- Stripe, PayPal
- OpenAI, Anthropic, Ollama
Anexo: Configuración avanzada
Activación de métricas Prometheus
Agregar en el archivo .env:
N8N_METRICS=true
N8N_METRICS_PREFIX=n8n_
Las métricas estarán disponibles en http://localhost:5678/metrics.
Configuración SMTP para las notificaciones
Agregar en el archivo .env:
N8N_EMAIL_MODE=smtp
N8N_SMTP_HOST=smtp.votredomaine.fr
N8N_SMTP_PORT=587
[email protected]
N8N_SMTP_PASS=VotreMotDePasseSMTP
[email protected]
N8N_SMTP_SSL=false
Modo cola con Redis (alta disponibilidad)
Para despliegues con alta carga, n8n admite un modo "cola" con Redis:
# Agregar este servicio en docker-compose.yml
redis:
image: redis:7-alpine
container_name: n8n-redis
restart: unless-stopped
networks:
- n8n-network
Y estas variables en .env:
EXECUTIONS_MODE=queue
QUEUE_BULL_REDIS_HOST=redis
QUEUE_BULL_REDIS_PORT=6379
Guía redactada por OuiHeberg - Diciembre 2025 Última actualización: 12/12/2025

