Servidores Dedicados y VPS12 de diciembre de 2025 72 vistas

Guía de instalación de n8n en un servidor Linux

Guía de instalación de n8n en un servidor Linux

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) y postgres (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.fr with your actual domain
  • YourEncryptionKey32CharactersMin! 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.fr with 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:

  1. Ingrese su dirección de correo electrónico
  2. Acepte los términos de uso
  3. Elija si desea compartir su correo electrónico con la EFF
  4. 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:

  1. Email: Ingrese su dirección de correo electrónico profesional
  2. Nombre y Apellido: Sus datos de identidad
  3. 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:

  1. Haga clic en "Create account" (Crear una cuenta)
  2. Aparecerá un popup para activar la licencia comunitaria (gratuita)
  3. 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:

  1. Haga clic en "Create Workflow" en el menú lateral
  2. Haga clic en el "+" para agregar un nodo
  3. Busque "Schedule Trigger" y agréguelo
  4. Agregue un nodo "Set" para definir datos
  5. Conecte los dos nodos
  6. 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:

  1. Verifique el archivo .env:
    grep WEBHOOK_URL /opt/docker-compose/n8n/.env
    
  2. La URL debe ser https://n8n.votredomaine.fr/
  3. 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:

  1. Verifique el estado de PostgreSQL:
    docker compose logs postgres
    
  2. Verifique la coherencia de las variables en .env
  3. 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


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