Bandera: Русский Русский Bandera: English English

Instalamos n8n en FastPanel con Docker Compose: Guía clara

Publicado el 03.07.2025

En esta guía le mostraré cómo instalar fácilmente n8n, una potente herramienta para la automatización de flujos de trabajo, en su servidor con FastPanel, usando Docker Compose. FastPanel es ideal para la gestión de servidores web, y Docker Compose facilita el despliegue de aplicaciones complejas como n8n con sus dependencias (PostgreSQL y Redis).

Qué necesitarás

  • Su servidor con FastPanel instalado.
  • Un dominio o subdominio que usará para acceder a n8n (por ejemplo, n8n.yourdomain.com).
  • Conocimientos básicos de SSH y la línea de comandos.

Paso 1: Preparación del servidor

Conéctese al servidor por SSH y cree el directorio:

sudo mkdir -p /opt/n8n_stack
cd /opt/n8n_stack

Paso 2: Creación de los archivos de configuración

Necesitará los siguientes archivos:

  • docker-compose.yml
  • .env
  • init-data.sh
  • healthcheck.js

2.1. docker-compose.yml

nano docker-compose.yml
version: '3.8'

x-shared: &shared
  restart: always
  image: docker.n8n.io/n8nio/n8n:1.91.3
  env_file: .env
  user: "1000:1000"
  volumes:
    - /opt/n8n_stack/n8n_storage:/home/node/.n8n
    - ./healthcheck.js:/healthcheck.js
  depends_on:
    redis:
      condition: service_healthy
    postgres:
      condition: service_healthy

services:
  postgres:
    image: postgres:11
    restart: always
    env_file: .env
    volumes:
      - /opt/n8n_stack/db_storage:/var/lib/postgresql/data
      - ./init-data.sh:/docker-entrypoint-initdb.d/init-data.sh
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}']
      interval: 5s
      timeout: 5s
      retries: 10

  redis:
    image: redis:6-alpine
    restart: always
    volumes:
      - /opt/n8n_stack/redis_storage:/data
    healthcheck:
      test: ['CMD', 'redis-cli', 'ping']
      interval: 5s
      timeout: 5s
      retries: 10

  n8n:
    <<: *shared
    ports:
      - "127.0.0.1:5678:5678"
    healthcheck:
      test: ["CMD", "node", "/healthcheck.js"]
      interval: 5s
      timeout: 5s
      retries: 10

  n8n-worker:
    <<: *shared
    command: worker
    depends_on:
      - n8n
    healthcheck:
      test: ["CMD-SHELL", "wget -q -O - http://localhost:5678/healthz || exit 1"]
      interval: 5s
      timeout: 5s
      retries: 10

2.2. .env

nano .env
# n8n
N8N_HOST=your_n8n_domain.com
N8N_PORT=5678
N8N_PROTOCOL=https
WEBHOOK_URL=https://your_n8n_domain.com/
N8N_ENCRYPTION_KEY=your_secure_password_for_n8n
GENERIC_TIMEZONE=Europe/Moscow
TZ=Europe/Moscow
DB_TYPE=postgresdb
DB_POSTGRESDB_HOST=postgres
DB_POSTGRESDB_PORT=5432
DB_POSTGRESDB_DATABASE=your_db_name
DB_POSTGRESDB_USER=your_non_root_db_user
DB_POSTGRESDB_PASSWORD=your_non_root_db_password

# PostgreSQL (root)
POSTGRES_DB=your_db_name
POSTGRES_USER=your_db_user
POSTGRES_PASSWORD=your_db_password

# PostgreSQL (non-root for n8n)
POSTGRES_NON_ROOT_USER=your_non_root_db_user
POSTGRES_NON_ROOT_PASSWORD=your_non_root_db_password

2.3. init-data.sh

nano init-data.sh
#!/bin/bash
set -e;

if [ -n "${POSTGRES_NON_ROOT_USER:-}" ] && [ -n "${POSTGRES_NON_ROOT_PASSWORD:-}" ]; then
    psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
        CREATE EXTENSION IF NOT EXISTS "pgcrypto";
        CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
        DO
        \$do\$
        BEGIN
           IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = '${POSTGRES_NON_ROOT_USER}') THEN
              CREATE USER "${POSTGRES_NON_ROOT_USER}" WITH PASSWORD '${POSTGRES_NON_ROOT_PASSWORD}';
           ELSE
              ALTER USER "${POSTGRES_NON_ROOT_USER}" WITH PASSWORD '${POSTGRES_NON_ROOT_PASSWORD}';
           END IF;
        END
        \$do\$;
        GRANT ALL PRIVILEGES ON DATABASE "${POSTGRES_DB}" TO "${POSTGRES_NON_ROOT_USER}";
EOSQL
else
    echo "SETUP INFO: Las variables de entorno POSTGRES_NON_ROOT_USER o POSTGRES_NON_ROOT_PASSWORD no están definidas."
fi
chmod +x init-data.sh

2.4. healthcheck.js

nano healthcheck.js
var http = require('http');

var options = {
  host: '127.0.0.1',
  port: 5678,
  path: '/healthz',
  method: 'GET',
};

var req = http.request(options, function(res) {
  console.log('STATUS: ' + res.statusCode);
  process.exit(res.statusCode === 200 ? 0 : 1);
});

req.on('error', function(e) {
  console.log('ERROR: ' + e.message);
  process.exit(1);
});

req.end();

Paso 3: Iniciar n8n con Docker Compose

docker compose up -d

Compruebe el estado:

docker compose ps

Todos los servicios deben tener el estado running o healthy.


Paso 4: Configuración de FastPanel

  1. Entra en FastPanel → SitiosAgregar sitio.

  2. Usa el dominio indicado en .env (n8n.yourdomain.com).

  3. Después de crear el sitio:

    • Vaya a la configuración del sitio.
    • Habilite Proxy inverso (Reverse Proxy).
    • Indique la dirección: 127.0.0.1:5678.
    • Asegúrese de que se haya emitido el certificado SSL (normalmente Let’s Encrypt lo hace automáticamente).

Soporte WebSocket (si es necesario configurar manualmente):

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

Paso 5: Acceso a n8n

Abra en el navegador:

https://n8n.yourdomain.com

Verá la página de bienvenida de n8n. Todo está listo — puede comenzar a crear automatizaciones.


Si tiene preguntas o problemas — déjelos en los comentarios.

Reseñas relacionadas

¿Necesitas ayuda?

Escríbeme y te ayudaré a resolver el problema

Publicaciones relacionadas