Развертывание n8n с Docker Compose и Nginx Proxy Manager: Полное руководство

Развертывание n8n с Docker Compose и Nginx Proxy Manager

Введение

n8n — это мощная платформа автоматизации рабочих процессов с открытым исходным кодом, которая позволяет создавать сложные автоматизации без глубоких знаний программирования. В этом руководстве я покажу, как развернуть n8n в production-среде используя Docker Compose с PostgreSQL, Redis и Nginx Proxy Manager.

Почему я перешел на Nginx Proxy Manager

Ранее я использовал связку Caddy + Traefik для управления обратным прокси и SSL-сертификатами. Хотя эта конфигурация работала надежно, я решил перейти на Nginx Proxy Manager по следующим причинам:

  • Простота настройки: Веб-интерфейс позволяет управлять прокси-хостами без редактирования конфигурационных файлов
  • Автоматические SSL-сертификаты: Интеграция с Let’s Encrypt происходит в пару кликов
  • Удобный мониторинг: Все настройки и статусы видны в одном месте
  • Меньше сложности: Один сервис вместо двух упрощает архитектуру

Архитектура решения

Наш стек включает:

  • n8n: Основное приложение автоматизации
  • PostgreSQL: База данных с поддержкой векторного поиска (pgvector)
  • Redis: Очередь задач для масштабирования
  • Nginx Proxy Manager: Обратный прокси с SSL
  • pgAdmin: Веб-интерфейс для управления базой данных

Структура проекта

n8n/
├── docker-compose.yml
├── Postgresql.Dockerfile
├── init-data.sh
└── .env

Настройка PostgreSQL с pgvector

Создаем кастомный Dockerfile для PostgreSQL с поддержкой векторного поиска:

Postgresql.Dockerfile

FROM postgres:16

RUN apt-get update && \
    apt-get install -y postgresql-server-dev-16 make gcc git && \
    git clone --branch v0.7.2 https://github.com/pgvector/pgvector.git && \
    cd pgvector && \
    make && make install && \
    cd .. && rm -rf pgvector && \
    apt-get remove --purge -y git make gcc && \
    apt-get autoremove -y && \
    apt-get clean

Этот Dockerfile устанавливает расширение pgvector, которое может понадобиться для работы с AI-функциями n8n.

Инициализация базы данных

init-data.sh

#!/bin/bash
set -e;

if [ -n "${POSTGRES_NON_ROOT_USER:-}" ] && [ -n "${POSTGRES_NON_ROOT_PASSWORD:-}" ]; then
    psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
        CREATE USER ${POSTGRES_NON_ROOT_USER} WITH PASSWORD '${POSTGRES_NON_ROOT_PASSWORD}';
        GRANT ALL PRIVILEGES ON DATABASE ${POSTGRES_DB} TO ${POSTGRES_NON_ROOT_USER};
        GRANT CREATE ON SCHEMA public TO ${POSTGRES_NON_ROOT_USER};
EOSQL
else
    echo "SETUP INFO: No Environment variables given!"
fi

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

Конфигурация переменных окружения

.env

# PostgreSQL
POSTGRES_USER=admin
POSTGRES_PASSWORD=SecureDBPassword123!
POSTGRES_DB=n8n_production
POSTGRES_NON_ROOT_USER=n8n_user
POSTGRES_NON_ROOT_PASSWORD=N8nUserPass456!

# n8n
N8N_HOST=workflows.example.com
N8N_PROTOCOL=https
N8N_PORT=5678
WEBHOOK_URL=https://workflows.example.com/
N8N_ENCRYPTION_KEY=YourSecureEncryptionKey789XYZ
N8N_PERSONALIZATION_ENABLED=False
N8N_DEFAULT_BINARY_DATA_MODE=filesystem

NODE_FUNCTION_ALLOW_BUILTIN=*
EXTRA_NODE_MODULES=*
NODE_FUNCTION_ALLOW_EXTERNAL=*
NODE_ENV=production
GENERIC_TIMEZONE=Europe/London
TZ=Europe/London

DB_TYPE=postgresdb
DB_POSTGRESDB_HOST=postgres
DB_POSTGRESDB_PORT=5432
DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER}
DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD}

# Nginx Proxy Manager
NPM_ADMIN_EMAIL=admin@example.com
NPM_ADMIN_PASSWORD=ProxyManagerPass789

# PgAdmin
PGADMIN_DEFAULT_EMAIL=dbadmin@example.com
PGADMIN_DEFAULT_PASSWORD=PgAdminSecure123!

Docker Compose конфигурация

docker-compose.yml

volumes:
  db_storage:
  n8n_storage:
  redis_storage:
  npm_storage:
  npm_letsencrypt:
  pgadmin_storage:

x-shared: &shared
  restart: always
  image: docker.n8n.io/n8nio/n8n:latest
  environment:
    - N8N_HOST=${N8N_HOST}
    - N8N_PROTOCOL=${N8N_PROTOCOL}
    - N8N_PORT=${N8N_PORT}
    - WEBHOOK_URL=${WEBHOOK_URL}
    - DB_TYPE=postgresdb
    - DB_POSTGRESDB_HOST=postgres
    - DB_POSTGRESDB_PORT=5432
    - DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
    - DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER}
    - DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD}
    - EXECUTIONS_MODE=queue
    - QUEUE_BULL_REDIS_HOST=redis
    - QUEUE_HEALTH_CHECK_ACTIVE=true
  links:
    - postgres
    - redis
  volumes:
    - n8n_storage:/home/node/.n8n
  depends_on:
    redis:
      condition: service_healthy
    postgres:
      condition: service_healthy

