Skip to content

Глава 10. Деплой и продакшн

Запустить n8n для себя на localhost — это начало. Готовый продакшн-деплой требует базы данных, шифрования, резервных копий, мониторинга и правильного nginx. Разберём все составляющие.

Docker Compose для продакшна

Минимальная конфигурация для продакшна — n8n с PostgreSQL:

yaml
# 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:

bash
POSTGRES_PASSWORD=very-strong-password-here
N8N_ENCRYPTION_KEY=your-32-char-random-encryption-key
N8N_USER=admin
N8N_PASSWORD=secure-admin-password

Важные переменные окружения

База данных

ПеременнаяОписание
DB_TYPEsqlite (по умолчанию) или 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_ACTIVEtrue — включить Basic Auth
N8N_BASIC_AUTH_USERЛогин пользователя
N8N_BASIC_AUTH_PASSWORDПароль пользователя
N8N_DISABLE_UItrue — отключить веб-интерфейс (для API-only режима)

Вебхуки и URL

ПеременнаяОписание
WEBHOOK_URLПубличный URL n8n. Используется для формирования webhook URL
N8N_HOSTХост, на котором слушает n8n (по умолчанию 0.0.0.0)
N8N_PORTПорт (по умолчанию 5678)
N8N_PROTOCOLhttp или https

Выполнения

ПеременнаяОписание
EXECUTIONS_TIMEOUTТаймаут одного выполнения в секундах (-1 = без ограничений)
EXECUTIONS_DATA_MAX_AGEХранить историю выполнений N дней (по умолчанию 336 = 14 дней)
EXECUTIONS_DATA_PRUNEtrue — автоматически удалять старые выполнения

Nginx как reverse proxy

n8n должен быть за reverse proxy — это добавляет TLS и изолирует порт.

nginx
# /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;
    }
}
bash
# Получение SSL-сертификата
certbot --nginx -d n8n.your-domain.com --non-interactive --agree-tos -m admin@your-domain.com

Резервные копии

Что бэкапить

  1. База данных — содержит все воркфлоу, credentials, историю выполнений
  2. Файл .n8n/config — содержит encryption key (если не задан через env)
  3. Переменные окружения — файл .env

Credentials без encryption key бесполезны

Если потеряете encryption key, credentials не расшифровать. Храните ключ в менеджере паролей (Bitwarden, 1Password) отдельно от бэкапов БД.

Бэкап PostgreSQL

bash
#!/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:

bash
0 3 * * * /opt/n8n/backup-n8n.sh >> /var/log/n8n-backup.log 2>&1

Восстановление из бэкапа

bash
# Остановить 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:

bash
curl https://n8n.your-domain.com/healthz
# → {"status":"ok"}

Добавьте в uptime-мониторинг (UptimeRobot, Betterstack и др.) проверку этого URL.

Логи

bash
# Просмотр логов в реальном времени
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

bash
# 1. Сделать бэкап базы данных (см. выше)

# 2. Скачать новый образ
docker compose pull n8n

# 3. Перезапустить с новым образом
docker compose up -d n8n

# 4. Проверить логи
docker compose logs -f n8n

n8n автоматически выполняет миграции базы данных при старте. Откатиться на предыдущую версию без восстановления БД из бэкапа невозможно — миграции не откатываются.

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)

Неофициальная документация. n8n — продукт n8n GmbH.