TürkiyeVPS

Установка n8n: развёртывание n8n на VPS с помощью Docker

Пошаговое руководство по запуску собственного сервера автоматизации n8n: установка Docker Engine, файл docker compose, обратный прокси Nginx, бесплатный SSL, обновление и резервное копирование.

7 мин чтения

n8n — это инструмент с открытым исходным кодом, который позволяет связывать приложения между собой и автоматизировать рабочие процессы. Записать данные из формы в таблицу, рассортировать письма, отправить вопрос модели ИИ и переслать ответ в Telegram — всё это собирается из узлов перетаскиванием. Если запускать n8n на своём сервере, а не в облачной версии, данные остаются у вас, а ограничения вроде количества рабочих процессов вас не касаются.

В этом руководстве мы установим n8n через Docker на VPS с Ubuntu 24.04. Схема будет такой:

  1. Docker Engine устанавливается из официального репозитория Docker.
  2. n8n запускается из файла docker compose и слушает только адрес 127.0.0.1:5678, доступный лишь изнутри сервера.
  3. Nginx принимает входящие запросы извне и передаёт их n8n.
  4. Certbot включает HTTPS с бесплатным сертификатом Let's Encrypt.

1. Подготовьте сервер

Подключитесь по SSH и обновите пакеты:

sudo apt update && sudo apt upgrade -y

Если сервер новый, советуем сначала выполнить базовые шаги из нашего руководства по безопасности Linux-сервера (SSH-ключи, запрет входа под root, файрвол). Кроме того, создайте в панели DNS A-запись для поддомена n8n, например n8n.ornek.com → IP-адрес VPS. Распространение записи может занять несколько минут.

2. Установите Docker Engine

Пакет docker.io из репозиториев Ubuntu тоже работает, но ради актуальной версии и плагина docker compose лучше использовать собственный репозиторий Docker:

sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Проверьте установку:

sudo docker run --rm hello-world
docker compose version

Если контейнер hello-world выводит приветствие и завершается, Docker готов.

Чтобы запускать команды без sudo, можно добавить пользователя в группу docker (sudo usermod -aG docker $USER). Но на практике эта группа равносильна правам root, поэтому в этом руководстве мы продолжаем с sudo.

3. Напишите файл docker compose

Создайте папку для n8n и запишите в неё файл compose:

sudo mkdir -p /opt/n8n
cd /opt/n8n
sudo nano compose.yaml

Содержимое (замените домен на свой):

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.ornek.com
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://n8n.ornek.com/
      - N8N_PROXY_HOPS=1
      - GENERIC_TIMEZONE=Europe/Istanbul
      - TZ=Europe/Istanbul
    volumes:
      - n8n_data:/home/node/.n8n

volumes:
  n8n_data:

Что означают настройки:

  • 127.0.0.1:5678:5678: n8n доступен только изнутри сервера. Это важно, потому что порты, опубликованные Docker, могут обходить правила UFW: если написать 5678:5678, n8n может оказаться открытым в интернет вопреки файрволу.
  • N8N_HOST и N8N_PROTOCOL: нужны, чтобы n8n правильно формировал собственный адрес.
  • WEBHOOK_URL: адрес, который узлы webhook и форм показывают внешнему миру. Если не задать его за обратным прокси, адреса вебхуков будут выглядеть бесполезно, например http://localhost:5678.
  • N8N_PROXY_HOPS=1: сообщает n8n, что перед ним стоит обратный прокси, и IP посетителя берётся из заголовка X-Forwarded-For.
  • GENERIC_TIMEZONE: задаёт часовой пояс для узлов расписания (Schedule). Без него рабочие процессы срабатывают по часовому поясу по умолчанию, а не по турецкому времени.
  • Том n8n_data: рабочие процессы, учётные данные, база SQLite и ключ шифрования хранятся в /home/node/.n8n. Потеряете том — потеряете всё.

О переменной N8N_SECURE_COOKIE

По умолчанию n8n отправляет cookie сессии только по HTTPS. Поэтому если открыть n8n по незашифрованному адресу вроде http://IP:5678, появится предупреждение о «secure cookie», и войти не получится. Некоторые руководства советуют добавить N8N_SECURE_COOKIE=false, но тогда пароль и сессия передаются по сети открытым текстом. Правильное решение — настроить HTTPS по шагам ниже. Используйте эту переменную только для короткой локальной проверки и потом уберите её.

Запустите n8n:

