Tropic Host

n8n: що це таке і як встановити його на VPS за допомогою Docker Compose

8 хв. читання
Tropic
n8n: що це таке і як встановити його на VPS за допомогою Docker Compose

n8n на VPS: власна платформа автоматизації без ручної рутини

З вебсайту надходить заявка. n8n перевіряє дані, шукає дублікати, створює угоду, готує чернетку відповіді за допомогою ШІ та сповіщає менеджера в Telegram. Людина втручається лише тоді, коли потрібне рішення, а не для перенесення даних між вкладками браузера.

Нижче розглянемо, як працює n8n і як встановити його на VPS за допомогою Docker Compose, PostgreSQL, HTTPS та ізольованого виконання коду.

n8n у семи кроках

Мінімальний план запуску:

  1. Створіть VPS і спрямуйте на нього піддомен, наприклад n8n.example.com.
  2. Встановіть Docker і Docker Compose.
  3. Запустіть n8n разом із PostgreSQL, зовнішнім task runner і Caddy.
  4. Відкрийте інтерфейс через HTTPS і створіть обліковий запис власника.
  5. Підключіть Telegram, CRM, email або зовнішній API.
  6. Налаштуйте обробку помилок і термін зберігання даних виконання.
  7. Автоматизуйте резервне копіювання бази даних, даних і ключа шифрування.

Для невеликої production-інсталяції розумно почати з 2 vCPU і 4 GB RAM. 2 GB часто достатньо для тестування, але PostgreSQL, Docker і паралельні процеси швидко використовують залишок ресурсів.

Що таке n8n і як він працює?

n8n — платформа автоматизації workflow. Workflow складається з node: одна запускає процес, наступні отримують і перетворюють дані, а остання виконує дію.

Простий workflow виглядає так:

Webhook → перевірка даних → CRM → Telegram → відповідь сайту

Ланцюжок може запускатися webhook, розкладом, email, повідомленням або подією у зовнішньому сервісі. Між node доступні умови, цикли, фільтри, очікування й обробка помилок.

Одна з переваг n8n — автоматизація не обмежується готовими інтеграціями. Через HTTP Request можна викликати будь-який сервіс з API, а власну логіку написати в Code node на JavaScript або Python. Тому n8n посідає проміжне місце між простим no-code конструктором і власним серверним кодом.

Чому це більше, ніж пересилання даних?

n8n корисний, коли процес охоплює кілька систем і потребує рішення:

форма → перевірка → пошук дубліката → оцінка ШІ → схвалення менеджера → CRM

Людину можна залишити лише в контрольній точці. Наприклад, ШІ готує відповідь, але повідомлення надсилається клієнту тільки після схвалення працівника.

Типові сценарії:

  • продажі та підтримка: збір заявок, призначення лідів і створення угод;
  • контент і ШІ: підготовка чернеток, класифікація запитів і публікація після схвалення;
  • DevOps: сповіщення про збої, Git webhook і перевірки API;
  • внутрішні операції: синхронізація таблиць, пошти, календарів і корпоративних систем.

Self-hosted інсталяція дає контроль над процесом і базою даних, але не робить зовнішні сервіси локальними. Дані, надіслані в Telegram, CRM або хмарну модель ШІ, залишають VPS.

n8n Cloud чи власний сервер?

Параметрn8n Cloudn8n на VPS
ЗапускНалаштування сервера не потрібнеПотрібні домен, Docker і HTTPS
ОновленняОбробляє n8nОбробляє власник
База даних і файлиВ інфраструктурі сервісуНа обраному сервері
МасштабуванняВідповідно до хмарного плануНалаштовується самостійно
ВідповідальністьМенше адмініструванняРезервні копії, безпека й моніторинг — відповідальність власника
Найкраще дляШвидкого старту без DevOpsКонтролю, налаштування й постійних процесів

Community Edition можна безкоштовно розмістити на власному сервері для особистих і внутрішніх бізнес-процесів. Однак n8n поширюється не за традиційною open-source ліцензією, а за fair-code Sustainable Use License. Вона дозволяє внутрішнє використання та модифікацію, але не дає просто розгорнути n8n, додати власний логотип і продавати доступ як окремий SaaS. Для такого продукту умови ліцензії потрібно перевіряти окремо.

Вимоги n8n до сервера

Навантаження залежить від обсягу даних, паралельності та типу операцій. Файли, довгі списки, Code node і workflow ШІ потребують більше пам'яті, ніж передавання невеликих JSON між API.

СценарійСтартова конфігурація
Тести та особисті текстові workflow1 vCPU, 2 GB RAM, 20 GB NVMe
Невелика production-інсталяція2 vCPU, 4 GB RAM, 25–40 GB NVMe
Паралельні процеси, ШІ або файли4 vCPU, 8 GB RAM або більше
Кілька worker у queue modeРозмір відповідно до обсягу виконань

SQLite підходить для навчання й невеликої інсталяції з одним екземпляром. PostgreSQL зручніший для production: резервні копії простіші, а подальший перехід у queue mode легший.

Як встановити n8n на VPS

У прикладі використано Ubuntu 24.04, PostgreSQL, Caddy та зовнішній task runner. Замініть n8n.example.com і часовий пояс власними значеннями.

1. Налаштуйте DNS і підготуйте сервер

Створіть DNS-запис A, що вказує на IPv4-адресу VPS, а потім підключіться через SSH:

ssh root@SERVER_IP
apt update && apt upgrade -y
apt install -y ca-certificates curl ufw openssl

Встановіть Docker Engine і плагін Compose з офіційного репозиторію:

install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

cat > /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

apt update
apt install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin
docker compose version

Дозвольте лише SSH, HTTP і HTTPS:

ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

Не закривайте поточну SSH-сесію, доки не підтвердите, що нове підключення працює.

2. Створіть змінні середовища

Підготуйте каталог:

mkdir -p /opt/n8n
cd /opt/n8n

Створіть .env. Наведені нижче команди одразу генерують окремі випадкові секрети для PostgreSQL, шифрування n8n і task runner:

cat > .env <<EOF
N8N_VERSION=stable
N8N_HOST=n8n.example.com
GENERIC_TIMEZONE=Europe/Berlin

POSTGRES_DB=n8n
POSTGRES_USER=n8n
POSTGRES_PASSWORD=$(openssl rand -hex 32)

N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)
RUNNERS_AUTH_TOKEN=$(openssl rand -hex 32)
EOF

chmod 600 .env

Тег stable зручний для першого запуску. Після перевірки інсталяції краще зафіксувати конкретну версію n8n, щоб наступне оновлення image не відбулося несподівано.

Не можна втратити N8N_ENCRYPTION_KEY. n8n використовує цей ключ для шифрування збережених паролів, токенів та інших облікових даних. Якщо відновити лише PostgreSQL без ключа, записи залишаться в базі, але n8n не зможе їх прочитати.

3. Створіть файл Docker Compose

Створіть compose.yaml:

services:
  postgres:
    image: postgres:18-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      PGDATA: /var/lib/postgresql/data
    volumes:
      - postgres_data:/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: unless-stopped
    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_HOST}
      N8N_PORT: "5678"
      N8N_PROTOCOL: https
      N8N_EDITOR_BASE_URL: https://${N8N_HOST}
      N8N_WEBHOOK_URL: https://${N8N_HOST}/
      N8N_PROXY_HOPS: "1"
      GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
      TZ: ${GENERIC_TIMEZONE}

      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
      N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
      N8N_BLOCK_ENV_ACCESS_IN_NODE: "true"

      N8N_RUNNERS_MODE: external
      N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
      N8N_RUNNERS_BROKER_LISTEN_ADDRESS: 0.0.0.0

      EXECUTIONS_DATA_PRUNE: "true"
      EXECUTIONS_DATA_MAX_AGE: "168"
      EXECUTIONS_DATA_PRUNE_MAX_COUNT: "10000"
    volumes:
      - n8n_data:/home/node/.n8n
    expose:
      - "5678"
    depends_on:
      postgres:
        condition: service_healthy

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

  caddy:
    image: caddy:2-alpine
    restart: unless-stopped
    environment:
      N8N_HOST: ${N8N_HOST}
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config
    depends_on:
      - n8n

volumes:
  postgres_data:
    name: n8n_postgres_data
  n8n_data:
    name: n8n_data
  caddy_data:
    name: n8n_caddy_data
  caddy_config:
    name: n8n_caddy_config

Зовнішній task runner виконує код окремо від основного процесу n8n. Це безпечніше за внутрішній режим і зменшує ймовірність, що помилка в Code node вплине на редактор і обробку webhook.

4. Увімкніть HTTPS

Створіть Caddyfile:

{$N8N_HOST} {
    reverse_proxy n8n:5678
}

Caddy автоматично отримає TLS-сертифікат, якщо DNS уже вказує на VPS, а порти 80 і 443 доступні. Внутрішній порт 5678 не відкривається в інтернет: зовні доступні лише 80 і 443, тоді як Caddy звертається до n8n через Docker-мережу.

Змінні N8N_WEBHOOK_URL і N8N_PROXY_HOPS потрібні, щоб редактор генерував правильні публічні адреси webhook і довіряв заголовкам від одного reverse proxy.

5. Запустіть n8n

Перевірте фінальну конфігурацію та запустіть контейнери:

docker compose config
docker compose up -d
docker compose ps
docker compose logs --tail=100 n8n caddy

Відкрийте:

https://n8n.example.com

Створіть обліковий запис власника. Не передавайте його пароль колегам: для командної роботи використовуйте окремі облікові записи й надавайте кожному лише потрібні права.

Ваш перший корисний workflow

Хороший тест — обробка заявки з вебсайту:

  1. Додайте node Webhook з методом POST.
  2. За допомогою Edit Fields залиште лише ім'я, email і джерело.
  3. Використайте node If, щоб відхилити заявку без обов'язкових даних.
  4. Створіть угоду в CRM або надішліть запит через HTTP Request.
  5. Додайте сповіщення Telegram.
  6. Завершіть ланцюжок node Respond to Webhook.
  7. Після тестування активуйте workflow і замініть тестовий webhook production-URL.

Цей приклад одразу перевіряє домен, HTTPS, вхідні запити, облікові дані та зовнішню інтеграцію. Далі додайте окремий Error Workflow, який сповіщатиме вас про збій основного ланцюжка.

Захист n8n після встановлення

Встановлений екземпляр n8n не стає автоматично надійним. Після запуску переконайтеся, що:

  • редактор доступний лише через HTTPS;
  • .env має права 600 і не додається до Git;
  • зовнішні API-ключі мають мінімально необхідні права;
  • кожен webhook перевіряє підпис або secret джерела;
  • історія виконань видаляється автоматично;
  • помилки критичних workflow надсилаються адміністратору.

Community node встановлюються як пакети й можуть отримати доступ до даних workflow та сервера. Не додавайте невідомі node без перевірки. Якщо вони не потрібні, вимкніть їх за допомогою N8N_COMMUNITY_PACKAGES_ENABLED=false.

Запустіть вбудований аудит:

docker compose exec n8n n8n audit

Він допомагає виявити незахищені webhook, ризиковані node та проблеми з обліковими даними, але не замінює ручну перевірку.

Історія виконань і персональні дані

n8n зберігає вхідні та вихідні дані для налагодження. Разом із ними в базі можуть залишатися email-повідомлення, номери телефонів, документи й відповіді API.

У наведеній конфігурації виконання видаляються через сім днів, а їхня кількість обмежена 10 000. Для чутливих процесів оберіть термін зберігання відповідно до політики утримання даних і видаляйте непотрібні поля до завершення workflow.

Резервні копії та оновлення

