Как установить n8n через Docker Compose на VPS: PostgreSQL, HTTPS и безопасное обновление

n8n можно запустить за несколько минут, если задача — просто посмотреть интерфейс. Но рабочая self-hosted установка на сервере — это уже не одна команда docker run. Нужно сохранить данные между перезапусками, подключить нормальную базу, закрыть прямой доступ к сервису, настроить домен и HTTPS, проверить webhooks и заранее понимать, как обновляться без потери workflows и credentials.

Ниже — схема, которая используется на практике: VPS с Ubuntu, Docker Compose, PostgreSQL и reverse proxy с HTTPS. Она подходит для небольшого и среднего рабочего экземпляра n8n, где важнее предсказуемость и простое обслуживание, чем кластеризация и высокая доступность.

Важно: перед публикацией статьи значения версий n8n, Docker и PostgreSQL нужно сверить с актуальной официальной документацией. В примерах ниже лучше фиксировать конкретную версию n8n, а не использовать latest вслепую.

Что будем устанавливать

  • VPS на Ubuntu 24.04 LTS или другой поддерживаемой версии Ubuntu.
  • Docker Engine и Docker Compose plugin.
  • PostgreSQL как отдельный контейнер для данных n8n.
  • n8n в отдельном контейнере.
  • Reverse proxy — Caddy или Nginx — для HTTPS и публичного домена.
  • Persistent volumes, чтобы база и служебные данные переживали пересоздание контейнеров.

Docker официально рекомендует устанавливать Engine и Compose plugin из своего репозитория. Для Linux актуальный синтаксис — docker compose, а старый отдельный docker-compose считается legacy-вариантом.

↑ К оглавлению

1. Подготовьте VPS

Для учебного запуска n8n может работать и на локальной машине, но для постоянных webhooks и интеграций удобнее VPS: у него есть постоянный публичный адрес, сервис доступен круглосуточно и не зависит от домашнего компьютера.

sudo apt update
sudo apt upgrade -y

Перед установкой проверьте, что на сервере есть свободные порты 80 и 443 для reverse proxy. Сам порт n8n 5678 лучше не выставлять наружу без необходимости: контейнер можно оставить доступным только внутри Docker-сети.

↑ К оглавлению

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

На Ubuntu используйте официальный Docker APT-репозиторий. После добавления репозитория устанавливаются Docker Engine, CLI, containerd, Buildx и Compose plugin. После установки обязательно проверьте версии и запустите hello-world.

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

Если команда docker compose работает, отдельный пакет docker-compose устанавливать не нужно.

↑ К оглавлению

3. Создайте каталог проекта и файл .env

sudo mkdir -p /opt/n8n
cd /opt/n8n
sudo touch .env compose.yml

Секреты не стоит писать прямо в compose.yml. Пароли базы, ключ шифрования n8n и доменное имя удобнее хранить в .env с правами, доступными только администратору сервера.

N8N_VERSION=\<актуальная_стабильная_версия\>
N8N_HOST=n8n.example.ru
N8N_PROTOCOL=https
N8N_PORT=5678
N8N_EDITOR_BASE_URL=https://n8n.example.ru

POSTGRES_DB=n8n
POSTGRES_USER=n8n
POSTGRES_PASSWORD=\<сложный_пароль\>

N8N_ENCRYPTION_KEY=\<длинный_случайный_ключ\>
GENERIC_TIMEZONE=Europe/Moscow
TZ=Europe/Moscow

Не теряйте N8N_ENCRYPTION_KEY. Credentials в n8n шифруются. Если при восстановлении экземпляра база останется, а ключ будет потерян или заменён, часть сохранённых секретов может стать нечитаемой. Ключ должен входить в резервную копию конфигурации, но не публиковаться в репозитории.

↑ К оглавлению

4. Docker Compose: n8n + PostgreSQL

Минимальная рабочая схема состоит из двух сервисов. PostgreSQL хранит данные, n8n подключается к нему по внутреннему имени контейнера. Для обоих сервисов нужны постоянные volumes.

