EN EN

Устанавливаем n8n на FastPanel с Docker Compose: Понятное руководство

Опубликовано 03.07.2025

В этом руководстве я покажу вам, как легко установить n8n, мощный инструмент для автоматизации рабочих процессов, на ваш сервер с FastPanel, используя Docker Compose. FastPanel отлично подходит для управления веб-серверами, а Docker Compose упрощает развертывание сложных приложений, таких как n8n, с его зависимостями (PostgreSQL и Redis).

Что понадобится

  • Ваш сервер с установленным FastPanel.
  • Домен или поддомен, который вы будете использовать для доступа к n8n (например, n8n.yourdomain.com).
  • Базовые знания работы с SSH и командной строкой.

Шаг 1: Подготовка сервера

Подключаемся к серверу по SSH и создаём директорию:

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

Шаг 2: Создание файлов конфигурации

Понадобятся следующие файлы:

  • 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: Переменные окружения POSTGRES_NON_ROOT_USER или POSTGRES_NON_ROOT_PASSWORD не заданы."
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();

Шаг 3: Запуск n8n с Docker Compose

docker compose up -d

Проверьте статус:

docker compose ps

Все сервисы должны быть в статусе running или healthy.


Шаг 4: Настройка FastPanel

  1. Зайдите в FastPanel → СайтыДобавить сайт.

  2. Используйте домен, указанный в .env (n8n.yourdomain.com).

  3. После создания:

    • Перейдите в настройки сайта.
    • Включите Обратный прокси (Reverse Proxy).
    • Укажите адрес: 127.0.0.1:5678.
    • Убедитесь, что выдан SSL (обычно Let’s Encrypt автоматически).

Поддержка WebSocket (если потребуется вручную):

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

Шаг 5: Доступ к n8n

Откройте в браузере:

https://n8n.yourdomain.com

Вы увидите приветственную страницу n8n. Всё готово — можно создавать автоматизации!


Если у вас возникли вопросы или проблемы — задавайте их в комментариях.

Похожие посты

Свяжитесь со мной

Обсудим ваш проект и найдём подходящее решение