opened image

Как развернуть n8n в Docker на сервере с Hestia CP

 

 

Размещение n8n в контейнерах Docker обеспечивает изоляцию зависимостей, простое масштабирование и беспроблемные обновления, а панель управления Hestia CP берёт на себя заботу о веб‑хостинге, SSL‑сертификатах и резервном копировании. В этой инструкции мы последовательно развернём Docker‑окружение, установим n8n через Docker Compose и подключим его к фронтенду Nginx, управляемому Hestia CP.

 

Зачем сочетать n8n + Docker + Hestia CP

  • n8n — мощный инструмент автоматизации (iPaaS), который удобно работать в контейнере.

  • Docker Compose изолирует сервисы (PostgreSQL, Redis, n8n-web, n8n-worker) и упрощает обновление.

  • Hestia CP закрывает администрирование доменов, почты и SSL, а мы используем её Nginx-фронт вместо того, чтобы публиковать контейнер напрямую.

 

 

Предварительные требования

 

КомпонентМинимальная версияКомментарий
Ubuntu 22.04 LTSПроверенные пакеты Docker + systemd
Hestia CP1.8.xВключён Nginx + Apache (proxy)
Docker Engine≥ 24sudo apt-get install docker-ce docker-ce-cli containerd.io
Compose plugin≥ 2.xsudo apt-get install docker-compose-plugin
Доменn8n.example.comA-/AAAA-запись на IP вашего VPS

 

 

 

Часть 1. Установка Docker и Docker Compose

 

Целевая ОС: Ubuntu 22.04 LTS (рекомендована Hestia CP ≥ 1.8)

 

Подготовьте репозиторий Docker CE.

 

 

sudo apt update && sudo apt install -y \
  ca-certificates curl gnupg lsb-release

# Каталог для ключей APT
sudo install -m 0755 -d /etc/apt/keyrings

# Добавляем официальный GPG‑ключ
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Файл источника пакетов
echo "deb [arch=$(dpkg --print-architecture) \
  signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 

 

Установите движок Docker и дополнительные плагины.

 

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin

 

 

Docker Compose v2 теперь поставляется как плагин (docker compose). Если вам всё ещё нужен самостоятельный бинарник v1, скачайте его отдельно:

 

sudo curl -L \
  https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 \
  -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

 

 

Добавьте пользователя в группу docker (необязательно, но удобно).

 

sudo usermod -aG docker $USER
newgrp docker    # применить изменения сразу

 

 

Проверьте установку.

 

docker --version        # Docker Engine
docker compose version  # Compose v2 plugin

 

 

Вы должны увидеть актуальные версии без ошибок.

 

 

Часть 2. Подготовка проекта n8n

 

Следующая структура папок позволит легко бэкапить данные и обновляться без простоев:

 

/opt/n8n/
├── docker-compose.yml   # состав сервисов
├── .env                 # переменные окружения (защищённые)
└── volumes/             # постоянные данные
    ├── pg_data/
    ├── redis_data/
    └── n8n_data/

 

 

Создайте каталог и файл переменных

 

mkdir -p /opt/n8n/volumes
chown -R $USER:$USER /opt/n8n
cd /opt/n8n
vim .env       
chmod 600 .env  

 

 

Создаем .env

 

# Версия n8n
N8N_VERSION=1.101.0

# Внешний URL (обязательно `/` в конце)
WEBHOOK_URL=https://n8n.example.com/
GENERIC_TIMEZONE=Europe/Kyiv

# Базовая авторизация
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=<СЛУЧАЙНЫЙ_ПАРОЛЬ>

# Postgres
POSTGRES_USER=n8n
POSTGRES_PASSWORD=<СЛУЧАЙНЫЙ_ПАРОЛЬ>
POSTGRES_DB=n8n

# Очереди и шифрование
N8N_RUNNERS_ENABLED=true
OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS=true
N8N_ENCRYPTION_KEY=$(openssl rand -base64 32)

 

 

Подготовьте docker-compose.yml

 

