Глава 10. Деплой и продакшн
Запустить n8n для себя на localhost — это начало. Готовый продакшн-деплой требует базы данных, шифрования, резервных копий, мониторинга и правильного nginx. Разберём все составляющие.
Docker Compose для продакшна
Минимальная конфигурация для продакшна — n8n с PostgreSQL:
# docker-compose.yml
version: "3.8"
services:
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: n8n
POSTGRES_USER: n8n
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U n8n"]
interval: 5s
timeout: 5s
retries: 10
n8n:
image: n8nio/n8n:latest
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
ports:
- "5678:5678"
environment:
# База данных
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
# Безопасность
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
# Публичный URL (обязательно для вебхуков)
- WEBHOOK_URL=https://n8n.your-domain.com
# Базовая аутентификация
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=${N8N_USER}
- N8N_BASIC_AUTH_PASSWORD=${N8N_PASSWORD}
# Таймзона
- GENERIC_TIMEZONE=Europe/Moscow
# Логирование
- N8N_LOG_LEVEL=info
volumes:
- n8n_data:/home/node/.n8n
labels:
- "traefik.enable=true" # если используете Traefik
volumes:
postgres_data:
n8n_data:Файл .env рядом с docker-compose.yml:
POSTGRES_PASSWORD=very-strong-password-here
N8N_ENCRYPTION_KEY=your-32-char-random-encryption-key
N8N_USER=admin
N8N_PASSWORD=secure-admin-passwordВажные переменные окружения
База данных
| Переменная | Описание |
|---|---|
DB_TYPE | sqlite (по умолчанию) или postgresdb / mysqldb |
DB_POSTGRESDB_HOST | Хост PostgreSQL |
DB_POSTGRESDB_PORT | Порт (по умолчанию 5432) |
DB_POSTGRESDB_DATABASE | Имя базы данных |
DB_POSTGRESDB_USER | Пользователь |
DB_POSTGRESDB_PASSWORD | Пароль |
SQLite и продакшн
SQLite подходит для разработки и небольших нагрузок. В продакшне с несколькими пользователями или высокой частотой выполнений используйте PostgreSQL — он поддерживает параллельные транзакции и не блокируется.
Безопасность
| Переменная | Описание |
|---|---|
N8N_ENCRYPTION_KEY | Ключ шифрования credentials. Обязательно задайте явно |
N8N_BASIC_AUTH_ACTIVE | true — включить Basic Auth |
N8N_BASIC_AUTH_USER | Логин пользователя |
N8N_BASIC_AUTH_PASSWORD | Пароль пользователя |
N8N_DISABLE_UI | true — отключить веб-интерфейс (для API-only режима) |
Вебхуки и URL
| Переменная | Описание |
|---|---|
WEBHOOK_URL | Публичный URL n8n. Используется для формирования webhook URL |
N8N_HOST | Хост, на котором слушает n8n (по умолчанию 0.0.0.0) |
N8N_PORT | Порт (по умолчанию 5678) |
N8N_PROTOCOL | http или https |
Выполнения
| Переменная | Описание |
|---|---|
EXECUTIONS_TIMEOUT | Таймаут одного выполнения в секундах (-1 = без ограничений) |
EXECUTIONS_DATA_MAX_AGE | Хранить историю выполнений N дней (по умолчанию 336 = 14 дней) |
EXECUTIONS_DATA_PRUNE | true — автоматически удалять старые выполнения |
Nginx как reverse proxy
n8n должен быть за reverse proxy — это добавляет TLS и изолирует порт.
# /etc/nginx/sites-available/n8n.your-domain.com
server {
listen 80;
server_name n8n.your-domain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name n8n.your-domain.com;
ssl_certificate /etc/letsencrypt/live/n8n.your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/n8n.your-domain.com/privkey.pem;
# Увеличенные таймауты для длинных воркфлоу
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
# WebSocket support (для редактора)
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_set_header X-Forwarded-Proto https;
location / {
proxy_pass http://127.0.0.1:5678;
}
}# Получение SSL-сертификата
certbot --nginx -d n8n.your-domain.com --non-interactive --agree-tos -m admin@your-domain.comРезервные копии
Что бэкапить
- База данных — содержит все воркфлоу, credentials, историю выполнений
- Файл
.n8n/config— содержит encryption key (если не задан через env) - Переменные окружения — файл
.env
Credentials без encryption key бесполезны
Если потеряете encryption key, credentials не расшифровать. Храните ключ в менеджере паролей (Bitwarden, 1Password) отдельно от бэкапов БД.
Бэкап PostgreSQL
#!/bin/bash
# backup-n8n.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=/backups/n8n
mkdir -p $BACKUP_DIR
docker compose exec -T postgres pg_dump -U n8n n8n | gzip > "$BACKUP_DIR/n8n_$DATE.sql.gz"
# Удаляем бэкапы старше 30 дней
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete
echo "Backup completed: n8n_$DATE.sql.gz"Добавьте в cron:
0 3 * * * /opt/n8n/backup-n8n.sh >> /var/log/n8n-backup.log 2>&1Восстановление из бэкапа
# Остановить n8n
docker compose stop n8n
# Восстановить базу данных
gunzip -c /backups/n8n/n8n_20240115_030000.sql.gz | \
docker compose exec -T postgres psql -U n8n n8n
# Запустить n8n
docker compose start n8nМониторинг
Healthcheck
n8n предоставляет эндпоинт /healthz:
curl https://n8n.your-domain.com/healthz
# → {"status":"ok"}Добавьте в uptime-мониторинг (UptimeRobot, Betterstack и др.) проверку этого URL.
Логи
# Просмотр логов в реальном времени
docker compose logs -f n8n
# Последние 100 строк
docker compose logs --tail=100 n8nУровни логирования: error, warn, info, debug, verbose. В продакшне используйте info; debug генерирует слишком много данных.
Метрики (Prometheus)
n8n публикует метрики в формате Prometheus на эндпоинте /metrics (включить через N8N_METRICS=true). Подключите к Grafana для дашбордов.
Обновление n8n
# 1. Сделать бэкап базы данных (см. выше)
# 2. Скачать новый образ
docker compose pull n8n
# 3. Перезапустить с новым образом
docker compose up -d n8n
# 4. Проверить логи
docker compose logs -f n8nn8n автоматически выполняет миграции базы данных при старте. Откатиться на предыдущую версию без восстановления БД из бэкапа невозможно — миграции не откатываются.
Changelog
Перед обновлением читайте github.com/n8n-io/n8n/releases. Breaking changes отмечены явно. Минорные версии (1.x.y → 1.x.z) обычно безопасны.
Чеклист перед запуском в продакшн
- [ ]
N8N_ENCRYPTION_KEYзадан явно и сохранён в менеджере паролей - [ ] Используется PostgreSQL, а не SQLite
- [ ] Задан
WEBHOOK_URLс публичным HTTPS-адресом - [ ] Настроен nginx с TLS (certbot)
- [ ] Включена аутентификация (Basic Auth или OAuth2)
- [ ] Настроен автоматический бэкап базы данных
- [ ]
EXECUTIONS_DATA_PRUNE=true— старые выполнения удаляются - [ ] Настроен uptime-мониторинг через
/healthz - [ ] Порт 5678 закрыт в firewall (доступ только через nginx)