sudo docker compose up -d
sudo docker compose logs -f

Когда в журнале появится строка о том, что n8n готов, нажмите Ctrl+C, чтобы перестать следить за журналом; контейнер продолжит работать. Команда curl -I http://127.0.0.1:5678 должна вернуть HTTP-ответ.

4. Настройте обратный прокси Nginx

sudo apt install -y nginx
sudo nano /etc/nginx/sites-available/n8n
server {
    listen 80;
    server_name n8n.ornek.com;

    client_max_body_size 50M;

    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 3600s;
    }
}

Заголовки Upgrade и Connection нужны для websocket-соединения. Через него редактор n8n передаёт в браузер результаты во время выполнения рабочего процесса; без этих строк редактор показывает предупреждение «Connection lost», и вывод запущенного процесса не появляется на экране. proxy_read_timeout не даёт обрываться долгим запросам.

Включите сайт:

sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

5. Файрвол и SSL

Если вы используете UFW, разрешите только SSH и веб-трафик. Открывать порт 5678 не нужно:

sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable

Получите сертификат Let's Encrypt:

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d n8n.ornek.com

Certbot добавит настройки HTTPS в файл Nginx и настроит автоматическое продление. Теперь можно открыть https://n8n.ornek.com и создать первую учётную запись администратора. Сделайте это сразу: пока страница первоначальной настройки открыта, любой, кто знает адрес, может создать учётную запись владельца раньше вас.

Обновление n8n

Новые версии n8n выходят часто. Для обновления выполните в папке compose:

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

Данные хранятся в томе, поэтому пересоздание контейнера не удаляет рабочие процессы. И всё же перед переходом на новую мажорную версию сделайте резервную копию и прочитайте раздел о несовместимых изменениях (breaking changes) в примечаниях к выпуску. Если нужно остаться на определённой версии, добавьте к имени образа тег, например docker.n8n.io/n8nio/n8n:1.x.y.

Резервное копирование

Самое важное — том n8n_data. Docker compose добавляет к имени тома имя папки; чтобы увидеть настоящее имя:

sudo docker volume ls

Если папка — /opt/n8n, имя, скорее всего, будет n8n_n8n_data. Для целостной копии ненадолго остановите n8n и заархивируйте том:

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

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

Если хотите дополнительно выгрузить рабочие процессы в JSON:

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

Сколько нужно RAM?

Для небольшого числа простых рабочих процессов n8n работает при минимум 1 ГБ RAM, но это пограничное значение: памяти может не хватить, особенно при обработке больших JSON или одновременном запуске нескольких процессов. 2 ГБ и больше — комфортное начало. Если у вас большие файлы, много одновременных запусков или дополнительные сервисы на том же сервере, например локальная модель ИИ, закладывайте больше. Если не хотите делить ресурсы с другими, пакеты VDS дают более предсказуемую производительность.

Если не хотите заниматься установкой, посмотрите пакеты n8n & AI VPS: после оплаты наша команда устанавливает на сервер n8n, OpenWebUI, AI Agent или Cloudron — на ваш выбор — и передаёт его готовым к работе. Если предпочитаете установить всё сами, шаги из этого руководства без изменений работают на любом VPS TürkiyeVPS с root-доступом.

Часто задаваемые вопросы

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

Да, можно установить Node.js и запустить n8n через npm install -g n8n. Но тогда совместимость версий Node.js, обновления и управление службой ложатся на вас. С Docker обновление сводится к двум командам, и сама команда n8n рекомендует установку через Docker.

Редактор показывает «Connection lost». Почему?

Обычно в Nginx не хватает заголовков websocket. Убедитесь, что строки proxy_http_version 1.1, Upgrade и Connection "upgrade" есть в блоке location, затем выполните sudo nginx -t и sudo systemctl reload nginx.

Адреса вебхуков отображаются как localhost. Как исправить?

Укажите в файле compose в WEBHOOK_URL свой домен со слешем / на конце и пересоздайте контейнер командой sudo docker compose up -d.

Хватит ли SQLite или нужен PostgreSQL?

Для личного использования и небольших команд обычно хватает SQLite по умолчанию. Если вы храните большую историю запусков или планируете запускать n8n в нескольких процессах (queue mode), лучше подойдёт PostgreSQL.

Запустится ли n8n сам после перезагрузки сервера?

Да. Служба Docker стартует при загрузке, а благодаря настройке restart: unless-stopped в файле compose контейнер n8n тоже автоматически запускается снова.