N8n docker compose

Развертывание n8n с помощью Docker Compose: Полное руководство

N8n — это мощный инструмент для автоматизации рабочих процессов с открытым исходным кодом, который позволяет соединять различные приложения, API и сервисы между собой. Развертывание n8n в контейнерах Docker с использованием Docker Compose является предпочтительным методом для production-сред, так как он обеспечивает изоляцию, простоту управления, воспроизводимость и удобство масштабирования. Данное руководство детально рассматривает процесс настройки, конфигурации и администрирования n8n через стек Docker Compose.

Архитектура и ключевые компоненты развертывания

Типичное развертывание n8n с помощью Docker Compose включает в себя несколько взаимосвязанных сервисов. Основной сервис — это сам n8n, но для полноценной работы в production часто требуются база данных для хранения рабочих процессов, учетных данных и данных выполнения, а также reverse proxy для обработки SSL/TLS и маршрутизации запросов.

    • Сервис n8n: Основной контейнер с приложением. Его конфигурация задается через переменные окружения.
    • База данных (PostgreSQL): Рекомендуемая СУБД для production. Хранит все метаданные, учетные данные (в зашифрованном виде) и историю выполнения.
    • Reverse Proxy (Nginx или Traefik): Обеспечивает безопасный доступ по HTTPS, может выполнять балансировку нагрузки и serve статические файлы.
    • Внутренняя сеть Docker: Изолирует коммуникацию между контейнерами, обеспечивая безопасность.

    Создание базового файла docker-compose.yml

    Базовый файл docker-compose.yml для развертывания n8n с PostgreSQL выглядит следующим образом. Этот пример использует последнюю стабильную версию образов и настраивает необходимые переменные окружения.

    version: '3.8'
    
    services:
      n8n:
        image: n8nio/n8n:latest
        restart: unless-stopped
        ports:
          - "5678:5678"
        environment:
          - N8N_PROTOCOL=https
          - N8N_HOST=localhost
          - N8N_PORT=5678
          - N8N_EDITOR_BASE_URL=https://ваш-домен.com/
          - WEBHOOK_URL=https://ваш-домен.com/
          - GENERIC_TIMEZONE=Europe/Moscow
          - N8N_DIAGNOSTICS_ENABLED=false
          - N8N_PERSONALIZATION_ENABLED=false
          - DB_TYPE=postgresdb
          - DB_POSTGRESDB_HOST=postgres
          - DB_POSTGRESDB_PORT=5432
          - DB_POSTGRESDB_DATABASE=n8n
          - DB_POSTGRESDB_USER=n8n_user
          - DB_POSTGRESDB_PASSWORD=сложный_пароль
          - N8N_ENCRYPTION_KEY=длинный_случайный_ключ_шифрования_32_символа
        volumes:
          - n8n_data:/home/node/.n8n
        depends_on:
          - postgres
        networks:
          - n8n_network
    
      postgres:
        image: postgres:15-alpine
        restart: unless-stopped
        environment:
          - POSTGRES_USER=n8n_user
          - POSTGRES_PASSWORD=сложный_пароль
          - POSTGRES_DB=n8n
        volumes:
          - postgres_data:/var/lib/postgresql/data
        networks:
          - n8n_network
    
    volumes:
      n8n_data:
      postgres_data:
    
    networks:
      n8n_network:
        driver: bridge
    

    Детальное описание ключевых переменных окружения

    Конфигурация n8n почти полностью управляется через переменные окружения. Понимание их назначения критически важно для безопасной и корректной настройки.

    Переменная Обязательная Описание и рекомендации
    N8N_ENCRYPTION_KEY Да (для production) Ключ для шифрования учетных данных в БД. Должен быть строкой длиной ровно 32 символа. Должен оставаться неизменным на протяжении всего жизненного цикла инстанса. Генерируется командой: openssl rand -hex 16.
    DB_TYPE, DB_POSTGRESDB_* Да (для production с БД) Определяют тип и параметры подключения к базе данных. Использование встроенной SQLite не рекомендуется для production из-за проблем с производительностью и надежностью.
    N8N_PROTOCOL, N8N_HOST, N8N_PORT Нет Используются для генерации корректных URL-адресов для webhook. В production обычно устанавливаются в https, ваш-домен.com и 443 (или порт reverse proxy).
    WEBHOOK_URL Нет Полный базовый URL, по которому n8n доступен извне. Критически важен для работы входящих webhook. Пример: https://n8n.example.com.
    N8N_EDITOR_BASE_URL Нет URL, по которому доступен редактор рабочих процессов. Часто совпадает с WEBHOOK_URL.
    GENERIC_TIMEZONE Нет Часовой пояс, используемый для планировщика (Schedule node) и времени выполнения. Пример: Europe/Moscow.
    EXECUTIONS_DATA_PRUNE Нет Включает автоматическую очистку старых данных выполнений. Пример: true.
    EXECUTIONS_DATA_MAX_AGE Нет Определяет возраст в часах, после которого данные выполнения будут удалены. Работает только если включен PRUNE. Пример: 168 (7 дней).

    Расширенная конфигурация для Production

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

    1. Интеграция с Reverse Proxy (Nginx)

    Добавление сервиса Nginx в docker-compose.yml позволяет обслуживать SSL/TLS и разгружать n8n от задач обработки шифрования. Необходимо смонтировать конфигурацию Nginx и сертификаты Let’s Encrypt.

    services:
      nginx:
        image: nginx:alpine
        restart: unless-stopped
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - ./nginx.conf:/etc/nginx/nginx.conf:ro
          - ./data/certbot/conf:/etc/letsencrypt:ro
          - ./data/certbot/www:/var/www/certbot:ro
        depends_on:
          - n8n
        networks:
          - n8n_network
    

    Пример минимальной конфигурации nginx.conf для проксирования запросов к n8n:

    events {}
    http {
        server {
            listen 80;
            server_name ваш-домен.com;
            location /.well-known/acme-challenge/ {
                root /var/www/certbot;
            }
            location / {
                return 301 https://$host$request_uri;
            }
        }
    
        server {
            listen 443 ssl http2;
            server_name ваш-домен.com;
    
            ssl_certificate /etc/letsencrypt/live/ваш-домен.com/fullchain.pem;
            ssl_certificate_key /etc/letsencrypt/live/ваш-домен.com/privkey.pem;
    
            location / {
                proxy_pass http://n8n:5678;
                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 $scheme;
            }
        }
    }
    

    2. Настройка внешних файловых хранилищ для вложений

    По умолчанию n8n сохраняет вложения (файлы, обрабатываемые в workflows) на локальный диск контейнера. В production необходимо использовать внешнее хранилище.

    • S3-совместимое хранилище (MinIO, AWS S3): Установите переменные: N8N_S3_ENDPOINT, N8N_S3_REGION, N8N_S3_BUCKET_NAME, N8N_S3_ACCESS_KEY_ID, N8N_S3_SECRET_ACCESS_KEY.
    • Локальный том Docker: Смонтируйте отдельный том в путь /home/node/.n8n/local-storage внутри контейнера n8n. Это обеспечит сохранность данных при обновлении контейнера.

    3. Настройка очереди сообщений (Queue)

    Для обработки длительных workflow и распределения нагрузки между несколькими воркерами n8n поддерживает режим очереди на основе Redis.

    services:
      redis:
        image: redis:7-alpine
        restart: unless-stopped
        command: redis-server --appendonly yes
        volumes:
          - redis_data:/data
        networks:
          - n8n_network
    
      n8n_worker:
        image: n8nio/n8n:latest
        restart: unless-stopped
        environment:
          - N8N_QUEUE_HEALTH_CHECK_ACTIVE=true
          - EXECUTIONS_MODE=queue
          - QUEUE_BULL_REDIS_HOST=redis
          - QUEUE_BULL_REDIS_PORT=6379
          

    ... остальные переменные (DB, ENCRYPTION_KEY и т.д.)

    volumes: - n8n_data:/home/node/.n8n depends_on: - postgres - redis networks: - n8n_network n8n_webhook: image: n8nio/n8n:latest restart: unless-stopped environment: - N8N_QUEUE_HEALTH_CHECK_ACTIVE=true - EXECUTIONS_MODE=queue - QUEUE_BULL_REDIS_HOST=redis - QUEUE_BULL_REDIS_PORT=6379 - N8N_WEBHOOK_URL=https://ваш-домен.com

    ... остальные переменные

    volumes: - n8n_data:/home/node/.n8n depends_on: - postgres - redis networks: - n8n_network

    Процесс развертывания и управления

    1. Подготовка: Установите Docker и Docker Compose на сервер. Создайте директорию проекта и поместите в нее файл docker-compose.yml и конфигурацию для Nginx.
    2. Настройка переменных: Замените все примеры значений (пароли, ключи шифрования, домены) на собственные, уникальные и безопасные.
    3. Запуск: Выполните команду docker-compose up -d в директории с проектом. Это создаст сеть, тома и запустит все сервисы в фоновом режиме.
    4. Мониторинг логов: Используйте docker-compose logs -f n8n для наблюдения за процессом запуска и диагностики проблем.
    5. Обновление: Для обновления n8n до новой версии выполните последовательно: docker-compose pull n8n, затем docker-compose up -d n8n.
    6. Резервное копирование: Критически важные данные хранятся в томах Docker для PostgreSQL и в файловом хранилище n8n. Регулярно создавайте бэкапы этих томов с помощью docker run --rm -v имя_тома:/data -v /путь/к/бэкапу:/backup alpine tar czf /backup/backup.tar.gz /data.

    Ответы на часто задаваемые вопросы (FAQ)

    Как сгенерировать надежный N8N_ENCRYPTION_KEY?

    Используйте команду в терминале Linux/macOS или WSL2 на Windows: openssl rand -hex 16. Эта команда сгенерирует 32 случайных символа в hex-формате. Сохраните этот ключ в надежном месте (менеджере паролей). Его потеря приведет к невозможности расшифровать сохраненные учетные данные в базе данных.

    Можно ли использовать SQLite вместо PostgreSQL?

    Да, для тестирования или очень маленьких инсталляций можно. Для этого удалите сервис postgres и все переменные DB_POSTGRESDB_* из конфигурации n8n. По умолчанию n8n использует встроенную SQLite. Однако для любой серьезной рабочей нагрузки PostgreSQL обязателен, так как обеспечивает целостность данных, конкурентный доступ и производительность.

    Как настроить отправку email-уведомлений от n8n?

    Используйте переменные окружения для настройки SMTP. Добавьте в конфигурацию сервиса n8n:

    • N8N_EMAIL_MODE=smtp
    • N8N_SMTP_HOST=smtp.gmail.com
    • N8N_SMTP_PORT=587
    • N8N_SMTP_USER=ваш_email@gmail.com
    • N8N_SMTP_PASSWORD=пароль_приложения
    • N8N_SMTP_SENDER=ваш_email@gmail.com

