Ця інструкція показує, як розгорнути n8n з PostgreSQL за реверс‑проксі Traefik з автоматичними сертифікатами Let’s Encrypt. Усі файли та налаштування зберігатимуться в одній директорії, а запуск відбувається однією командою.

Docker уже був попередньо встановлений на нашому VPS Unihost моделі UNH, тому етап його встановлення в цьому посібнику пропущено. Під час оформлення замовлення ви також можете обрати образ операційної системи з уже встановленим Docker — просто вкажіть потрібну ОС у конфігураторі.

Попередні умови

 

DNS: створіть A‑запис виду

n8n.<ваш_домен><публічна IP-адреса сервера>

Порти: на сервері мають бути відкриті порти 80/tcp та 443/tcp

Створюємо директорію та файл .env

mkdir -p ~/n8n-stack && cd ~/n8n-stack
nano .env

Вставте вміст і обов’язково замініть DOMAIN, ACME_EMAIL, а також паролі на власні надійні значення:

# === Домен и Let's Encrypt ===
DOMAIN=yourdomain # вказати свій домен
ACME_EMAIL=admin@yourdomain   # реальний email для Let's Encrypt

# === Доступ к UI n8n ===
N8N_BASIC_AUTH_ACTIVE=true
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=ChangeMe_Soon

# === URL/протоколи n8n ===
N8N_HOST=${DOMAIN}
N8N_PORT=5678
N8N_PROTOCOL=https
WEBHOOK_URL=https://${DOMAIN}
N8N_SECURE_COOKIE=true
N8N_RUNNERS_ENABLED=true

# === Бази даних ===
POSTGRES_USER=n8n
POSTGRES_PASSWORD=n8npass
POSTGRES_DB=n8n

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}

Примітки:

  • ACME_EMAIL — це ваша реальна електронна пошта, яка використовується для реєстрації облікового запису в Let’s Encrypt та отримання сповіщень.
  • Змінні N8N_BASIC_AUTH_* вмикають базову авторизацію у веб-інтерфейсі n8n.
  • WEBHOOK_URL має вказувати на ваш публічний HTTPS-домен без символу / наприкінці.

Створюємо файл docker-compose.yml

nano docker-compose.yml

Вставте наступне:

networks:
 proxy:
   name: proxy
  internal:

volumes:
 traefik_letsencrypt:
 n8n_data:
  pg_data:

services:
 traefik:
   image: traefik:v3.0
   container_name: traefik
   restart: unless-stopped
   command:
     - --api.dashboard=true
     - --entrypoints.web.address=:80
     - --entrypoints.websecure.address=:443
     - --entrypoints.web.http.redirections.entryPoint.to=websecure
     - --entrypoints.web.http.redirections.entryPoint.scheme=https
     - --providers.docker=true
     - --providers.docker.exposedbydefault=false
     - --certificatesresolvers.lehttp.acme.httpchallenge=true
     - --certificatesresolvers.lehttp.acme.httpchallenge.entrypoint=web
     - --certificatesresolvers.lehttp.acme.email=${ACME_EMAIL}
     - --certificatesresolvers.lehttp.acme.storage=/letsencrypt/acme.json
   ports:
     - "80:80"
     - "443:443"
   volumes:
     - traefik_letsencrypt:/letsencrypt
     - /var/run/docker.sock:/var/run/docker.sock:ro
   networks:
      - proxy

 postgres:
   image: postgres:16
   container_name: n8n-postgres
   restart: unless-stopped
   env_file: .env
   environment:
     POSTGRES_USER: ${POSTGRES_USER}
     POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
     POSTGRES_DB: ${POSTGRES_DB}
   volumes:
     - pg_data:/var/lib/postgresql/data
   networks:
      - internal

 n8n:
   image: n8nio/n8n:latest
   container_name: n8n
   restart: unless-stopped
   env_file: .env
   depends_on:
     - postgres
   volumes:
     - n8n_data:/home/node/.n8n
   networks:
     - internal
     - proxy
   labels:
     - traefik.enable=true
     - traefik.docker.network=proxy
     - traefik.http.routers.n8n.rule=Host(`${DOMAIN}`)
     - traefik.http.routers.n8n.entrypoints=websecure
     - traefik.http.routers.n8n.tls=true
     - traefik.http.routers.n8n.tls.certresolver=lehttp
      - traefik.http.services.n8n.loadbalancer.server.port=5678

Чому саме так:

  • Задано фіксовану назву мережі proxy, щоб Traefik і n8n гарантовано бачили одне одного.
  • env_file: .env у сервісів postgres і n8n — усі змінні з файлу .env автоматично підтягуються всередину контейнерів.
  • Порт 5678 у n8n не відкривається назовні — доступ до інтерфейсу можливий лише через Traefik по HTTPS.
  • Мітка traefik.docker.network=proxy явно вказує Traefik, через яку мережу потрібно підключатись до n8n, якщо контейнер підключений до кількох мереж.

Крок 3. Запуск

docker compose up -d

Зачекайте 10–60 секунд: n8n виконає міграцію бази даних, а Traefik під час першого звернення до домену запросить сертифікат Let’s Encrypt. Через кілька хвилин сертифікат буде активний.
Якщо сертифікат не активний через кілька хвилин, можливо, ваш браузер закешував сторінку. Спробуйте відкрити n8n у режимі Інкогніто.

Короткий підсумок
Після виконання цих кроків ви отримаєте повністю робочий екземпляр n8n з базою даних PostgreSQL і автоматичним HTTPS через Traefik.

Це рішення зручне тим, що:

  • усе керується однією командою: docker compose up -d;
  • сертифікати Let’s Encrypt оновлюються автоматично;
  • база даних ізольована та доступна лише контейнеру n8n;
  • легко додавати нові сервіси за Traefik на інших піддоменах.