opened image

Production Stack для n8n: Postgres + Redis + Queue Mode

 

 

Когда число воркфлоу зашкаливает, а каждая секунда простоя обходится дорого, «песочницы» на SQLite становится мало. Продакшн требует:

  • устойчивого к сбоям хранилища (Postgres),

  • брокера очередей для распараллеливания задач (Redis),

  • возможности горизонтально масштабировать воркеры (Queue Mode).

Ниже приведён лаконичный, но полный рецепт установки такого стека в Docker Compose. Руководство рассчитано на системных администраторов, которые отвечают не только за «чтоб работало», но и за SLA, бэкапы и мониторинг.

 

 

Почему Postgres + Redis?

 

  • Postgres обеспечивает журналируемые транзакции, миграции схемы и «горячие» бэкапы через pg_dump.

  • Redis в роли движка BullMQ хранит очереди, позволяя равномерно распределять нагрузку между несколькими воркерами и мгновенно восстанавливаться после перезапуска.

  • Queue Mode («EXECUTIONS_MODE=queue») разделяет UI-процесс и воркеры, исключая узкое место single-thread NodeJS.

 

⚠️ Обратите внимание: для использования n8n в кластерном режиме (с поддержкой worker’ов, масштабирования и высокой доступности) требуется лицензионный ключ. Если вы запускаете n8n как один контейнер без кластеризации — ключ не нужен, и система полностью бесплатна в рамках Community Edition.

 

Аппаратные требования

 

РесурсМинимумРекомендовано
CPU2 vCPU4–8 vCPU
RAM4 ГиБ8–16 ГиБ
Диск20 ГиБ50 ГиБ+ SSD
Сеть100 Мбит1 Гбит

 

 

Установка Docker


 
mkdir -p /opt/n8n && sudo chown $USER /opt/n8n
cd /opt/n8n

# Устанавливаем Compose (если ещё нет)

apt  install -y ca-certificates curl gnupg lsb-release
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg |   gpg --dearmor -o /etc/apt/keyrings/docker.gpg

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


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

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

 

Сгенерируй ключ (если у тебя ещё его нет):

 
openssl rand -base64 32

 

Пример:

 
J4KFz+WkJDJcPf4vEyRyM4EVuPu7z33fIQF9vN84dNY=

 

  Оформляем .env с ключом:

 

N8N_VERSION=1.101.0
WEBHOOK_URL=https://your.website/
GENERIC_TIMEZONE=Europe/Kyiv

# Auth
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=StrongDBPass123!

# DB
POSTGRES_USER=n8n
POSTGRES_PASSWORD=StrongDBPass123!
POSTGRES_DB=n8n

# Queue UI-процесс
EXECUTIONS_PROCESS=main

N8N_ENCRYPTION_KEY=J4KFz+WkJDJcPf4vEyRyM4EVuPu7z33fIQF9vN84dNY=

 

 

Production 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: 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
      - EXECUTIONS_PROCESS=${EXECUTIONS_PROCESS}
      - 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}
    volumes:
      - ./n8n_data:/home/node/.n8n
    networks:
      - n8nnet

  n8n-worker:
    image: 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}
    networks:
      - n8nnet

  caddy:
    image: caddy:alpine
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
    networks:
      - n8nnet

volumes:
  n8n_data:
  pg_data:
  redis_data:

networks:
  n8nnet:

 

 

Создайте файл Caddyfile:

 
your.website {
  reverse_proxy n8n-main:5678
}

 

где your.website - ваш домен A-запись которого уже указывает на ваш сервер.

 

Запуск:
 

docker compose up -d

 

 

 

 

после чего:

 
docker compose ps          # все роли должны быть healthy
docker compose logs -f n8n-main | grep "Queue initialized" 

 

 

 

 

 

Горизонтальное масштабирование воркеров

Добавление новых воркеров банально:

 
docker compose up -d --scale n8n-worker=4

 

Что это даёт на практике

 

Вы используете режим очередей (queue) в n8n, а значит:

 

  • n8n-main — это UI-процесс, он только принимает задачи и пишет их в Redis

  • n8n-worker — это исполнитель, он берёт задачи из Redis и выполняет их

 

 

По умолчанию запускается один n8n-worker. А если вы масштабируете:

 
--scale n8n-worker=4

 

 

то запускаются 4 независимых контейнера, каждый из которых:

 

  • подключается к Redis,

  • берёт задачи из очереди,

  • параллельно обрабатывает воркфлоу.

 

Результат:

  • Повышается пропускная способность системы.

  • Уменьшается время выполнения параллельных задач.

  • Можно разгрузить главный контейнер UI, особенно под нагрузкой.

 

 

Пример использования

 

  • У вас 100+ задач в очереди одновременно.

  • Один воркер обрабатывает их последовательно и не справляется.

  • Вы добавляете --scale n8n-worker=4 → 4 задачи могут обрабатываться одновременно.

 

Важно знать

  • Все воркеры используют одну Redis-очередь и одну базу данных.

  • Не стоит масштабировать n8n-main, только n8n-worker.

  • Если нужна высокая надёжность — можно масштабировать воркеры на разные сервера (через Docker Swarm, Kubernetes и т.д.).

 

 

HTTPS и обратный прокси

 

Для продакшна обязательно прячем порт 5678 за TLS. Два варианта:

  • Traefik (автоматические сертификаты Let’s Encrypt).

  • Nginx (контейнер или пакет).

 

 

Пример блока Nginx:

 
server {
  listen 443 ssl http2;
  server_name n8n.example.com;

  ssl_certificate     /etc/letsencrypt/live/n8n.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/n8n.example.com/privkey.pem;

  location / {
    proxy_pass http://n8n-main:5678;
    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }

  location ^~ /webhook/ {
    proxy_pass http://n8n-main:5678;
    proxy_set_header Host $host;
  }
}

 

 

Мониторинг и бэкапы

  • Пруф-жизнь: health-check контейнеров + алерт, если queue_last_failed > 0.

  • Grafana/Loki: отдельная стэк-композиция для логов.

  • Postgres: pg_dumpall | gzip > $(date +%F)_n8n.sql.gz ежедневно.

  • n8n_home: tar -czf n8n_files.tgz /home/node/.n8n ежедневно.

  • Храните резервные копии off-site или в S3-совместимом бакете.

 

 

Безопасность продакшн-инстанции

  1. Скрыть Postgres :5432 и Redis :6379 во внутренней Docker-сети.

  2. Включить двухфакторную авторизацию у внешних OAuth-сервисов, используемых в нодах.

  3. Регулярно пересматривать разрешения API-токенов в воркфлоу.

  4. Ограничить доступ к UI по VPN или WireGuard.

 

 

Заключение

 

Production Stack на Postgres + Redis + Queue Mode превращает n8n из удобного «автоматизатора на коленке» в зрелый сервис, выдерживающий высокую нагрузку и легко восстанавливающийся после сбоев. Теперь у вас:

  • транзакционная БД с точкой восстановления,

  • брокер очередей для параллельных задач,

  • масштабируемые воркеры,

  • защита HTTPS и централизованное логирование.

 

Внедряйте best-practice-бэкапы, мониторинг и автоматические обновления, и ваша автоматизация будет столь же надёжна, как и бизнес-процессы, которые она обслуживает.