services:
  postgres:
    image: postgres:15-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    volumes:
      - pg_data:/var/lib/postgresql/data
    networks: [n8nnet]

  redis:
    image: redis:7-alpine
    restart: unless-stopped
    volumes:
      - redis_data:/data
    networks: [n8nnet]

  n8n-main:
    image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
    depends_on: [postgres, redis]
    restart: unless-stopped
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_PORT: 5432
      DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
      DB_POSTGRESDB_USER: ${POSTGRES_USER}
      DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
      QUEUE_BULL_REDIS_HOST: redis
      EXECUTIONS_MODE: queue
      N8N_BASIC_AUTH_ACTIVE: "true"
      N8N_BASIC_AUTH_USER: ${N8N_BASIC_AUTH_USER}
      N8N_BASIC_AUTH_PASSWORD: ${N8N_BASIC_AUTH_PASSWORD}
      WEBHOOK_URL: ${WEBHOOK_URL}
      GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
      N8N_SECURE_COOKIE: "true"
      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
      N8N_HOST: n8n.example.com
      N8N_PORT: 5678
      N8N_RUNNERS_ENABLED: "true"
      OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS: "true"
      N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
    volumes:
      - n8n_data:/home/node/.n8n
    ports:
      - "127.0.0.1:5678:5678"   # доступ только с localhost
    networks: [n8nnet]

  n8n-worker:
    image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
    depends_on: [postgres, redis]
    restart: unless-stopped
    command: worker
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_PORT: 5432
      DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
      DB_POSTGRESDB_USER: ${POSTGRES_USER}
      DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
      QUEUE_BULL_REDIS_HOST: redis
      EXECUTIONS_MODE: queue
      GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
      N8N_RUNNERS_ENABLED: "true"
      N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
    networks: [n8nnet]

volumes:
  pg_data:
  redis_data:
  n8n_data:

networks:
  n8nnet:

 

 

Запуск сервисов

 

cd /opt/n8n
docker compose pull         # Скачать (или обновить) образы
docker compose up -d        # Запустить в фоне
docker compose logs -f n8n-main   # Следить за стартом

 

Проверка:

 

docker compose ps        # все контейнеры должны быть в состоянии Up

 

 

Часть 3. Интеграция с Hestia CP / Nginx

 

  1. Web → Add Web Domain → укажите n8n.example.com, включите «Enable SSL» и «Force SSL».

  2. Сгенерируйте сертификат Let’s Encrypt.

  3. В панели Hestia перейдите Web → Edit → «SSL Certificates» и убедитесь, что ключи появились.

  4. Откройте интерфейс по адресу https://n8n.example.com — браузер запросит логин и пароль Basic Auth, затем загрузится UI n8n.

 

 

Шаблон Nginx для проксирования

 

Создайте кастомный шаблон, чтобы при обновлениях Hestia не перезаписала конфиг:


 
sudo mkdir -p /usr/local/hestia/data/templates/web/nginx/n8n
sudo vim /usr/local/hestia/data/templates/web/nginx/n8n/n8n.tpl        # HTTP
sudo vim /usr/local/hestia/data/templates/web/nginx/n8n/n8n.stpl       # HTTPS

 

Содержимое n8n.stpl (SSL-вариант):

server {
    listen      %ip%:%ssl_port% ssl;
    server_name %domain_idn%;

    ssl_certificate     %ssl_pem%;
    ssl_certificate_key %ssl_key%;
    include             %home%/%user%/conf/web/%domain%/nginx.hsts.conf*;

    # WebSocket & HTTP
    location / {
        proxy_pass http://127.0.0.1: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_read_timeout 86400;
    }

    # Скрываем служебные файлы
    location ~ /\.(?!well-known\/|file) { deny all; }

    location /error/ {
        alias %docroot%/document_errors/;
    }
}

 

 

Важно: HTTP-шаблон (n8n.tpl) может просто принудительно переадресовать на HTTPS (include nginx.forcessl.conf*;).

 

Примените шаблон в панели Hestia (Web → Edit Web Domain → Advanced Options → Backend Template).

 

Перезапустите стек Hestia, чтобы подхватить новый шаблон:


 
systemctl restart hestia

 

 

Заключение

 

Связка Hestia CP + Docker Compose даёт чистое разделение ролей:

  • Hestia отвечает за HTTP(S), SSL, почту и удобную панель для разработчика.

  • Docker — за «живучие» сервисы (Postgres, Redis, n8n-main, n8n-worker), которые можно масштабировать, обновлять и бэкапить без риска тронуть окружение системы.

 

Следуя шагам выше, вы получите надёжную, масштабируемую и безопасную установку n8n, готовую обслуживать как тестовые прототипы, так и продакшен-автоматики.