Зачем ставить n8n на свой VPS

Облачный n8n удобен ровно до первого серьёзного проекта. Стартовый тариф стоит от 20 евро в месяц и ограничивает число активных воркфлоу и выполнений; как только вы подключаете телеграм-бота, который отвечает клиентам круглосуточно, лимиты заканчиваются быстро. Self-hosted версия (Community edition) бесплатна: сколько угодно воркфлоу, сколько угодно выполнений, единственный потолок — ресурсы вашего сервера.

Второй аргумент важнее денег: данные остаются у вас. Через n8n проходят токены ботов, API-ключи, переписка с клиентами, содержимое CRM. На своём VPS всё это лежит в вашей базе на вашем диске, а не в чужом облаке. Для автоматизаций с персональными данными это не «приятный бонус», а требование здравого смысла.

Третий — цена. VPS с 2 ГБ оперативной памяти у любого хостера стоит примерно как две чашки кофе в месяц, и на нём же поместятся ещё пара ботов и небольшой сайт. Дальше — пошаговая установка, рассчитанная на человека без DevOps-опыта: копируйте команды по порядку, и через 30–40 минут у вас будет рабочий n8n с HTTPS и вебхуками.

Минимальные требования к VPS

n8n нетребователен, но у «нетребователен» есть конкретные цифры:

  • RAM: 2 ГБ — комфортный минимум. Сам n8n в простое ест 300–500 МБ, но при обработке больших JSON-ответов от нейросетей потребление скачет. На 1 ГБ жить можно, но только с включённым swap (команды — в разделе про ошибки).
  • CPU: 1–2 ядра. Для личных автоматизаций и ботов хватит одного, но второе ядро спасает, когда несколько воркфлоу срабатывают одновременно.
  • Диск: 20 ГБ SSD. Сама база n8n маленькая, место съедают Docker-образы и логи выполнений.
  • ОС: Ubuntu 22.04 или 24.04 LTS. Все команды ниже проверены именно на них.
  • Домен или поддомен — обязателен для вебхуков. Telegram, например, отправляет вебхуки только на HTTPS-адрес с валидным сертификатом, по голому IP работать не будет. Поддомен вида n8n.вашдомен.ru — идеальный вариант.

Шаг 1. Устанавливаем Docker и Docker Compose

Подключитесь к серверу по SSH и обновите систему:

sudo apt update && sudo apt upgrade -y

Docker ставится официальным скриптом одной командой — он же подтянет и плагин Docker Compose:

curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER

Вторая команда добавляет вашего пользователя в группу docker, чтобы не писать sudo перед каждой командой. Она сработает после перелогина: выйдите из SSH-сессии и зайдите снова, затем проверьте:

docker --version
docker compose version

Обе команды должны напечатать версии без ошибок. Заодно закроем лишние порты фаерволом — наружу должны смотреть только SSH и веб:

sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

Шаг 2. docker-compose.yml для n8n

Создаём папку проекта и файл конфигурации:

mkdir -p ~/n8n && cd ~/n8n
nano docker-compose.yml

Вставьте этот конфиг, заменив n8n.example.com на свой домен (в двух местах):

services:
  n8n:
    image: docker.n8n.io/n8nio/n8n
    container_name: n8n
    restart: unless-stopped
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      - N8N_HOST=n8n.example.com
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://n8n.example.com/
      - N8N_PROXY_HOPS=1
      - N8N_RUNNERS_ENABLED=true
      - GENERIC_TIMEZONE=Europe/Moscow
      - TZ=Europe/Moscow
    volumes:
      - n8n_data:/home/node/.n8n

volumes:
  n8n_data:

Три вещи в этом файле спасают от самых частых проблем:

  • 127.0.0.1:5678:5678 — порт n8n открыт только для самого сервера. Снаружи к нему пустит лишь реверс-прокси с HTTPS (шаг 3). Если написать просто 5678:5678, ваш n8n будет торчать в интернет голым HTTP — так делать нельзя.
  • volumes: n8n_data — база данных, воркфлоу и ключ шифрования живут в Docker-томе, а не внутри контейнера. Без этой секции любой перезапуск с пересозданием контейнера сотрёт всё.
  • WEBHOOK_URL — именно этот адрес n8n подставляет в вебхуки. Забудете переменную — Telegram будет стучаться на localhost и бот молчать.

