EUR
european

EUR

usa

USD

Ex. VAT Ex. VAT 0%

Встановлення n8n з Docker і PostgreSQL

n8n це платформа для автоматизації робочих процесів, яку можна запустити на власному сервері. У self-hosted встановленні workflows, облікові дані та історія виконань залишаються під вашим контролем, а кількість workflows і запусків обмежена лише ресурсами сервера.

У цій інструкції ми розгорнемо n8n на виділеному сервері з PostgreSQL, HTTPS і резервним копіюванням. Використовуються три контейнери під керуванням Docker Compose:

  • n8n, сама платформа автоматизації;
  • PostgreSQL, база даних для workflows, облікових даних та історії виконань;
  • Caddy, зворотний проксі, який сам отримує та подовжує HTTPS-сертифікат.

За замовчуванням n8n зберігає дані в SQLite. У цій інструкції замість неї використовується PostgreSQL: її можна бекапити без зупинки n8n, і саме її n8n рекомендує для self-hosted встановлень.

Кроки перевірено на Ubuntu 24.04 LTS з n8n 2.46.7, PostgreSQL 17, Docker 29 і Docker Compose v5.

Що знадобиться

Вам знадобиться:

  • сервер з Ubuntu 24.04 LTS і root-доступом по SSH;
  • домен або піддомен для n8n, наприклад n8n.example.com;
  • запис A для цього імені, що вказує на IPv4-адресу сервера.

Якщо в домену є ще й запис AAAA, сервер має бути доступний за цією IPv6-адресою. Інакше Let's Encrypt може спершу спробувати IPv6 і не випустити сертифікат.

Перш ніж продовжити, перевірте, що запис вказує на ваш сервер:

dig +short n8n.example.com

Команда має повернути IP-адресу сервера. Від цього залежить випуск сертифіката в Caddy, тому дочекайтеся, поки DNS оновиться.

Усі команди нижче виконуються від root. Якщо ви працюєте під звичайним користувачем із правами sudo, додавайте sudo перед кожною командою.

Встановлення Docker

Встановіть Docker Engine і плагін Compose з офіційного репозиторію Docker. Пакет docker.io з репозиторію Ubuntu старіший і не містить Compose v2.

apt update && apt install -y ca-certificates curl 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

Додайте репозиторій:

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" > /etc/apt/sources.list.d/docker.list

Встановіть пакети:

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

Перевірте, що обидві утиліти доступні:

docker --version docker compose version

Каталог проєкту та секрети

Усі файли n8n лежатимуть у /opt/n8n:

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

Створіть файл .env з доменом, часовим поясом і згенерованими секретами. Замініть n8n.example.com і часовий пояс на свої значення:

cat > .env <<EOF DOMAIN=n8n.example.com GENERIC_TIMEZONE=Europe/Amsterdam POSTGRES_USER=n8n POSTGRES_DB=n8n POSTGRES_PASSWORD=$(openssl rand -hex 24) N8N_ENCRYPTION_KEY=$(openssl rand -hex 32) EOF chmod 600 .env

GENERIC_TIMEZONE задає часовий пояс для Schedule Trigger та інших нод, що працюють за часом. Без нього n8n використовує America/New_York.

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

Warning

Одразу скопіюйте файл .env у надійне місце поза сервером, наприклад у менеджер паролів. Бекап бази без N8N_ENCRYPTION_KEY відновить workflows, але не облікові дані.

Файл Docker Compose

Створіть /opt/n8n/compose.yaml:

services: postgres: image: postgres:17 restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 10s timeout: 5s retries: 5 n8n: image: docker.n8n.io/n8nio/n8n restart: unless-stopped depends_on: postgres: condition: service_healthy 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_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY} N8N_HOST: ${DOMAIN} N8N_PROTOCOL: https N8N_PROXY_HOPS: 1 N8N_WEBHOOK_URL: https://${DOMAIN}/ GENERIC_TIMEZONE: ${GENERIC_TIMEZONE} TZ: ${GENERIC_TIMEZONE} ports: - "127.0.0.1:5678:5678" volumes: - n8n_data:/home/node/.n8n caddy: image: caddy:2 restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config volumes: postgres_data: n8n_data: caddy_data: caddy_config:

