Self-hosted n8n настройка на своём VPS занимает у меня в среднем 40-60 минут на чистом сервере - от установки Docker до рабочего HTTPS-домена с первым workflow. Держу несколько инстансов n8n под клиентские проекты: один гоняет заказы из WooCommerce в T‑Bank и статусы обратно, другой дёргает API СДЭК для расчёта доставки, третий кормит aiogram-ботов данными из Google Sheets по расписанию. Ниже разбираю, как я поднимаю n8n с нуля без облачной подписки - с базой Postgres, нормальным SSL и бэкапами, чтобы инстанс не отвалился через месяц.
Почему я держу n8n на своём VPS, а не в облаке
Облачный n8n Cloud удобен для старта, но на объёме упирается в лимит исполнений и ежемесячную оплату в валюте. Свой инстанс снимает эти ограничения: количество workflow и запусков ограничено только железом сервера, а данные клиентов не уходят на чужие мощности. Для проектов с персональными данными и эквайрингом это критично - заказы из WooCommerce с телефонами и суммами платежей я не хочу гонять через сторонний облачный обработчик.
Второй аргумент - деньги на дистанции. VPS за 400-700 ₽ в месяц тянет 5-10 активных workflow с сотнями исполнений в день. Облачный тариф под тот же объём на рынке обойдётся заметно дороже, и это уже не мои цены, а рыночный ориентир по подпискам SaaS-сервисов автоматизации.
| Критерий | n8n Cloud | Self-hosted на VPS |
|---|---|---|
| Оплата | Подписка ежемесячно | Аренда VPS от 400 ₽/мес |
| Лимит исполнений | По тарифу | Ограничен железом |
| Хранение данных | Серверы вендора | Ваш сервер |
| Обновления | Автоматически | Вручную, когда готовы |
| Кастомные ноды | Ограниченно | Любые npm-пакеты |
Требования к серверу для развёртывания n8n
Берём VPS с Ubuntu 22.04 или 24.04. Минимум для комфортной работы - 2 vCPU и 2 ГБ RAM. На 1 ГБ n8n с Postgres тоже запускается, но при парсинге больших ответов API или тяжёлых JSON контейнер начинает упираться в память и падать по OOM. На практике я беру 2 ГБ как базовую конфигурацию и 4 ГБ, если планирую AI-ноды с обращением к Claude API или обработку файлов.
Что нужно подготовить до установки:
- домен или поддомен (например
n8n.example.ru) с A‑записью на IP сервера; - открытые порты 80 и 443 в фаерволе провайдера;
- SSH-доступ по ключу, а не по паролю;
- установленный Docker и Docker Compose.
Docker ставлю официальным скриптом:
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# перелогиниться, чтобы группа применилась
Docker Compose v2 идёт плагином вместе с движком, отдельно ставить не нужно. Проверяю версию командой docker compose version - если отвечает, идём дальше.
Установка n8n в Docker Compose
Я всегда разворачиваю n8n не на SQLite «из коробки», а на отдельной базе Postgres. SQLite годится для теста на пять минут, но на реальной нагрузке блокировки записи начинают мешать параллельным исполнениям, и история запусков тормозит. Postgres снимает эту проблему сразу.
Создаю папку проекта и файл docker-compose.yml:
services:
n8n:
image: docker.n8n.io/n8nio/n8n:latest
restart: always
ports:
- "127.0.0.1:5678:5678"
environment:
- N8N_HOST=${N8N_HOST}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://${N8N_HOST}/
- GENERIC_TIMEZONE=Europe/Moscow
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
volumes:
- n8n_data:/home/node/.n8n
depends_on:
- postgres
postgres:
image: postgres:16
restart: always
environment:
- POSTGRES_DB=n8n
- POSTGRES_USER=n8n
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
volumes:
- pg_data:/var/lib/postgresql/data
volumes:
n8n_data:
pg_data:
Обратите внимание на 127.0.0.1:5678 - я привязываю порт n8n только к localhost, чтобы наружу он торчал исключительно через обратный прокси с SSL. Прямой доступ по IP:5678 закрыт, и это первый шаг к безопасности.
Рядом кладу файл .env с секретами:
N8N_HOST=n8n.example.ru
N8N_ENCRYPTION_KEY=сгенерировать: openssl rand -hex 24
POSTGRES_PASSWORD=длинный_случайный_пароль
Ключ N8N_ENCRYPTION_KEY шифрует сохранённые креды нод (токены, пароли API). Запишите его отдельно: без этого ключа после переустановки все сохранённые подключения превратятся в нечитаемый мусор, и связки с T‑Bank или СДЭК придётся заводить заново. Запускаю стек командой docker compose up -d и смотрю логи через docker compose logs -f n8n.
Бесплатный материал
🎁 Полезный скрипт в подарок
Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.
Без спама. Отписка в 1 клик.
Настройка домена и SSL-сертификата
n8n принципиально не хочет работать по HTTP на проде: вебхуки и OAuth-подключения требуют HTTPS. Раньше я ставил связку Nginx + certbot, но последние пару лет использую Caddy - он сам получает и продлевает сертификаты Let’s Encrypt без ручных крон-задач.
Ставлю Caddy на хост и правлю /etc/caddy/Caddyfile:
n8n.example.ru {
reverse_proxy 127.0.0.1:5678
}
Перезапускаю: sudo systemctl reload caddy. Через 10-20 секунд домен открывается по HTTPS с валидным сертификатом. Первое, что делает n8n на свежем инстансе, - предлагает создать аккаунт владельца: логин и пароль. Заводите сразу, до того как о домене узнают поисковые боты и сканеры.
Если предпочитаете Nginx, схема та же: proxy_pass http://127.0.0.1:5678, плюс проброс заголовков Upgrade и Connection для WebSocket - без них редактор workflow будет отваливаться при длинных сессиях. Caddy эти заголовки прописывает сам, поэтому на клиентских проектах я чаще беру именно его.
Переменные окружения и безопасность инстанса
Открытый в интернет n8n - лакомая цель: через него можно дёргать внутренние API и красть токены. Минимальный набор мер, который я включаю на каждом инстансе:
- Basic-аутентификация или встроенный логин. Свежие версии n8n требуют аккаунт владельца по умолчанию - не отключайте это.
- Фаервол. Через
ufwоставляю открытыми только 22, 80 и 443, порт 5678 наружу закрыт. - SSH по ключу. Парольный вход отключаю в
sshd_configсразу после первого захода. - Отдельный пользователь БД. Postgres крутится в своём контейнере и недоступен снаружи.
Ещё пара переменных, которые я дописываю в environment для прод-инстансов:
N8N_SECURE_COOKIE=true
N8N_RUNNERS_ENABLED=true
EXECUTIONS_DATA_PRUNE=true
EXECUTIONS_DATA_MAX_AGE=336
Последние две строки чистят историю исполнений старше 336 часов (14 дней). Без этого таблица execution_entity в Postgres разрастается до гигабайтов за месяц активной работы, и бэкапы начинают весить неприлично много. На инстансе, который обрабатывал заказы интернет-магазина, я поймал это на третьей неделе - база распухла до 4 ГБ на пустом месте, хотя реальных данных там было мегабайты.
Обновление, бэкапы и обслуживание
n8n релизится часто, и обновление на своём сервере делается вручную - это и минус (сами следите), и плюс (не прилетит ломающее изменение в неудачный момент). Обновляюсь так:
docker compose pull
docker compose up -d
docker image prune -f
Перед крупным мажорным обновлением всегда снимаю бэкап базы - откатиться на образ прошлой версии проще, чем восстанавливать сломанные workflow. Дамп Postgres делаю одной командой и складываю по дате:
docker compose exec -T postgres
pg_dump -U n8n n8n | gzip > backup_$(date +%F).sql.gz
Эту команду вешаю на cron раз в сутки и раз в неделю копирую дампы на внешнее хранилище. Отдельно бэкаплю том n8n_data - там лежит зашифрованный файл с ключами. Восстановление занимает пару минут: поднять чистый стек, залить дамп через psql, вернуть том - и инстанс работает как прежде.
Self-hosted или n8n Cloud - что выбрать под задачу
Свой сервер оправдан, когда исполнений много, данные чувствительные, а интеграции нестандартные - нужны кастомные ноды или обращения к внутренним сервисам. Для разовой связки «форма Tilda → уведомление в Telegram» проще взять облако и не возиться с администрированием.
Если задача сложнее - синхронизация CRM, эквайринг T‑Bank, расчёт доставки СДЭК, RAG-бот с базой знаний - то self-hosted окупается быстро, но требует времени на настройку и обслуживание. Не обязательно собирать каждый сценарий с нуля: часть логики можно взять из готовых workflow-шаблонов дляن8n и доработать под свои API. Когда возиться с сервером и нодами некогда, я поднимаю инстанс и собираю автоматизацию под ключ - автоматизация в n8n у меня от 25 000 ₽, комплексная интеграция с CRM, эквайрингом и СДЭК - от 40 000 ₽.
Связка сервисов без программистов
Автоматизация / n8n
от 25 000 ₽
Подробнее →Частые вопросы
Сколько ресурсов сервера нужно для self-hosted n8n?
Для 5-10 активных workflow с сотнями исполнений в день хватает VPS с 2 vCPU и 2 ГБ RAM. Если планируете AI-ноды с обращением к Claude API или обработку файлов и больших JSON, берите 4 ГБ. На 1 ГБ инстанс запустится, но при тяжёлых задачах будет падать по нехватке памяти.
Можно ли поставить n8n без Docker?
Да, через npm или npx, но я так делаю только для локального теста. На проде Docker Compose удобнее: изоляция, простое обновление образа, отдельный контейнер Postgres и предсказуемое восстановление из бэкапа. Установка через npm требует ручного управления Node.js и базой, и обслуживать её сложнее.
Что будет, если потерять N8N_ENCRYPTION_KEY?
Все сохранённые в нодах креды - токены API, пароли, ключи подключений к T‑Bank, СДЭК и прочим сервисам - станут нечитаемыми. Сами workflow останутся, но подключения придётся заводить заново. Поэтому ключ храните отдельно от сервера, вместе с паролем Postgres.
Как обновлять n8n, чтобы ничего не сломалось?
Перед обновлением снимаю дамп Postgres, затем docker compose pull и docker compose up -d. Мажорные версии читаю в changelog на предмет ломающих изменений. Если после апдейта workflow ведёт себя не так, откатываюсь на конкретный тег прошлого образа и восстанавливаю базу из дампа - на это уходит несколько минут.