services:
  postgres:
    build:
      context: .
      dockerfile: Postgresql.Dockerfile
    restart: always
    environment:
      - POSTGRES_USER
      - POSTGRES_PASSWORD
      - POSTGRES_DB
      - POSTGRES_NON_ROOT_USER
      - POSTGRES_NON_ROOT_PASSWORD
    volumes:
      - db_storage:/var/lib/postgresql/data
      - ./init-data.sh:/docker-entrypoint-initdb.d/init-data.sh
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}']
      interval: 5s
      timeout: 5s
      retries: 10

  redis:
    image: redis:7-alpine
    restart: always
    volumes:
      - redis_storage:/data
    healthcheck:
      test: ['CMD', 'redis-cli', 'ping']
      interval: 5s
      timeout: 5s
      retries: 10

  n8n:
    <<: *shared
    ports:
      - 5678:5678

  n8n-worker:
    <<: *shared
    command: worker
    depends_on:
      - n8n

  nginx-proxy-manager:
    image: jc21/nginx-proxy-manager:latest
    restart: always
    ports:
      - '80:80'
      - '443:443'
      - '81:81'
    volumes:
      - npm_storage:/data
      - npm_letsencrypt:/etc/letsencrypt
    depends_on:
      - n8n
    healthcheck:
      test: ["CMD", "/usr/bin/check-health"]
      interval: 10s
      timeout: 3s
    environment:
      DISABLE_IPV6: 'true'
      IP_RANGES_FETCH_ENABLED: 'false'

  pgadmin:
    image: dpage/pgadmin4:latest
    restart: always
    environment:
      - PGADMIN_DEFAULT_EMAIL=${PGADMIN_DEFAULT_EMAIL}
      - PGADMIN_DEFAULT_PASSWORD=${PGADMIN_DEFAULT_PASSWORD}
      - SCRIPT_NAME=/pgadmin
    volumes:
      - pgadmin_storage:/var/lib/pgadmin
    ports:
      - 8080:80
    depends_on:
      - postgres
    healthcheck:
      test: ['CMD', 'wget', '--spider', 'http://localhost:80']
      interval: 5s
      timeout: 5s
      retries: 10

Развертывание

Шаг 1: Подготовка файлов

Создайте директорию проекта и скопируйте все файлы:

mkdir n8n-deployment
cd n8n-deployment

Шаг 2: Настройка переменных

Отредактируйте файл .env, заменив:

  • workflows.example.com на ваш домен
  • Все пароли на сильные и уникальные
  • Email-адреса на реальные
  • Временную зону при необходимости

Шаг 3: Запуск

# Сделать init-data.sh исполняемым
chmod +x init-data.sh

# Запустить все сервисы
docker-compose up -d

# Проверить статус
docker-compose ps

Настройка Nginx Proxy Manager

  1. Откройте веб-интерфейс по адресу http://your-server:81
  2. Войдите с данными по умолчанию:
    • Email: admin@example.com
    • Password: changeme
  3. Создайте новый Proxy Host:
    • Domain: workflows.example.com
    • Forward Hostname/IP: n8n
    • Forward Port: 5678
    • Включите SSL с Let’s Encrypt

Мониторинг и обслуживание

Просмотр логов

# Все сервисы
docker-compose logs -f

# Конкретный сервис
docker-compose logs -f n8n

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

# Создание бэкапа базы данных
docker-compose exec postgres pg_dump -U admin n8n_production > n8n_backup.sql

# Бэкап данных n8n
docker run --rm -v n8n_n8n_storage:/data -v $(pwd):/backup alpine tar czf /backup/n8n_data_backup.tar.gz -C /data .

Решение проблем

Сервис n8n не запускается

Проверьте подключение к базе данных:

docker-compose exec postgres psql -U admin -d n8n_production -c "SELECT version();"

Проблемы с SSL

Убедитесь, что:

  • DNS-записи указывают на ваш сервер
  • Порты 80 и 443 открыты
  • Домен доступен извне

n8n-worker не обрабатывает задачи

Проверьте подключение к Redis:

docker-compose exec redis redis-cli ping

Заключение

Эта конфигурация обеспечивает production-ready развертывание n8n с масштабируемой архитектурой. Использование Nginx Proxy Manager существенно упрощает управление SSL-сертификатами и прокси-настройками по сравнению с более сложными решениями на основе Traefik или чистого Nginx.

Ключевые преимущества данной настройки:

  • Автоматическое масштабирование через воркеры
  • Надежное хранение данных в PostgreSQL
  • Простое управление SSL через веб-интерфейс
  • Мониторинг состояния всех сервисов
  • Легкое резервное копирование и восстановление

Не забудьте регулярно обновлять образы Docker и создавать резервные копии данных для обеспечения безопасности вашей системы автоматизации.

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

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

Яндекс.Метрика