n8n Self-Hosted: как поднять систему автоматизации на своём VPS и забыть про подписку

24.03.2026
10:26

Представьте конструктор где соединяете блоки — "когда пришло письмо", "отправить в Telegram", "записать в таблицу". Без кода, визуально, мышкой. Это n8n — система построения автоматических цепочек действий между разными сервисами.

Аналог Zapier или Make знакомый многим, только с тремя преимуществами: код открытый, данные под вашим контролем, платить надо только за сервер. Облачная версия от создателей n8n берёт от двадцатки долларов месяц просто за доступ. Собственный VPS обходится в район десятки евро и дальше никаких абонементов.

Разница становится заметной через пару месяцев использования. За год экономия €120-240 против облака, плюс снимаются искусственные ограничения на количество выполнений сценариев. Сколько хотите автоматизаций — столько и крутится, упираетесь только в мощность выбранного сервера.

Дальше покажу как поставить всё необходимое на чистый Linux сервер. Получите рабочую систему с SSL шифрованием, доменным именем, автоматическим стартом после перезагрузки. В конце разберём несколько готовых сценариев которые можно сразу использовать.

Подготовка: что понадобится

Виртуальный или физический сервер под Linux:

Стартовая конфигурация — одно виртуальное ядро процессора, 2 гигабайта оперативки, 20 гигов диска. Этого достаточно для запуска 5-10 автоматизаций одновременно. Планируете активно использовать — возьмите сразу два ядра и 4 гига памяти, оставите запас.

Дистрибутив Ubuntu версии 22.04 или новее. Инструкция заточена под Ubuntu, хотя на Debian команды идентичные — просто меняете источники пакетов и всё работает так же.

Доменное имя или поддомен:

Понадобится адрес типа automation.ваш-сайт.ru для доступа к панели n8n. Регистрация домена стоит около тысячи рублей в год, либо используйте уже существующий добавив поддомен.

В DNS настройках создаёте A запись указывающую на IP вашего сервера. У большинства регистраторов это делается в разделе управления DNS — создаёте новую запись типа A с именем automation и значением равным айпишнику сервера.

Электронная почта для сертификата:

Let's Encrypt при выпуске SSL сертификата запрашивает email. Нужен только для уведомлений о продлении — указываете любой рабочий ящик.

Доступ по SSH с правами администратора:

После создания VPS обычно приходят данные для подключения — логин root плюс либо пароль либо SSH ключ. Проверьте что можете зайти на сервер командой ssh root@ip-адрес.

Настраиваем операционную систему

Подключаемся к серверу через терминал:

ssh root@123.45.67.89

Первым делом обновляем установленные пакеты до актуальных версий:

apt update && apt upgrade -y

Флаг -y автоматически отвечает "да" на все вопросы установщика, процесс идёт без остановок.

Следующий шаг — установка Docker. Это своего рода контейнер где будет жить n8n изолированно от основной системы. Если что-то пойдёт не так внутри контейнера, операционка останется нетронутой. Плюс проще обновлять — просто перезапускаете с новой версией образа.

Добавляем официальный репозиторий Docker:

apt install -y ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null

Эти команды настраивают систему брать Docker из официального источника разработчиков, а не из стандартных репозиториев Ubuntu где версии обычно отстают.

Обновляем список пакетов и ставим Docker со всеми компонентами:

apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

Проверяем успешность установки:

docker --version

В ответ должна прилететь строка с версией вроде Docker version 25.0.3, build 4debf41. Конкретные цифры версии могут отличаться — важно чтобы команда отработала без ошибок.

Включаем автоматический запуск Docker при старте сервера:

systemctl enable docker
systemctl start docker

Теперь даже после перезагрузки сервера Docker поднимется сам и запустит все контейнеры которые были настроены на автостарт.

Запуск n8n внутри Docker контейнера

Создаём отдельную директорию где будут храниться все файлы связанные с n8n:

mkdir -p /opt/n8n
cd /opt/n8n

Внутри создаём конфигурационный файл описывающий как именно запускать контейнеры:

nano docker-compose.yml

Открывается текстовый редактор. Вставляем следующую конфигурацию, заменив automation.ваш-домен.com на реальный адрес и ваш@email.com на вашу почту:

version: '3.8'