Для відновлення потрібні дамп PostgreSQL, volume n8n_data, файли конфігурації та .env із N8N_ENCRYPTION_KEY. Перед копіюванням зупиніть обробники, залишивши PostgreSQL запущеним. Це створює коротке переривання виконання workflow:

cd /opt/n8n
mkdir -p backup
docker compose stop n8n n8n-runner

docker compose exec -T postgres sh -c \
  'pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB"' \
  | gzip > "backup/n8n-db-$(date +%F).sql.gz"

docker run --rm \
  -v n8n_data:/source:ro \
  -v "$PWD/backup":/backup \
  alpine sh -c \
  'tar -czf /backup/n8n-data-$(date +%F).tar.gz -C /source .'

tar -czf "backup/n8n-config-$(date +%F).tar.gz" \
  .env compose.yaml Caddyfile

docker compose start n8n n8n-runner

Архів із .env містить секрети: зашифруйте його та зберігайте за межами VPS. Періодично перевіряйте резервну копію пробним відновленням.

Перед оновленням зробіть резервну копію та перегляньте примітки до релізу:

cd /opt/n8n
docker compose pull
docker compose up -d
docker compose ps

Task runner і основний контейнер мають використовувати один тег версії.

Коли потрібне масштабування?

Не починайте з Redis і кількох worker, доки немає реального навантаження. Один екземпляр із PostgreSQL простіше підтримувати, і зазвичай його достатньо для невеликих внутрішніх процесів.

Queue mode потрібен, коли довгі завдання затримують webhook, багато workflow запускаються одночасно або обробка файлів регулярно використовує всю доступну пам'ять. У такій схемі основний екземпляр отримує події, Redis розподіляє завдання, а worker виконують їх паралельно. Усі компоненти мають підключатися до тієї самої бази PostgreSQL і використовувати той самий N8N_ENCRYPTION_KEY.

Який VPS вибрати для n8n?

Для n8n, PostgreSQL, Caddy і task runner разом розумно почати з 2 vCPU, 4 GB RAM і NVMe-диска. На tropic.host цьому відповідає план Light: 2 vCPU, 4 GB RAM і 25 GB NVMe. Цього достатньо для перших production-workflow без інтенсивної обробки файлів.

Для документів, великих наборів даних і багатьох паралельних workflow ШІ краще вибрати 8 GB RAM. Важлива також стабільна мережа: webhook, OAuth callback і заплановані завдання мають бути постійно доступними.

Висновок

n8n перетворює повторювані операції на зрозумілі візуальні потоки: готові node пришвидшують запуск, HTTP Request підключає майже будь-який API, а Code node дає змогу додати власну логіку.

Self-hosted версія дає контроль над сервером і базою даних, але потребує HTTPS, обмежених ключів, очищення історії та перевірених резервних копій. Зберігайте N8N_ENCRYPTION_KEY разом із PostgreSQL: без нього відновлені облікові дані не можна розшифрувати.

Поширені запитання

Чи можна використовувати n8n безкоштовно?

Так. Community Edition можна безкоштовно розмістити на власному сервері для особистих і внутрішніх процесів. Перепродаж розміщеного n8n як окремого SaaS обмежений fair-code ліцензією.

Чи можна встановити n8n без домену?

Для локального тестування — так. Для публічних webhook і OAuth краще використовувати домен і HTTPS.

Скільки RAM потрібно n8n?

Прості особисті workflow часто працюють із 2 GB RAM. Для n8n із PostgreSQL, Caddy і task runner розумніше мати 4 GB; файли та паралельні виконання можуть потребувати 8 GB або більше.

Чи всі дані залишаються всередині VPS?

Лише ті, які workflow не надсилає в інші місця. База даних та історія виконань зберігаються на VPS, але node Telegram, CRM або зовнішньої моделі ШІ надсилають вибрані дані відповідному сервісу.

Що має входити до резервної копії n8n?

Дамп PostgreSQL, volume n8n_data, compose.yaml, Caddyfile і .env із N8N_ENCRYPTION_KEY. Зберігайте резервну копію за межами VPS у зашифрованому вигляді та перевіряйте її відновленням.