Ещё две строки нужны именно свежим версиям: N8N_PROXY_HOPS=1 сообщает n8n, что перед ним ровно один реверс-прокси — без неё n8n не доверяет заголовку X-Forwarded-For, пишет предупреждения в лог и неверно определяет IP клиентов. А N8N_RUNNERS_ENABLED=true включает task runners — новый механизм выполнения Code-нод; без этой переменной актуальный n8n при каждом старте выводит deprecation warning.

Важный нюанс, на котором спотыкаются старые инструкции: переменных N8N_BASIC_AUTH_ACTIVE, N8N_BASIC_AUTH_USER и подобных в актуальном n8n больше нет — их убрали ещё в версии 1.0. Вход теперь защищён встроенным аккаунтом владельца с логином и паролем (создадите на первом запуске), а если хочется второй замок — basic auth навешивается на реверс-прокси: в Caddy это директива basic_auth (хэш пароля генерирует caddy hash-password), в nginx — auth_basic с файлом от htpasswd. Запускаем:

docker compose up -d
docker compose logs -f n8n

Когда в логах появится строка Editor is now accessible via... — контейнер жив. Выйти из просмотра логов: Ctrl+C.

Шаг 3. Домен, HTTPS и вебхуки

В панели управления DNS вашего домена создайте A-запись: имя n8n, значение — IP сервера. Подождите 5–15 минут и проверьте, что ping n8n.example.com отвечает с нужного адреса. Дальше два равноценных пути.

Вариант А: Caddy (проще). Caddy сам получает и продлевает сертификат Let's Encrypt — конфиг занимает три строки. Установка из официального репозитория:

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install -y caddy

Замените содержимое файла /etc/caddy/Caddyfile на:

n8n.example.com {
    reverse_proxy 127.0.0.1:5678
}

И перезагрузите: sudo systemctl reload caddy. Всё — HTTPS уже работает.

Вариант Б: nginx + certbot (классика). Если на сервере уже стоит nginx или он вам привычнее:

sudo apt install -y nginx certbot python3-certbot-nginx

Создайте файл /etc/nginx/sites-available/n8n:

server {
    listen 80;
    server_name n8n.example.com;

    location / {
        proxy_pass http://127.0.0.1:5678;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 300s;
        client_max_body_size 50m;
    }
}

Строки Upgrade и Connection обязательны: редактор n8n работает через WebSocket, без них интерфейс будет открываться, но зависать. Включаем сайт и получаем сертификат:

sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d n8n.example.com

Certbot сам допишет HTTPS-блок в конфиг и настроит автопродление сертификата.

Первый запуск и аккаунт владельца

Откройте https://n8n.example.com в браузере. n8n предложит создать аккаунт владельца — email и пароль. Это локальная учётная запись, она хранится в вашей базе на сервере и никуда не отправляется. Первый зарегистрированный пользователь становится владельцем с полными правами, поэтому не откладывайте регистрацию: страница до создания владельца открыта всем, кто знает адрес.

После входа проверьте вебхуки: создайте воркфлоу с нодой Webhook, скопируйте Test URL и откройте его в браузере. Если в адресе ваш домен с https и воркфлоу ловит запрос — связка «домен → прокси → n8n» собрана правильно.

Обновление и бэкапы

n8n выпускает релизы почти каждую неделю. Обновление — три команды из папки проекта:

cd ~/n8n
docker compose pull
docker compose up -d
docker image prune -f

Данные при этом не трогаются — они в томе. Последняя команда подчищает старые образы, чтобы диск не забивался.

Бэкап — это архив Docker-тома. Сначала узнайте его точное имя (обычно это имя папки плюс имя тома — n8n_n8n_data):

docker volume ls

Затем архивируйте. На время архивации контейнер лучше остановить: n8n хранит данные в SQLite, и копия базы, снятая в момент записи, может оказаться битой. Пауза занимает секунды:

cd ~/n8n && docker compose stop
docker run --rm -v n8n_n8n_data:/data -v $PWD:/backup alpine \
  tar czf /backup/n8n-backup-$(date +%F).tar.gz -C /data .
docker compose start

В архив попадает всё: база SQLite, воркфлоу, учётные данные и файл config с ключом шифрования. Ключ шифрования критичен: сохранённые пароли и API-ключи зашифрованы именно им, и бэкап без него — мусор. Дополнительно можно выгружать воркфлоу в JSON штатной командой:

docker compose exec n8n n8n export:workflow --all --output=/home/node/.n8n/workflows-export.json

Скачивайте архив с сервера (например, командой scp) хотя бы раз в неделю или повесьте бэкап в cron.

Типовые ошибки и лечение

  • Вебхуки не приходят. В 90% случаев виновата переменная WEBHOOK_URL: её нет, в ней http вместо https или чужой домен. Проверьте, что в ноде Webhook показывается адрес вида https://n8n.example.com/webhook/.... Вторая причина — путаете Test URL и Production URL: тестовый работает только пока нажата кнопка «Listen for test event», боевой — только у активированного (тумблер Active) воркфлоу.
  • 502 Bad Gateway. Прокси жив, а n8n — нет. Смотрите docker ps: если контейнера нет в списке или он в статусе Restarting — читайте docker compose logs --tail=100 n8n. Если контейнер работает, проверьте, что в конфиге прокси указан порт 5678 и n8n слушает на 127.0.0.1.
  • Данные пропали после перезапуска. Запустили контейнер без секции volumes — всё хранилось внутри контейнера и умерло вместе с ним. Лечится только на будущее: конфиг из этой статьи и регулярные бэкапы. Проверить, что том подключён: docker inspect -f '{{ .Mounts }}' n8n — в выводе должно быть имя тома n8n_n8n_data.
  • Ошибка «secure cookie» при входе. n8n отдаёт cookie только по HTTPS, а вы открыли его по голому IP или http. Правильное лечение — зайти через домен с сертификатом. Обходной путь — добавить в environment строку N8N_SECURE_COOKIE=false, но только временно для отладки: с выключенной защитой в продакшене жить нельзя.
  • Контейнер периодически падает или зависает. Почти всегда — нехватка памяти на VPS с 1 ГБ. Проверьте free -h и добавьте swap:
    sudo fallocate -l 2G /swapfile
    sudo chmod 600 /swapfile
    sudo mkswap /swapfile
    sudo swapon /swapfile
    echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
    Если и со swap тесно — почистите историю выполнений в настройках n8n или переменной EXECUTIONS_DATA_MAX_AGE=168 (хранить логи 7 дней).

Что дальше: превращаем n8n в ИИ-агента

Пустой n8n — это конструктор; вся магия начинается, когда в цепочку встаёт LLM-нода. Проектировать агента с нуля не обязательно: промпт «Спроектировать ИИ-агента для n8n» выдаёт готовую архитектуру — триггер, цепочку нод с точными названиями и JSON-схему выхода. Если задача попроще — промпт, собирающий воркфлоу n8n из текстового описания, а для классики жанра есть пошаговый промпт телеграм-бота на n8n. Ваш свежеустановленный сервер уже готов ко всем трём: вебхуки работают, HTTPS есть, данные — у вас.

FAQ

Можно ли установить n8n без Docker, через npm?

Технически да: npm install n8n -g и запуск через pm2. Но официальная документация рекомендует Docker, и не зря: обновления одной командой, изоляция зависимостей, предсказуемые бэкапы тома. Способ с npm ломается при обновлениях Node.js и усложняет перенос на другой сервер, поэтому для продакшена берите Docker.

Потянет ли n8n самый дешёвый VPS с 1 ГБ RAM?

Для старта — да, если сразу включить swap на 2 ГБ (команды в разделе об ошибках) и не гонять воркфлоу с огромными файлами. Как только автоматизаций станет больше пяти активных или появятся тяжёлые ИИ-цепочки, переезжайте на 2 ГБ — апгрейд тарифа обычно делается без переустановки.

Как перенести воркфлоу из облачного n8n на свой сервер?

В облачной версии откройте каждый воркфлоу и скачайте его через меню «Download» — получите JSON-файл. На своём сервере: «Import from File». Учётные данные (credentials) так не переносятся — их придётся создать заново, это защита от кражи ключей. При десятках воркфлоу удобнее CLI-команды n8n export:workflow и n8n import:workflow.

Обязательно ли покупать отдельный домен для n8n?

Отдельный домен не нужен — достаточно бесплатного поддомена на любом уже имеющемся домене: одна A-запись вида n8n.вашсайт.ru. А вот совсем без домена, по голому IP, полноценно работать не выйдет: Telegram и большинство сервисов отправляют вебхуки только на HTTPS-адреса с валидным сертификатом, а certbot и Caddy выпускают сертификаты только на доменные имена, не на IP.

Сколько ресурсов ест n8n в простое и под нагрузкой?

В простое контейнер занимает 300–500 МБ RAM и почти не грузит CPU. Под нагрузкой всё зависит от воркфлоу: обработка текстов через LLM-ноды добавляет 100–300 МБ на выполнение, а парсинг больших таблиц или файлов может съесть гигабайт. Практическое правило: смотрите docker stats в пиковые часы первую неделю — станет ясно, хватает ли тарифа.