services:
  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    ports:
      - "5678:5678"
    environment:
      - N8N_HOST=automation.ваш-домен.com
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - NODE_ENV=production
      - WEBHOOK_URL=https://automation.ваш-домен.com/
      - GENERIC_TIMEZONE=Europe/Moscow
    volumes:
      - /opt/n8n/dаta:/home/node/.n8n
      - /opt/n8n/files:/files
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.n8n.rule=Host(`automation.ваш-домен.com`)"
      - "traefik.http.routers.n8n.entrypoints=websecure"
      - "traefik.http.routers.n8n.tls.certresolver=mytlschallenge"
      - "traefik.http.services.n8n.loadbalancer.server.port=5678"

  traefik:
    image: traefik:v2.10
    container_name: traefik
    restart: unless-stopped
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.mytlschallenge.acme.tlschallenge=true"
      - "--certificatesresolvers.mytlschallenge.acme.email=ваш@email.com"
      - "--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json"
      - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
      - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /opt/n8n/letsencrypt:/letsencrypt

Сохраняем: жмём Ctrl+O, подтверждаем Enter, выходим через Ctrl+X.

Разбираем что прописали в конфигурации. Запускаются два контейнера параллельно:

Первый — сам n8n. Переменная N8N_HOST указывает домен по которому будет доступен интерфейс. WEBHOOK_URL нужен для корректной работы вебхуков — когда внешние сервисы посылают данные в n8n. GENERIC_TIMEZONE ставит часовой пояс — меняйте на свой если находитесь не в Москве.

Второй контейнер — Traefik, это реверс-прокси который автоматически получает SSL сертификат от Let's Encrypt и настраивает HTTPS. Без него пришлось бы вручную возиться с настройкой nginx или apache плюс отдельно запрашивать сертификат — Traefik делает всё сам.

Создаём папки где будут храниться данные:

mkdir -p /opt/n8n/data /opt/n8n/files /opt/n8n/letsencrypt

Директория data хранит все ваши воркфлоу и настройки. files используется если автоматизации работают с файлами. letsencrypt — туда Traefik складывает полученные SSL сертификаты.

Стартуем конфигурацию:

docker compose up -d

Флаг -d означает detached mode — контейнеры запускаются в фоне, терминал не блокируется. При первом запуске Docker скачает необходимые образы с интернета, это займёт минуту-две в зависимости от скорости канала. Потом контейнеры стартуют, Traefik сходит в Let's Encrypt и получит сертификат автоматически.

Проверяем что контейнеры успешно запустились:

docker compose ps

Должны увидеть примерно следующее:

NAME                IMAGE               STATUS
n8n                 n8nio/n8n:latest    Up 30 seconds
traefik             traefik:v2.10       Up 30 seconds

Статус Up значит всё работает. Если там написано Exited или Restarting — смотрим логи что пошло не так.

Проверяем логи n8n контейнера:

docker compose logs -f n8n

Листаете вывод, ищете строчку вроде Editor is now accessible via: https://automation.ваш-домен.com. Если видите — поздравляю, n8n запустился успешно. Останавливаете просмотр логов через Ctrl+C.

Первый вход и создание учётной записи

Открываете браузер, переходите на адрес который указали в конфигурации — https://automation.ваш-домен.com

При первом заходе встречает экран регистрации владельца системы. Вводите:

  • Email — используется для входа в систему
  • Пароль — придумайте сложный, это ключ ко всем вашим автоматизациям

После создания аккаунта попадаете в рабочий интерфейс n8n. Слева панель со списком воркфлоу (пока пустая), справа холст где собираете цепочки из нод.

Несколько слов про безопасность:

По умолчанию интерфейс n8n доступен любому кто знает адрес. Если планируете хранить там чувствительную информацию — добавьте защиту.

Простейший вариант — ограничить доступ по IP адресу через firewall. Например разрешаете заходить только с вашего офисного IP:

ufw allow from 123.45.67.89 to any port 443
ufw enable

Замените 123.45.67.89 на IP откуда будете заходить. Можно добавить несколько команд для нескольких адресов. Главное проверьте что текущий IP откуда подключены — в списке разрешённых, иначе заблокируете сами себя.

Настройка через переменные окружения

Поведение n8n управляется переменными окружения прописанными в секции environment файла docker-compose.yml. Разберём полезные опции.

Переключение на PostgreSQL вместо SQLite:

Из коробки n8n хранит данные в файле SQLite. Для небольших нагрузок нормально, но если планируете активное использование с сотнями выполнений в день — лучше перейти на полноценную базу данных.

Добавляете в секцию environment контейнера n8n:

- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=придумайте-сложный-пароль

И добавляете новый сервис PostgreSQL в тот же docker-compose.yml:

  postgres:
    image: postgres:15
    container_name: n8n-postgres
    restart: unless-stopped
    environment:
      - POSTGRES_DB=n8n
      - POSTGRES_USER=n8n
      - POSTGRES_PASSWORD=тот-же-пароль-что-выше
    volumes:
      - /opt/n8n/postgres:/var/lib/postgresql/data

После изменений перезапускаете:

docker compose down
docker compose up -d

Хранение API ключей безопасно:

Многие воркфлоу интегрируются со сторонними API — Telegram, OpenAI, Notion, что угодно. Вместо того чтобы вбивать токены прямо в ноды, лучше держать их в переменных окружения:

- TELEGRAM_BOT_TOKEN=1234567890:ABCdefGHIjklMNOpqrsTUVwxyz
- OPENAI_API_KEY=sk-proj-...
- NOTION_TOKEN=secret_...

Внутри воркфлоу обращаетесь как $env.TELEGRAM_BOT_TOKEN — если токен поменяется, меняете в одном месте и все воркфлоу подхватят новое значение автоматически.

Ограничение потребления ресурсов:

Если заметили что n8n начинает жрать всю память на сложных воркфлоу с большими объёмами данных:

- N8N_PAYLOAD_SIZE_MAX=16
- EXECUTIONS_DATA_MAX_AGE=168
- EXECUTIONS_DATA_PRUNE=true

Первая строка лимитирует размер данных передаваемых между нодами — 16 мегабайт максимум. Следующие две включают автоматическую очистку истории выполнений старше недели, иначе со временем база раздувается.

Практические примеры автоматизации

Пример первый: уведомления в мессенджер при заполнении формы

Задача: каждый раз когда кто-то оставляет заявку на сайте, моментально получать уведомление в Telegram с данными отправителя.

Сначала создаём бота. Открываете Telegram, ищете @BotFather, пишете /newbot, следуете инструкциям. В конце получаете токен доступа — длинную строку вроде 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11.

В n8n создаёте новый workflow, добавляете две ноды:

Нода Webhook — точка входа где n8n ждёт входящие данные:

  • HTTP Method выбираете POST
  • Path указываете form-submit (будет частью URL)
  • Response Mode ставите Last Node

Нода Telegram — отправка сообщения:

  • Добавляете credentials с токеном бота
  • Chat ID — ваш личный айди в Телеграме (узнать можно написав боту @userinfobot)
  • В поле Text собираете сообщение из данных вебхука:
Новая заявка с сайта!

Имя: {{$json.name}}
Email: {{$json.email}}
Телефон: {{$json.phone}}
Сообщение: {{$json.message}}

Соединяете ноды стрелкой, активируете воркфлоу переключателем в правом верхнем углу. n8n покажет URL вебхука — что-то вроде:

https://automation.ваш-домен.com/webhook/form-submit

На сайте в HTML форме добавляете отправку на этот адрес. Пример на чистом jаvascript:

<form id="contactForm">
  <input name="name" placeholder="Ваше имя" required>
  <input type="email" name="email" placeholder="Email" required>
  <input name="phone" placeholder="Телефон">
  <textarea name="message" placeholder="Сообщение"></textarea>
  <button type="submit">Отправить</button>
</form>

<script>
document.getElementById('contactForm').addEventListener('submit', async function(e) {
  e.preventDefault();
  
  const formData = new FormData(this);
  const data = Object.fromEntries(formData);
  
  const response = await fetch('https://automation.ваш-домен.com/webhook/form-submit', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify(data)
  });
  
  if (response.ok) {
    alert('Спасибо! Мы получили вашу заявку.');
    this.reset();
  }
});
</script>

Теперь каждая отправка формы моментально прилетает уведомлением в Telegram. Никаких задержек, данные поступают в реальном времени.

Пример второй: мониторинг цен конкурентов

Задача: автоматически проверять цену товара у конкурента каждый день в одно время и записывать в Google таблицу. Через месяц видите динамику — растут или падают.

Создаёте воркфлоу из следующих нод:

Schedule Trigger — запуск по расписанию:

  • Выбираете режим Cron
  • Вводите выражение 0 9 * * * — означает каждый день в 9 утра
  • Можете настроить любое время удобное вам

HTTP Request — загрузка страницы конкурента:

  • Method: GET
  • URL: адрес страницы товара у конкурента
  • Ответ приходит в виде HTML кода страницы

