Skip to content
RUEN

n8n на своём VPS: установка через Docker ​

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

Какой сервер нужен ​

n8n написан на Node.js и сам по себе нетяжёлый, но память уходит на данные, которые проходят через сценарии. Ориентиры:

НагрузкаТариф OBLAKO
Несколько сценариев по расписанию, вебхуки, ботыVPS-2 (1 vCPU, 2 GB)
Десятки сценариев, узлы Code, файлы и большие выборкиVPS-3 (2 vCPU, 4 GB)
n8n вместе с базой PostgreSQL и другими сервисамиVPS-4 (4 vCPU, 8 GB)

На тарифе с 1 GB n8n запустится, но первая же выгрузка на несколько тысяч строк может закончиться ошибкой нехватки памяти. Тарифы и цены на странице VPS, а как выбрать конфигурацию в целом, смотрите в статье Как выбрать VPS.

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

Дальше n8n.example.com это ваш поддомен, IP_СЕРВЕРА это адрес VPS.

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

Создайте A-запись: имя n8n, значение IP_СЕРВЕРА. Проверить, что запись уже работает, можно с вашего компьютера:

bash
ping n8n.example.com

В ответе должен быть IP вашего сервера. Пока запись не обновилась, сертификат HTTPS не выпустится, поэтому дождитесь этого до шага 5.

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

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

bash
apt update && apt upgrade -y
curl -fsSL https://get.docker.com | sh
docker compose version

Шаг 3. Подготовьте каталог и ключ шифрования ​

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

bash
mkdir -p /opt/n8n/local-files/backup && cd /opt/n8n
chown -R 1000:1000 local-files
echo "N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)" > .env
echo "N8N_DOMAIN=n8n.example.com" >> .env
echo "TZ=Europe/Moscow" >> .env
chmod 600 .env
cat .env

Скопируйте строку с ключом в менеджер паролей. Без неё бэкап базы бесполезен.

Ключ задаётся один раз

Если n8n уже запускался без N8N_ENCRYPTION_KEY, он сохранил свой ключ в каталоге данных. При несовпадении этого ключа с переменной n8n не запустится и напишет Mismatching encryption keys. Для существующей установки возьмите ключ из файла /home/node/.n8n/config внутри контейнера, а не генерируйте новый.

Шаг 4. Опишите контейнеры ​

Официальный пример n8n использует Traefik. Мы возьмём Caddy: его конфигурация занимает две строки, а сертификат Let's Encrypt он получает и продлевает сам.

Создайте Caddyfile:

bash
nano /opt/n8n/Caddyfile
{$N8N_DOMAIN} {
    reverse_proxy n8n:5678
}

Создайте compose.yaml:

bash
nano /opt/n8n/compose.yaml
yaml
services:
  n8n:
    image: n8nio/n8n:stable
    restart: always
    environment:
      - N8N_HOST=${N8N_DOMAIN}
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - N8N_PROXY_HOPS=1
      - N8N_WEBHOOK_URL=https://${N8N_DOMAIN}/
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
      - N8N_RESTRICT_FILE_ACCESS_TO=/files
      - NODE_ENV=production
      - GENERIC_TIMEZONE=${TZ}
      - TZ=${TZ}
    volumes:
      - n8n_data:/home/node/.n8n
      - ./local-files:/files

  caddy:
    image: caddy:2
    restart: always
    ports:
      - "80:80"
      - "443:443"
    environment:
      - N8N_DOMAIN=${N8N_DOMAIN}
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data

volumes:
  n8n_data:
  caddy_data:

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

  • У n8n нет секции ports: снаружи к нему не попасть в обход Caddy. Docker публикует порты мимо правил ufw, поэтому лучшая защита это не публиковать лишнего.
  • N8N_PROXY_HOPS=1 говорит n8n, что перед ним один прокси, и он правильно видит адреса клиентов.
  • N8N_WEBHOOK_URL нужен, чтобы ссылки вебхуков в редакторе были с вашим доменом, а не с localhost. В версиях до 2.30 эта переменная называлась WEBHOOK_URL.
  • Тег stable берёт последнюю стабильную версию. Если хотите обновляться осознанно, укажите конкретную, например n8nio/n8n:2.45.7.
  • Каталог local-files виден внутри n8n как /files. Узлы чтения и записи файлов работают только с ним. Владелец каталога 1000, потому что n8n в контейнере работает не от root, а от пользователя node с этим номером.

Шаг 5. Запустите n8n ​

bash
cd /opt/n8n
docker compose up -d
docker compose logs -f caddy

Когда в логах Caddy появится сообщение о полученном сертификате, нажмите Ctrl+C и откройте https://n8n.example.com. n8n попросит создать учётную запись владельца. Сделайте это сразу: пока владельца нет, форму может заполнить любой, кто откроет адрес.

Шаг 6. Закройте лишнее ​

Откройте в фаерволе только SSH и веб:

bash
apt install -y ufw
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

В настройках профиля n8n включите двухфакторную аутентификацию. Остальная базовая защита сервера в статье Как защитить свой VPS.

Бэкап ​

Полный бэкап n8n состоит из каталога данных (в нём база SQLite и файл с ключом) и ключа шифрования. Копировать базу SQLite на ходу ненадёжно, поэтому n8n лучше ненадолго остановить:

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

Имя тома n8n_n8n_data складывается из имени каталога проекта и тома. Проверьте его командой docker volume ls, если каталог у вас другой.

Дополнительно удобно выгружать сценарии и подключения отдельными JSON-файлами. Их легко перенести на другой сервер или откатить один сломанный сценарий:

bash
docker compose exec n8n n8n export:workflow --backup --output=/files/backup/workflows/
docker compose exec n8n n8n export:credentials --backup --output=/files/backup/credentials/

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

Обновление ​

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

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

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

Если что-то не работает ​

  • Сертификат не выпускается. Проверьте A-запись и что порты 80 и 443 открыты. Логи: docker compose logs caddy.
  • Вебхуки приходят на localhost. Проверьте N8N_WEBHOOK_URL и перезапустите контейнер: docker compose up -d.
  • Сценарий падает с ошибкой памяти. Обрабатывайте данные порциями. Если не помогает, нужен тариф с большим объёмом памяти: перейдите на тариф выше в карточке сервера, раздел Смена тарифа. Данные при этом остаются на месте.
  • После переезда не открываются подключения. На новом сервере должен быть тот же N8N_ENCRYPTION_KEY, что и на старом.