Введение
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
- Откройте веб-интерфейс по адресу
http://your-server:81
- Войдите с данными по умолчанию:
- Email:
admin@example.com
- Password:
changeme
- Email:
- Создайте новый Proxy Host:
- Domain:
workflows.example.com
- Forward Hostname/IP:
n8n
- Forward Port:
5678
- Включите SSL с Let’s Encrypt
- Domain:
Мониторинг и обслуживание
Просмотр логов
# Все сервисы 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 и создавать резервные копии данных для обеспечения безопасности вашей системы автоматизации.