Когда число воркфлоу зашкаливает, а каждая секунда простоя обходится дорого, «песочницы» на 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.
Аппаратные требования
Ресурс | Минимум | Рекомендовано |
---|---|---|
CPU | 2 vCPU | 4–8 vCPU |
RAM | 4 ГиБ | 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-процесс, он только принимает задачи и пишет их в Redisn8n-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-совместимом бакете.
Безопасность продакшн-инстанции
Скрыть Postgres :5432 и Redis :6379 во внутренней Docker-сети.
Включить двухфакторную авторизацию у внешних OAuth-сервисов, используемых в нодах.
Регулярно пересматривать разрешения API-токенов в воркфлоу.
Ограничить доступ к UI по VPN или WireGuard.
Заключение
Production Stack на Postgres + Redis + Queue Mode превращает n8n из удобного «автоматизатора на коленке» в зрелый сервис, выдерживающий высокую нагрузку и легко восстанавливающийся после сбоев. Теперь у вас:
транзакционная БД с точкой восстановления,
брокер очередей для параллельных задач,
масштабируемые воркеры,
защита HTTPS и централизованное логирование.
Внедряйте best-practice-бэкапы, мониторинг и автоматические обновления, и ваша автоматизация будет столь же надёжна, как и бизнес-процессы, которые она обслуживает.