Разработка · 7 мин чтения

Как настроить self-hosted n8n на своём сервере: гайд

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 ведёт себя не так, откатываюсь на конкретный тег прошлого образа и восстанавливаю базу из дампа - на это уходит несколько минут.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Самозанятый Калинкин Н. А. · работаю с физлицами и юрлицами

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно