MHOSTMHOST

Как установить n8n на VPS: пошаговая инструкция с Docker

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

Другие плюсы self-hosted версии: данные и доступы к сервисам хранятся на вашем сервере, можно ставить любые community-ноды и подключаться к внутренним сервисам. Для внутреннего использования в компании n8n бесплатен по лицензии Sustainable Use License, ограничения касаются перепродажи n8n как сервиса.

В инструкции ставим n8n по официальной схеме: Docker Compose, база PostgreSQL, отдельный контейнер для выполнения кода, Nginx и бесплатный SSL-сертификат. Команды для Ubuntu 22.04/24.04.

Что понадобится

  • VPS с 2 ГБ RAM и 2 vCPU. Этого хватит на десятки сценариев. Если планируете обрабатывать много файлов, запускать сценарии параллельно или работать с большими объёмами данных, берите 4 ГБ.
  • Диск от 20 ГБ. База n8n растёт с историей запусков.
  • Домен или поддомен, например n8n.example.com. Без HTTPS n8n не даст нормально войти, а внешние сервисы не смогут отправлять данные на вебхуки.
  • Настроенный сервер: пользователь с sudo, вход по SSH-ключу, firewall. Если сервер новый, сначала пройдите базовую настройку VPS.

Шаг 1. Установите Docker

n8n официально распространяется как Docker-образ, поэтому начинаем с Docker. Официальный скрипт ставит Docker Engine и плагин Docker Compose из репозитория Docker:

curl -fsSL https://get.docker.com | sudo sh

sudo usermod -aG docker $USER

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

docker --version

docker compose version

Обе команды должны вывести номер версии без ошибок.

Шаг 2. Направьте домен на сервер

В DNS-настройках домена создайте A-запись: имя n8n, значение — IP вашего VPS. Через несколько минут проверьте:

dig +short n8n.example.com

Команда должна вернуть IP сервера. Если домен подключён к Cloudflare, на время получения SSL-сертификата поставьте для записи серое облако (DNS only).

Шаг 3. Запустите n8n с PostgreSQL через Docker Compose

По умолчанию n8n хранит данные в SQLite. Для рабочего сервера лучше PostgreSQL: он надёжнее при параллельных запусках, и его проще бэкапить. Схема ниже повторяет официальный шаблон n8n: три контейнера — база, сам n8n и отдельный раннер, в котором безопасно выполняется код из нод Code (JavaScript и Python).

Создайте папку проекта:

mkdir ~/n8n && cd ~/n8n

Создайте файл .env с настройками и случайными паролями. Замените домен и часовой пояс на свои:

cat > .env <<EOF

N8N_VERSION=stable

N8N_DOMAIN=n8n.example.com

TIMEZONE=Europe/Kyiv

POSTGRES_USER=n8n

POSTGRES_PASSWORD=$(openssl rand -hex 24)

POSTGRES_DB=n8n

N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)

RUNNERS_AUTH_TOKEN=$(openssl rand -hex 32)

EOF

chmod 600 .env

Сохраните копию .env в надёжном месте. N8N_ENCRYPTION_KEY шифрует все подключения к сервисам: API-ключи, пароли, токены. Без него восстановить их из бэкапа невозможно.

Создайте docker-compose.yml:

services:
postgres:
image: postgres:16
restart: always
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
volumes:
- db_storage:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}']
interval: 5s
timeout: 5s
retries: 10

n8n:
image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
restart: always
ports:
- "127.0.0.1:5678:5678"
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- N8N_HOST=${N8N_DOMAIN}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://${N8N_DOMAIN}/
- N8N_PROXY_HOPS=1
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- GENERIC_TIMEZONE=${TIMEZONE}
- TZ=${TIMEZONE}
- N8N_RUNNERS_MODE=external
- N8N_RUNNERS_AUTH_TOKEN=${RUNNERS_AUTH_TOKEN}
- N8N_RUNNERS_BROKER_LISTEN_ADDRESS=0.0.0.0
volumes:
- n8n_storage:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy

n8n-runner:
image: n8nio/runners:${N8N_VERSION}
restart: always
environment:
- N8N_RUNNERS_AUTH_TOKEN=${RUNNERS_AUTH_TOKEN}
- N8N_RUNNERS_TASK_BROKER_URI=http://n8n:5679
depends_on:
- n8n

volumes:
db_storage:
n8n_storage:

Что здесь важно:

  • 127.0.0.1:5678:5678 — n8n доступен только с самого сервера. Наружу его отдаёт Nginx по HTTPS. Без 127.0.0.1 Docker откроет порт в интернет в обход firewall.
  • WEBHOOK_URL — адрес, который n8n подставляет в вебхуки. Без него внешние сервисы получат ссылку на localhost.
  • N8N_PROXY_HOPS=1 сообщает n8n, что он работает за одним прокси, и он правильно видит IP посетителей.
  • stable — последняя стабильная версия. Чтобы обновления не приходили неожиданно, можно указать конкретную версию.

Запустите:

docker compose up -d

docker compose logs -f n8n

Когда в логах появится строка о том, что редактор доступен по адресу, нажмите Ctrl+C — контейнеры продолжат работать.

Шаг 4. Настройте Nginx и SSL-сертификат

Nginx принимает HTTPS-запросы из интернета и передаёт их в n8n. Установите Nginx и Certbot для бесплатного сертификата Let's Encrypt, откройте веб-порты:

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

sudo ufw allow 'Nginx Full'

Создайте конфиг сайта /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-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
proxy_read_timeout 300s;
client_max_body_size 50m;
}
}

Заголовки Upgrade и Connection нужны для WebSocket: без них редактор n8n постоянно пишет «Connection lost». proxy_read_timeout не даёт Nginx обрывать долгие запросы, client_max_body_size разрешает загрузку файлов до 50 МБ.

Включите сайт и получите сертификат:

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 в конфиг и настроит автопродление сертификата. Проверить продление можно командой sudo certbot renew --dry-run.

Шаг 5. Создайте аккаунт владельца

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

Затем включите двухфакторную аутентификацию: Settings → Personal → Enable 2FA.

Чтобы проверить работу вебхуков, создайте сценарий с нодой Webhook и посмотрите её адрес. Он должен начинаться с https://n8n.example.com/webhook/, а не с localhost.

Шаг 6. Настройте бэкапы и обновления

Бэкап базы. В PostgreSQL хранятся все сценарии, подключения и история запусков. Создайте дамп:

cd ~/n8n

mkdir -p backups

docker compose exec -T postgres pg_dump -U n8n n8n | gzip > backups/n8n-$(date +%F).sql.gz

Чтобы делать бэкап каждую ночь в 3:00 и хранить копии 14 дней, добавьте задание в cron (crontab -e):

0 3 * * * cd ~/n8n && docker compose exec -T postgres pg_dump -U n8n n8n | gzip > backups/n8n-$(date +\%F).sql.gz && find backups -name '*.sql.gz' -mtime +14 -delete

Копируйте бэкапы и файл .env за пределы сервера: в S3-хранилище или на другой VPS. Бэкап без .env восстановит сценарии, но не доступы к сервисам.

Обновление n8n. Сначала сделайте бэкап, затем:

cd ~/n8n

docker compose pull

docker compose up -d

docker image prune -f

Перед обновлением на новую основную версию (например, с 2.x на 3.x) прочитайте заметки о выпуске на сайте n8n: в них бывают изменения, которые ломают старые сценарии.

Безопасность n8n

В n8n хранятся ключи ко всем подключённым сервисам: почте, CRM, платёжным системам. Взлом n8n открывает доступ ко всему сразу, поэтому защищать его нужно тщательнее обычного сайта.

  • Не открывайте порт 5678 наружу. Доступ только через Nginx и HTTPS, в compose-файле порт привязан к 127.0.0.1.
  • Включите 2FA для всех пользователей.
  • Обновляйте n8n регулярно. В нём периодически находят уязвимости, и исправления выходят в новых версиях.
  • Не включайте без необходимости опасные ноды. В свежих версиях нода Execute Command, которая выполняет команды на сервере, по умолчанию отключена. Оставьте так, если она вам не нужна.
  • Осторожно с community-нодами. Это сторонний код с доступом к вашим данным. Ставьте только популярные ноды с открытым исходным кодом.
  • Ограничьте доступ к редактору по IP, если работаете из офиса или через VPN. Добавьте в блок location / Nginx строки allow ВАШ_IP; и deny all;. Но тогда вебхуки вынесите в отдельный блок location /webhook/ без ограничений, иначе внешние сервисы не смогут их вызвать.

Частые ошибки

  • В адресе вебхука localhost:5678. Не задана переменная WEBHOOK_URL. Проверьте её в compose-файле и перезапустите: docker compose up -d.
  • Редактор пишет «Connection lost». Nginx не пропускает WebSocket. Проверьте строки Upgrade и Connection в конфиге Nginx.
  • Ошибка про secure cookie при входе. Вы открываете n8n по http:// или по IP. Заходите только по домену через https://.
  • После переноса не работают подключения к сервисам. На новом сервере другой N8N_ENCRYPTION_KEY. Перенесите старый ключ из .env.
  • n8n не подключается к базе после смены пароля в .env. PostgreSQL берёт пароль из .env только при первом запуске. Смените пароль внутри базы или верните прежний в .env.
  • Контейнер n8n постоянно перезапускается. Посмотрите причину: docker compose logs --tail 100 n8n. Если там нехватка памяти, добавьте swap или RAM.

Чек-лист

Частые вопросы

Сколько стоит self-hosted n8n? Сам n8n для внутреннего использования бесплатен, платите только за VPS. Облачная версия n8n берёт плату по тарифам с лимитом запусков, у своего сервера такого лимита нет.

Какой VPS нужен для n8n? Для старта хватит 2 ГБ RAM и 2 vCPU. Если сценарии обрабатывают файлы, работают с нейросетями или запускаются сотнями в час, берите 4 ГБ и больше.

Можно ли обойтись без домена? Технически n8n запустится по IP, но без HTTPS не будут работать вход и вебхуки внешних сервисов. Поддомен у любого регистратора стоит дешевле, чем время на обходные пути.

Чем self-hosted n8n отличается от облачного? Функции основной версии те же. В облаке n8n сам обновляет и бэкапит сервер, а на VPS это делаете вы, но получаете полный контроль над данными и не ограничены по числу запусков.

Как перенести сценарии из облачного n8n на свой сервер? Экспортируйте сценарии в JSON в облачной версии и импортируйте их на новом сервере. Подключения к сервисам (credentials) придётся создать заново: они зашифрованы ключом облачной версии.