HTML Extract — вытаскивание цены из HTML:

  • В поле Selector вводите CSS селектор элемента с ценой
  • Например .product-price или #price — зависит от вёрстки сайта
  • Extract: выбираете Text

Code — обработка и форматирование:

  • Пишете простой jаvascript чтобы вытащить только цифры:
const price = $input.item.json.price;
const cleanPrice = parseInt(price.replace(/\D/g, ''));
const date = new Date().toISOString().split('T')[0];

return {
  date: date,
  price: cleanPrice
};

Google Sheets — запись в таблицу:

  • Подключаете Google аккаунт через OAuth
  • Выбираете таблицу и лист
  • Operation: Append (добавление строки)
  • Указываете диапазон куда писать, например A:B

Активируете воркфлоу. Дальше система работает сама — каждое утро проверяет цену и фиксирует в таблице. Через пару недель видите тренд изменений, можете строить графики прямо в Google Sheets.

Пример третий: резервное копирование важных файлов

Задача: раз в неделю архивировать определённую директорию с сервера и заливать архив в облачное хранилище. Полная автоматизация бэкапа без ручного участия.

Воркфлоу строится из следующих блоков:

Schedule Trigger настроенный на еженедельный запуск:

  • Cron выражение 0 3 * * 0 — каждое воскресенье в 3 ночи
  • Выбирайте время когда нагрузка на сервер минимальная

Execute Command — создание архива:

  • Команда: tar -czf /tmp/backup-$(date +%Y-%m-%d).tar.gz /var/www/html
  • Архивирует директорию /var/www/html в файл с текущей датой в имени
  • Формат tar.gz обеспечивает хорошее сжатие

Read Binary File — чтение созданного архива:

  • File Path: /tmp/backup-$(date +%Y-%m-%d).tar.gz
  • n8n загружает файл в память для дальнейшей передачи

Google Drive или Dropbox — загрузка в облако:

  • Подключаете аккаунт через OAuth
  • Operation: Upload
  • Файл автоматически заливается в корень или указанную папку

Execute Command — очистка временных файлов:

  • Команда: rm /tmp/backup-*.tar.gz
  • Удаляет временные архивы чтобы не забивали место

После активации воркфлоу бэкапы создаются автоматически каждую неделю. В облаке накапливается история копий, можете в любой момент откатиться на нужную дату.

Обслуживание системы

Резервное копирование n8n:

Все важные данные n8n лежат в директории /opt/n8n/data — там воркфлоу, учётные записи, история выполнений. Для сохранности создайте скрипт регулярного бэкапа.

Создаёте файл скрипта:

nano /root/backup-n8n.sh

Вставляете содержимое:

#!/bin/bash
BACKUP_DIR="/root/n8n-backups"
DATE=$(date +%Y-%m-%d-%H%M)

mkdir -p $BACKUP_DIR
tar -czf $BACKUP_DIR/n8n-backup-$DATE.tar.gz /opt/n8n/data

# Удаляем копии старше месяца
find $BACKUP_DIR -name "n8n-backup-*.tar.gz" -mtime +30 -delete

Делаете исполняемым:

chmod +x /root/backup-n8n.sh

Добавляете в расписание автоматического запуска:

crontab -e

Вставляете строку (запуск каждую ночь в 2 часа):

0 2 * * * /root/backup-n8n.sh

Сохраняете, выходите. Теперь каждую ночь создаётся свежая копия данных в /root/n8n-backups, старые копии автоматически удаляются через 30 дней.

Обновление до новых версий:

Разработчики регулярно выпускают обновления с новыми фичами и исправлениями уязвимостей. Обновляться просто:

cd /opt/n8n
docker compose pull
docker compose down
docker compose up -d

Команда pull скачивает свежую версию образа n8n с Docker Hub. Потом останавливаете старые контейнеры и запускаете новые. Данные сохраняются так как живут в томах вне контейнера.

Мониторинг состояния:

Проверить работают ли контейнеры:

docker compose ps

Посмотреть последние сообщения в логах:

docker compose logs --tail=100 n8n

Следить за логами в реальном времени (удобно при отладке):

docker compose logs -f n8n

Типичные проблемы и решения

Интерфейс не открывается в браузере

Первым делом проверяете правильность DNS настройки:

nslookup automation.ваш-домен.com

