Введение
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:
Обновление n8n в docker
Для обновления нужно последовательно ввести команды:
docker-compose pull
docker compose down
docker-compose up -d --build
Мониторинг и обслуживание
Просмотр логов
# Все сервисы 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 и создавать резервные копии данных для обеспечения безопасности вашей системы автоматизации.
