Эта инструкция показывает, как развернуть 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 (basic-auth встроенная в 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 на других поддоменах.