Команда должна вернуть IP адрес вашего сервера. Если возвращает другой IP или ошибку — проблема в DNS записи. Либо неправильно настроили, либо изменения ещё не распространились по интернету (может занять до суток, обычно минут 15-30).

Проверяете статус контейнеров:

docker compose ps

Если статус не Up — смотрите что пишут логи:

docker compose logs traefik
docker compose logs n8n

Ищите строки с ERROR или FATAL, они подскажут в чём проблема.

Вебхуки не срабатывают

Частая причина — неправильно указан WEBHOOK_URL в переменных окружения. Должен точно совпадать с N8N_HOST и обязательно начинаться с https://.

Проверьте что воркфлоу активирован — переключатель Active в правом верхнем углу должен быть включен. Неактивный воркфлоу не обрабатывает входящие запросы.

Убедитесь что в webhook ноде path прописан без слэша в начале. Правильно: form-submit, неправильно: /form-submit.

Ошибки нехватки памяти

Если n8n вылетает с сообщением jаvascript heap out of memory — Node.js процессу не хватает выделенной памяти.

Добавляете в секцию environment контейнера n8n:

- NODE_OPTIONS=--max-old-space-size=2048

Цифра 2048 означает 2 гигабайта памяти для процесса Node.js. Если на сервере 4 гига ОЗУ, можете поставить 3072. Не ставьте всю доступную память — оставьте запас для системы.

SSL сертификат не получается выпустить

Смотрите логи Traefik:

docker compose logs traefik | grep acme

Частая причина — порты 80 или 443 уже заняты другим процессом. Проверяете:

ss -tulpn | grep :80
ss -tulpn | grep :443

Если там висит nginx, apache или ещё что — останавливаете перед запуском n8n. Let's Encrypt должен иметь прямой доступ к портам для проверки владения доменом.

Ещё причина — DNS запись не указывает на ваш сервер. Let's Encrypt при выпуске сертификата проверяет что домен резолвится именно на тот IP откуда идёт запрос.

Своё против облачного

Аргументы за собственный сервер:

Экономия денег на дистанции. Облако n8n.cloud стоит минимум $20 месяц за базовый план. Собственный VPS обходится €10-15 месяц. За год разница €120-180, за два года уже €240-360.

Контроль над данными. Всё хранится на вашем железе, никакие третьи стороны не имеют доступа к воркфлоу и данным проходящим через систему. Для работы с чувствительной информацией критично.

Отсутствие искусственных лимитов. В облаке базовый план ограничен 5000 выполнений месяц, потом доплачиваете. Self-hosted версия не считает выполнения — крутите сколько влезает в мощность сервера.

Возможность кастомизации. Открытый исходный код позволяет менять что угодно — добавлять свои ноды, интегрироваться с внутренними API компании, настраивать под специфические задачи.

Аргументы за облачную версию:

Не нужно заниматься администрированием. Установка, настройка, обновления, бэкапы, безопасность — всё лежит на плечах команды n8n.cloud.

Высокая доступность из коробки. Облачный сервис даёт SLA 99.9% uptime. Self-hosted — зависит от того насколько грамотно настроили инфраструктуру.

Подходит для малых нагрузок. Если используете пару воркфлоу изредка — платить за простаивающий VPS может быть дороже чем облачная подписка.

Совместная работа. В облаке проще организовать доступ для команды с разделением прав — кто может редактировать, кто только смотреть.

Итоги

Self-hosted установка n8n даёт в руки мощный инструмент автоматизации за стоимость скромного виртуального сервера. Первоначальная настройка занимает время, зато дальше система крутится сама — вы только создаёте воркфлоу и собираете результат.

Экономия против облачной версии окупает вложенное время уже через несколько месяцев использования. Плюс получаете полную свободу действий — никаких лимитов на выполнения, ваши данные под контролем, возможность менять код под задачи.

VPS на THE.Hosting с конфигурацией 2 vCPU / 4 GB RAM / 40 GB NVMe за €10-12/месяц идеально подходит для n8n с запасом на рост. NVMe диски ускоряют работу с базой данных воркфлоу, а выбор из 50+ локаций позволяет поставить сервер близко к вашим пользователям для минимальной задержки webhook.

Возникнут вопросы по настройке — поддержка THE.Hosting доступна круглосуточно и поможет с конфигурацией сервера под n8n.

Другие статьи

24.03.2026
11
База знаний / Все о доменах
Доменная зона .HOST
24.03.2026
11
База знаний / Все о доменах
Доменная зона .TEL