Как обновить n8n, развернутую через Docker Compose?

Остановите контейнеры: docker-compose down. Обновите образ: docker-compose pull. Запустите заново: docker-compose up -d. Ваши данные (workflows, credentials) сохранены в томах Docker и не будут утеряны. Рекомендуется делать бэкап томов перед обновлением.

Как решить проблему с CORS (Cross-Origin Resource Sharing) ошибками?

Убедитесь, что переменные N8N_PROTOCOL, N8N_HOST, WEBHOOK_URL и N8N_EDITOR_BASE_URL установлены корректно и указывают на тот же домен, с которого открывается редактор. Если вы обращаетесь к n8n API из внешнего приложения, может потребоваться явно задать разрешенные origins через переменную N8N_CORS_ALLOW_ORIGIN (например, https://ваше-приложение.com).

Как добавить пользовательские узлы (Custom Nodes)?

Смонтируйте директорию с пользовательскими узлами в контейнер n8n. Добавьте в секцию volumes сервиса n8n: - /путь/на/хосте/custom-nodes:/home/node/.n8n/custom. Затем установите необходимые npm-пакеты, либо соберите свой образ Docker на основе официального, добавив в Dockerfile команды RUN npm install для ваших узлов.

Заключение

Развертывание n8n с использованием Docker Compose предоставляет надежный, масштабируемый и воспроизводимый способ запуска платформы автоматизации как в тестовой, так и в промышленной среде. Ключевыми аспектами успешной конфигурации являются: использование PostgreSQL в качестве базы данных, настройка корректного ключа шифрования, конфигурация внешних URL через reverse proxy и планирование резервного копирования данных. Следование рекомендациям, изложенным в данном руководстве, позволит создать стабильную и безопасную инфраструктуру для автоматизации бизнес-процессов с помощью n8n.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *