Как установить 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.1Docker откроет порт в интернет в обход 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) придётся создать заново: они зашифрованы ключом облачной версии.