Ниже — схема, которая используется на практике: 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 n8n6. Домен и 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. Что проверить после установки
Минимальная проверка занимает несколько минут:
- Открыть n8n по HTTPS и войти под владельцем.
- Создать тестовый workflow Manual Trigger → Set/Edit Fields и выполнить его.
- Проверить простой webhook.
- Перезапустить контейнеры и убедиться, что workflow и credentials остались на месте.
- Проверить docker compose ps и последние логи.
- Сделать резервную копию .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.
Видео для встраивания: seo_webfixer24.mp4 — запись ручного запуска workflow и прохождения узлов до готового отчёта в Telegram.

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

Фрагмент 2 реального 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 и доменом.