Кілька деталей цього файлу важливі для безпеки та стабільної роботи.

У PostgreSQL немає розділу ports. База доступна лише іншим контейнерам проєкту і ніколи не видна з інтернету.

Порт n8n опубліковано як 127.0.0.1:5678. Користувачі потрапляють у n8n лише через Caddy по HTTPS, а ви при цьому можете перевірити n8n локально на сервері.

Warning

Не скорочуйте рядок з портом n8n до 5678:5678. Для опублікованих портів Docker додає власні правила файрвола, і вони обходять UFW. Без префікса 127.0.0.1 n8n стане доступним по звичайному HTTP звідусіль, навіть якщо UFW блокує порт 5678.

Умова depends_on з healthcheck змушує n8n чекати, поки PostgreSQL буде готовий приймати підключення. Без неї після перезавантаження сервера n8n може стартувати раніше за базу і не підключитися до неї.

N8N_PROXY_HOPS повідомляє n8n, що він працює за одним зворотним проксі, тому реальна адреса клієнта береться із заголовків проксі. N8N_WEBHOOK_URL задає публічну адресу, яку n8n показує в URL вебхуків. У версіях n8n до 2.30 ця змінна називається WEBHOOK_URL.

Налаштування HTTPS через Caddy

Створіть /opt/n8n/Caddyfile зі своїм доменом:

n8n.example.com { reverse_proxy n8n:5678 }

Це вся конфігурація. Під час першого запуску Caddy запросить сертифікат Let's Encrypt для домену, налаштує перенаправлення з HTTP на HTTPS і подовжуватиме сертифікат до закінчення терміну. Для цього порти 80 і 443 мають бути відкриті.

Налаштування файрвола

Спершу дозвольте SSH, потім HTTP і HTTPS, і увімкніть UFW:

ufw allow OpenSSH ufw allow 80/tcp ufw allow 443/tcp ufw --force enable ufw status

Info

Якщо UFW уже був увімкнений з вашими правилами, перед змінами виконайте ufw status і збережіть потрібні правила. Дозвіл OpenSSH до увімкнення UFW не дасть обірвати поточну SSH-сесію.

Запуск n8n

Запустіть контейнери у фоні:

cd /opt/n8n docker compose up -d

Перший запуск завантажує образи і триває хвилину-дві. Перевірте, що всі три контейнери працюють, а PostgreSQL у стані healthy:

docker compose ps

Перегляньте лог n8n:

docker compose logs n8n --tail 50

Лог має закінчуватися рядком на кшталт:

Editor is now accessible via: https://n8n.example.com

Перевірте, що n8n відповідає локально і через Caddy:

curl -s http://127.0.0.1:5678/healthz curl -s https://n8n.example.com/healthz

Обидві команди мають повернути {"status":"ok"}.

Якщо друга команда не проходить, перегляньте лог Caddy командою docker compose logs caddy. Найчастіше причина в тому, що запис DNS ще не вказує на цей сервер або закриті порти 80 і 443.

Створення акаунта власника

Відкрийте https://n8n.example.com у браузері. Під час першого входу n8n запропонує створити акаунт власника. Він має повні права на екземпляр n8n і керує всіма іншими користувачами.

Вкажіть email, ім'я, прізвище та пароль, потім натисніть Next. Пароль має бути не коротшим за 8 символів і містити щонайменше одну цифру та одну велику літеру. Оберіть надійний пароль: редактор n8n відкритий в інтернет, і той, хто в нього потрапить, зможе виконувати команди на сервері через ваші workflows.

Після першого входу n8n покаже коротке опитування: Customize n8n to you. Відповідати на запитання не обов'язково. Натисніть Get started, щоб закрити його, з відповідями чи без.

Далі n8n запропонує безкоштовний ліцензійний ключ на кілька функцій Community Edition: розширене налагодження, пошук і теги для виконань, папки для workflows. Ключ надходить на вказаний email. Натисніть Send me a free license key, щоб отримати його, або Skip, якщо ці функції не потрібні.

Відкриється головна сторінка. Встановлення завершено, можна створювати перший workflow.

Резервне копіювання n8n

Бекап n8n складається з двох частин: дампу PostgreSQL з workflows, обліковими даними, користувачами та історією виконань, і файлу .env з N8N_ENCRYPTION_KEY. Одна частина без іншої марна.

У цій конфігурації n8n зберігає весь свій стан у PostgreSQL. Том n8n_data бекапити не потрібно: повне відновлення працює лише з дампу бази та файлу .env.

Створіть каталог для бекапів і зробіть дамп бази:

mkdir -p /opt/n8n-backup cd /opt/n8n docker compose exec -T postgres pg_dump -U n8n -d n8n -Fc > /opt/n8n-backup/n8n-db.dump cp .env compose.yaml Caddyfile /opt/n8n-backup/

Дамп знімається на працюючому n8n, зупиняти сервіс не потрібно.

Бекап, який залишається на тому ж сервері, не допоможе в разі відмови диска. Регулярно копіюйте /opt/n8n-backup у зовнішнє сховище. Для цього підійде INTROSERV Cloud Storage, як описано в посібнику Підключення хмарного сховища Introserv до сервера.

Відновлення з бекапу

Щоб відновити n8n на новому сервері, встановіть Docker, як описано вище, і скопіюйте каталог бекапу в /opt/n8n-backup на цьому сервері. Потім розкладіть файли конфігурації:

mkdir -p /opt/n8n cp /opt/n8n-backup/.env /opt/n8n-backup/compose.yaml /opt/n8n-backup/Caddyfile /opt/n8n/ chmod 600 /opt/n8n/.env

Якщо в нового сервера інша IP-адреса, спершу оновіть запис A домену.

Запустіть лише базу даних:

cd /opt/n8n docker compose up -d postgres

Дочекайтеся, поки docker compose ps покаже PostgreSQL у стані healthy, і відновіть дамп:

docker compose exec -T postgres pg_restore -U n8n -d n8n --clean --if-exists < /opt/n8n-backup/n8n-db.dump

Запустіть решту контейнерів:

docker compose up -d

Увійдіть під тим самим акаунтом власника і перевірте, що workflows та облікові дані на місці. Збережені облікові дані розшифровуються ключем N8N_ENCRYPTION_KEY з відновленого файлу .env, тому вводити їх заново не потрібно.

Оновлення n8n

Оновлення n8n виходять часто. Щоб оновитися до останньої версії, завантажте нові образи та перестворіть контейнери:

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

Остання команда видаляє старі образи, які більше не використовуються.

Перевірте нову версію:

docker compose exec n8n n8n --version

Tip

Робіть бекап перед кожним оновленням. Під час запуску нова версія n8n може змінити схему бази даних, тому надійний спосіб повернутися на попередню версію це відновити дамп, зроблений до оновлення.

Образ PostgreSQL закріплено на мажорній версії 17, тому docker compose pull встановлює лише мінорні оновлення PostgreSQL. Перехід на нову мажорну версію потребує дампу та відновлення і автоматично не виконується.

Що далі

Екземпляр n8n готовий до роботи. Далі можна:

  1. запросити інших користувачів;
  2. налаштувати SMTP, щоб n8n міг надсилати запрошення та листи для скидання пароля;
  3. підключити свої сервіси та зібрати перші workflows.

Якщо ви плануєте запускати AI-workflows з локальними мовними моделями, дивіться посібник Встановлення n8n AI Starter Kit з Ollama .

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • kingdom
  • germany
  • Español
  • French
  • Hrvatska
  • Italiano
  • Poland
  • Slovenski
  • ukraine
  • Türkçe
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA