Как запустить n8n без своего сервера

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.