n8n — это конструктор автоматизаций: соединить почту с таблицей, дёрнуть чужой сервис по расписанию, собрать цепочку с моделью ИИ. Облачная версия у n8n есть, но многие хотят держать его на своей стороне — тогда сценарии не упираются в лимит запусков, а данные лежат рядом. И тут начинается то, из-за чего дело откладывают: аренда сервера, установка Docker, прокси перед сервисом, сертификат для защищённого соединения и слежение за тем, чтобы всё поднялось само после перезагрузки. Всё это можно пропустить: Dockbox поднимает проекты, описанные файлом docker-compose.yml, а n8n обычно именно так и запускают. Рассказываем по шагам, что положить в архив и на что смотреть.
Почему n8n по умолчанию тащат на VPS
Обратный прокси и сертификат. Вебхуки n8n должны быть доступны снаружи по HTTPS, а значит нужен nginx перед сервисом и домен с сертификатом, который придётся продлевать каждые три месяца.
Постоянное хранилище. Сценарии, соединения с сервисами и история запусков — это данные. В контейнере без тома они исчезают при первом же обновлении образа.
Автозапуск после сбоя. Чтобы n8n вернулся в строй после падения и перезагрузки, нужна restart-политика или systemd-юнит, а вместе с ней — отладка того, почему контейнер не поднимается.
Плата за простой. Сервер стоит денег все 30 дней, даже если автоматизации срабатывают раз в сутки.
Платформа деплоя снимает всю эту часть: она видит описание сервисов, поднимает их и отдаёт публичную HTTPS-ссылку. Ни сервера, ни nginx, ни ручного сертификата.
Что n8n требует от хостинга
Публичный адрес для вебхуков. Каждый сценарий, принимающий входящий запрос, получает адрес вида /webhook/…. Внутренний localhost:5678 снаружи недоступен, поэтому n8n нужно сообщить его публичное имя.
Место для данных. В папке /home/node/.n8n лежат сценарии, учётные данные сервисов и файл базы по умолчанию. Это самое ценное в проекте, и оно должно лежать на постоянном томе.
Стабильный ключ шифрования. Учётные данные сценариев n8n шифрует ключом N8N_ENCRYPTION_KEY. Если ключ поменяется или потеряется вместе с томом, сохранённые соединения перестанут расшифровываться.
Часовой пояс. Сценарий с триггером по времени сработает не тогда, когда вы ожидаете, если время внутри контейнера осталось в UTC.
Шаг 1. Опишите n8n файлом docker-compose.yml
Создайте пустую папку и положите в неё docker-compose.yml с одним сервисом на официальном образе. Собирать нечего: n8n поставляется готовым образом, и кроме этого файла в архиве может не быть ничего.
services:
n8n:
image: docker.n8n.io/n8nio/n8n
ports:
- "5678:5678"
environment:
- N8N_HOST=${PUBLIC_HOST}
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://${PUBLIC_HOST}/
- N8N_PROXY_HOPS=1
- GENERIC_TIMEZONE=Europe/Moscow
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
volumes:
- n8n_data:/home/node/.n8n
volumes:
n8n_data:
Шаг 2. Дайте n8n базу и постоянный том
Именованный том — обязательный шаг. Без строки n8n_data:/home/node/.n8n сценарии и соединения живут внутри контейнера и исчезают при первом обновлении. С томом они переживают перезапуски и повторные публикации — такие данные удаляются только вместе с проектом.
Для небольших наборов сценариев хватит встроенного SQLite. Он лежит в той же папке на томе, так что отдельный сервис базы не нужен.
Когда запусков много, добавьте PostgreSQL вторым сервисом в тот же файл:
db:
image: postgres:16
environment:
- POSTGRES_USER=n8n
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=n8n
volumes:
- pg_data:/var/lib/postgresql/data
n8n в этом случае получает DB_TYPE=postgresdb, DB_POSTGRESDB_HOST=db и те же логин с паролем. Тому базы тоже нужен именованный том — иначе она обнулится при обновлении.
Шаг 3. Отдайте настройки через секреты
n8n читает настройки из переменных окружения: логин и пароль для входа, часовой пояс, публичный адрес для приёма входящих запросов, ключ шифрования. Значения вводите при настройке проекта — они попадут в переменные окружения в зашифрованном виде и не окажутся в архиве с файлом.
Плохой вариант — значения прямо в описании сервиса:
environment:
- N8N_ENCRYPTION_KEY=4f2a9c7b8e1d
- DB_PASSWORD=secret123
Правильный — в файле только имена, а значения приходят из секретов:
environment:
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- DB_PASSWORD=${DB_PASSWORD}
Публичный адрес становится известен после первой публикации, поэтому PUBLIC_HOST и WEBHOOK_URL удобно заполнить вторым проходом и обновить проект.
Шаг 4. Загрузите проект и получите HTTPS-адрес
Загрузите папку архивом или импортируйте репозиторий с этим файлом из GitHub, включая приватный. Платформа видит описание сервисов и поднимает проект: писать Dockerfile не нужно. Один проект держит целый набор связанных сервисов, поэтому база может жить рядом с n8n.
Проверьте вебхук на боевом адресе. У вебхук-узла n8n два адреса: тестовый /webhook-test/… срабатывает один раз из редактора, а боевой /webhook/… отвечает только у активного сценария. Если снаружи возвращается 404, дело почти всегда в этом или в неверном WEBHOOK_URL. Логи запуска в панели показывают, доходят ли запросы до n8n.
Сколько это стоит и как работают контейнеры
Принципиальная разница с VPS: администрировать сервер и следить за процессом не нужно — контейнеры работают постоянно, без ограничения по часам и без «засыпания». Для n8n это критично: сценарий, который должен сработать в три ночи, сработает, потому что проект не спит. Упавший контейнер платформа перезапускает сама.
Starter — 990 ₽/мес. 1 vCPU, 2 GB RAM, 20 GB SSD, один проект. Первый месяц бесплатный, и n8n вместе с PostgreSQL сюда укладывается, а лимита по времени работы у тарифа нет.
Pro — 2 490 ₽/мес. 2 vCPU, 4 GB RAM, до пяти проектов.
Team — 4 990 ₽/мес — для команд, которым нужен запас ресурсов и SLA.
Частые вопросы
Сохранятся ли сценарии при обновлении проекта?
Да, если папка данных n8n лежит на именованном томе. Тогда сценарии, соединения и история запусков переживают перезапуски и повторные публикации. Без тома данные остаются внутри контейнера и исчезают при первом обновлении, поэтому этот шаг пропускать нельзя.
Сработают ли сценарии по расписанию ночью?
Да. Контейнеры работают постоянно, без «засыпания» и лимита по часам, поэтому триггер по времени срабатывает в заданную минуту, даже когда ссылку никто не открывает. Выставьте GENERIC_TIMEZONE — иначе расписание посчитается по UTC.
Нужно ли самому ставить Docker, прокси и сертификат?
Нет. Docker, обратный прокси перед сервисом и сертификат для защищённого соединения — на стороне платформы. От вас нужен файл docker-compose.yml, а публичный HTTPS-адрес выдаётся автоматически.
Почему вебхук n8n не отвечает снаружи?
Чаще всего сценарий не активирован: тестовый адрес /webhook-test/… работает один раз из редактора, а боевой /webhook/… — только у активного сценария. Вторая причина — WEBHOOK_URL указывает не на публичный адрес, тогда n8n выдаёт ссылки на внутреннее имя. Логи в панели сразу показывают, доходит ли запрос до сервиса.
Можно ли поднять базу рядом с n8n?
Да. Один проект поднимает сколько угодно связанных сервисов: опишите PostgreSQL рядом и переключите n8n на него через DB_TYPE=postgresdb. Тому базы тоже нужен именованный том, иначе она обнулится при обновлении. Если сценариев немного, можно остаться на встроенном SQLite.