services:
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: \${POSTGRES_DB}
POSTGRES_USER: \${POSTGRES_USER}
POSTGRES_PASSWORD: \${POSTGRES_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: \["CMD-SHELL", "pg_isready -U \${POSTGRES_USER} -d \${POSTGRES_DB}"\]
interval: 10s
timeout: 5s
retries: 10

n8n:
image: docker.n8n.io/n8nio/n8n:\${N8N_VERSION}
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_HOST: \${N8N_HOST}
N8N_PORT: \${N8N_PORT}
N8N_PROTOCOL: \${N8N_PROTOCOL}
N8N_EDITOR_BASE_URL: \${N8N_EDITOR_BASE_URL}
N8N_ENCRYPTION_KEY: \${N8N_ENCRYPTION_KEY}
GENERIC_TIMEZONE: \${GENERIC_TIMEZONE}
TZ: \${TZ}

volumes:
- n8n_data:/home/node/.n8n

volumes:
postgres_data:
n8n_data:

Даже если основная рабочая информация хранится в PostgreSQL, volume n8n_data всё равно полезен: в каталоге /home/node/.n8n находятся локальные служебные данные экземпляра. Удалять volumes командами вроде docker compose down -v без осознанной причины нельзя.

↑ К оглавлению

5. Первый запуск

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

Сначала полезно выполнить docker compose config: так можно заметить ошибку YAML или незаполненную переменную до запуска. После старта оба контейнера должны перейти в рабочее состояние, а PostgreSQL — пройти healthcheck.

docker compose logs --tail=100 postgres
docker compose logs --tail=100 n8n
↑ К оглавлению

6. Домен и HTTPS

Для production-доступа n8n лучше открывать по HTTPS через reverse proxy. DNS-запись домена должна указывать на IP VPS, а reverse proxy принимать запросы на 80/443 и передавать их контейнеру n8n внутри Docker-сети.

Если нужен самый простой вариант с автоматическим сертификатом, можно использовать Caddy. Nginx тоже подходит, но выпуск и обновление сертификата обычно настраиваются отдельно через ACME-клиент.

n8n.example.ru {
encode zstd gzip
reverse_proxy n8n:5678
}

Подводный камень: если n8n находится за reverse proxy, публичный адрес экземпляра должен быть согласован с настройками n8n. Иначе OAuth callback и webhooks могут получать неправильный URL или ссылаться на внутренний адрес.

↑ К оглавлению

7. Webhooks: проверьте их до первой реальной автоматизации

Одна из самых неприятных ситуаций: интерфейс n8n открывается по HTTPS, workflows запускаются вручную, а Telegram, CRM или интернет-магазин не могут вызвать webhook. Причина часто не в самой интеграции, а в публичном URL, proxy-заголовках или маршрутизации.

После запуска проверьте:

  • какой Production URL показывает Webhook node;
  • открывается ли этот URL из интернета;
  • приходит ли тестовый запрос в workflow;
  • не указывает ли callback на localhost, 127.0.0.1, внутреннее имя контейнера или http вместо https;
  • не блокирует ли webhook firewall или reverse proxy.
↑ К оглавлению

8. Создайте владельца и закройте первичную настройку

После первого открытия n8n создайте owner-аккаунт. Не оставляйте экземпляр в состоянии первичной настройки надолго. После этого проверьте, что посторонний пользователь не может заново пройти owner setup.

↑ К оглавлению

9. Что проверить после установки

Минимальная проверка занимает несколько минут:

  1. Открыть n8n по HTTPS и войти под владельцем.
  1. Создать тестовый workflow Manual Trigger → Set/Edit Fields и выполнить его.
  1. Проверить простой webhook.
  1. Перезапустить контейнеры и убедиться, что workflow и credentials остались на месте.
  1. Проверить docker compose ps и последние логи.
  1. Сделать резервную копию .env/compose-конфигурации и дамп PostgreSQL.
↑ К оглавлению

10. Резервные копии: что сохранять

Резервная копия одного compose.yml недостаточна. Для восстановления рабочего экземпляра нужны как минимум:

  • дамп PostgreSQL;
  • N8N_ENCRYPTION_KEY;
  • compose.yml и .env;
  • конфигурация reverse proxy;
  • при необходимости — содержимое volume n8n_data.

Секреты храните отдельно от публичного репозитория. Перед крупным обновлением делайте свежий дамп базы и копию конфигурации.

↑ К оглавлению

11. Как безопасно обновлять n8n

Самый спокойный способ — не обновлять production-экземпляр вслепую на latest, а сначала прочитать release notes, сделать backup и перейти на выбранную версию.

cd /opt/n8n
\# Сначала backup базы и конфигурации

\# Затем меняем N8N_VERSION в .env
docker compose pull n8n
docker compose up -d n8n
docker compose ps
docker compose logs --tail=100 n8n

Если обновление меняет формат данных или требует миграции, особенно важно иметь рабочий rollback-план. После запуска достаточно одной целевой проверки: интерфейс открывается, тестовый workflow выполняется, webhook отвечает.

↑ К оглавлению

12. Типовые проблемы при установке n8n

После пересоздания контейнера пропали данные — Чаще всего проблема связана с отсутствующим или удалённым persistent volume. Проверьте volumes в compose.yml и не используйте down -v как обычную команду перезапуска.

n8n открылся, но webhook не работает — Проверьте публичный URL, HTTPS, DNS, reverse proxy и адрес, который n8n формирует для production webhook.

OAuth возвращает ошибку callback — Проверьте домен, протокол, публичный base URL и callback URI в приложении провайдера. Даже одна разница в схеме http/https или пути ломает OAuth.

n8n не подключается к PostgreSQL — Проверьте имя хоста postgres, имя базы, пользователя и пароль. Внутри Docker Compose не нужно указывать 127.0.0.1 для соседнего контейнера.

После восстановления credentials не читаются — Проверьте, что восстановлен тот же N8N_ENCRYPTION_KEY.

Порт 5678 открыт всему интернету — Закройте прямую публикацию порта и оставьте наружу только HTTPS через reverse proxy, если прямой доступ не нужен.

После обновления что-то изменилось — Не обновляйтесь без backup. Фиксируйте версию образа, читайте release notes и проверяйте только критический путь после обновления.

↑ К оглавлению

13. Локальный сервер или VPS?

Локальная установка удобна для обучения и разработки. Но для постоянных интеграций ей нужны стабильный внешний доступ, постоянно включённый компьютер и корректная публикация webhooks. VPS проще, когда n8n должен работать 24/7 и принимать события из внешних сервисов.

↑ К оглавлению

14. Реальный пример: еженедельный SEO-отчёт WebFixer24

Мы используем self-hosted n8n не только как тестовый стенд. На WebFixer24 работает еженедельная автоматизация SEO-отчётности.

Схема выглядит так:

  • Google Search Console — показы, клики, CTR, позиции, страницы и запросы;
  • Google Analytics 4 — органические сессии и события;
  • Яндекс Вебмастер — поисковые показатели и данные по индексации;
  • Яндекс Метрика — органические визиты и посадочные страницы;
  • PostgreSQL — хранение истории;
  • n8n — сбор, объединение, расчёт и формирование отчёта;
  • Telegram — автоматическая доставка готового отчёта по расписанию.

Медиаматериалы для публикации: ниже добавлены реальный workflow и фрагменты Telegram-отчёта. Видео seo_webfixer24.mp4 (около 34 секунд) разместить между workflow и скриншотами отчёта на странице кейса и/или в этом разделе статьи.

Демонстрационный workflow WebFixer24 в n8n: 27 узлов, четыре источника данных, анализ и отправка отчёта в Telegram.
Демонстрационный workflow WebFixer24 в n8n: 27 узлов, четыре источника данных, анализ и отправка отчёта в Telegram.

Реальный демонстрационный workflow WebFixer24 в n8n: 27 узлов, четыре источника данных, анализ и отправка отчёта в Telegram.

Видео для встраивания: seo_webfixer24.mp4 — запись ручного запуска workflow и прохождения узлов до готового отчёта в Telegram.

Фрагмент 1 реального SEO-отчёта WebFixer24 в Telegram.
Фрагмент 1 реального SEO-отчёта WebFixer24 в Telegram.

Фрагмент 1 реального SEO-отчёта WebFixer24 в Telegram.

Фрагмент 2 реального SEO-отчёта WebFixer24 в Telegram.
Фрагмент 2 реального SEO-отчёта WebFixer24 в Telegram.

Фрагмент 2 реального SEO-отчёта WebFixer24 в Telegram.

Фрагмент 3 реального SEO-отчёта WebFixer24 в Telegram.
Фрагмент 3 реального SEO-отчёта WebFixer24 в Telegram.

Фрагмент 3 реального SEO-отчёта WebFixer24 в Telegram.

Этот пример полезен тем, что показывает разницу между «n8n установлен» и «n8n решает реальную задачу». Сама установка — только фундамент. Ценность появляется, когда на нём работает конкретный бизнес-процесс.

↑ К оглавлению

15. Когда установка на VPS оправдана

Self-hosted n8n имеет смысл, если:

  • нужна постоянная работа 24/7;
  • есть внешние webhooks и API-интеграции;
  • важен контроль над данными и инфраструктурой;
  • нужны собственные базы данных, reverse proxy или нестандартная сеть;
  • вы готовы самостоятельно обновлять и резервировать экземпляр.

Если задача — только попробовать n8n, проще начать с локального Docker или облачного варианта. Если автоматизация уже участвует в работе бизнеса, лучше сразу относиться к ней как к production-сервису: backup, HTTPS, фиксированные версии и понятный процесс обновления.

другие практические инструкции WebFixer24

Посмотреть реальный кейс автоматической SEO-отчётности на n8n

↑ К оглавлению

Нужна установка n8n без ручной настройки?

Если не хотите разбираться с Docker Compose, PostgreSQL, доменом, HTTPS и webhooks самостоятельно, можно заказать установку и базовую настройку n8n под ваш сервер и будущие интеграции.

Установлю и настрою n8n на VPS с Docker, PostgreSQL, HTTPS и доменом.

↑ К оглавлению