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.
Что понадобится
- VPS с Ubuntu 24.04 или Debian 12. Как заказать, смотрите в инструкции Как заказать VPS.
- Домен или поддомен для n8n. Купить домен и прописать DNS можно в панели OBLAKO в разделе Домены.
- Доступ по SSH.
Дальше n8n.example.com это ваш поддомен, IP_СЕРВЕРА это адрес VPS.
Шаг 1. Направьте поддомен на сервер
Создайте A-запись: имя n8n, значение IP_СЕРВЕРА. Проверить, что запись уже работает, можно с вашего компьютера:
ping n8n.example.comВ ответе должен быть IP вашего сервера. Пока запись не обновилась, сертификат HTTPS не выпустится, поэтому дождитесь этого до шага 5.
Шаг 2. Установите Docker
Подключитесь к серверу и выполните:
apt update && apt upgrade -y
curl -fsSL https://get.docker.com | sh
docker compose versionШаг 3. Подготовьте каталог и ключ шифрования
n8n хранит логины и токены ваших подключений (почты, таблиц, ботов) в базе в зашифрованном виде. Ключ к ним n8n создаёт сам при первом запуске и кладёт в свой каталог данных. Если каталог пропадёт, а база останется, расшифровать подключения будет нечем. Поэтому зададим ключ сами и сохраним его отдельно.
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:
nano /opt/n8n/Caddyfile{$N8N_DOMAIN} {
reverse_proxy n8n:5678
}Создайте compose.yaml:
nano /opt/n8n/compose.yamlservices:
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
cd /opt/n8n
docker compose up -d
docker compose logs -f caddyКогда в логах Caddy появится сообщение о полученном сертификате, нажмите Ctrl+C и откройте https://n8n.example.com. n8n попросит создать учётную запись владельца. Сделайте это сразу: пока владельца нет, форму может заполнить любой, кто откроет адрес.
Шаг 6. Закройте лишнее
Откройте в фаерволе только SSH и веб:
apt install -y ufw
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enableВ настройках профиля n8n включите двухфакторную аутентификацию. Остальная базовая защита сервера в статье Как защитить свой VPS.
Бэкап
Полный бэкап n8n состоит из каталога данных (в нём база SQLite и файл с ключом) и ключа шифрования. Копировать базу SQLite на ходу ненадёжно, поэтому n8n лучше ненадолго остановить:
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-файлами. Их легко перенести на другой сервер или откатить один сломанный сценарий:
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 выпускает новую версию почти каждую неделю. Обновляйтесь хотя бы раз в месяц, чтобы не прыгать через много версий сразу, и перед обновлением делайте бэкап:
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, что и на старом.