Как установить n8n на VPS: Docker Compose, домен, SSL и PostgreSQL

Валерий Волков

Время прочтения 21 минута

n8n на VPS лучше разворачивать не как один случайный контейнер, а как небольшую self-hosted архитектуру: VPS, Docker Compose, n8n, PostgreSQL, reverse proxy, домен, SSL, постоянные volumes, переменные окружения, защита доступа и бэкапы.

Минимальная схема выглядит так: Пользователь → домен → HTTPS → reverse proxy → n8n container → PostgreSQL

Для небольшого self-hosted n8n обычно нужны:

  • VPS с Docker и Docker Compose;
  • Домен или поддомен, например n8n.example.com;
  • reverse proxy: Nginx, Traefik или Caddy;
  • SSL-сертификат для HTTPS;
  • Контейнер n8n;
  • PostgreSQL для рабочих данных;
  • volume для данных n8n;
  • volume для PostgreSQL;
  • Переменные окружения для публичного URL, timezone, базы и безопасности;
  • Ограничение доступа к редактору;
  • Бэкапы базы и volumes;
  • План обновления контейнеров.

Главное правило — не запускать n8n в открытый интернет без HTTPS и защиты редактора. Внутри n8n могут храниться credentials, токены, webhook-адреса, workflows и данные из CRM, таблиц, почты, мессенджеров и других сервисов.

Для личной автоматизации n8n может быть сервером небольших сценариев: уведомлений, Telegram-ботов, Google Sheets, email, webhooks, парсинга и напоминаний. Даже в таком варианте нужны HTTPS, volume и бэкап PostgreSQL.

Для команды важнее стабильность и контроль доступа. Если несколько человек создают workflows, n8n становится рабочим инструментом, а не экспериментом на VPS.

Для небольшого бизнеса n8n нужно воспринимать как часть инфраструктуры. Через него могут проходить заявки, лиды, уведомления, оплаты, CRM-события, документы и внутренние процессы.

Базовая установка через Docker Compose обычно включает два сервиса:

  • n8n — само приложение;
  • postgres — база данных для workflows, credentials и настроек.

Reverse proxy принимает HTTPS-запросы по домену и передаёт их в контейнер n8n. Данный сервис тоже можно вынести в контейнер и добавить в Compose, но это нюансов, которые нужно учесть тут побольше, в зависимости от выбранного прокси, мы остановимся на более простом варианте.

Прокси необходим, потому как без корректного публичного URL могут неправильно работать webhooks, OAuth callback, внешние интеграции и ссылки внутри интерфейса.

После установки нужно проверить:

  • Открывается ли n8n по HTTPS;
  • Работает ли вход в редактор;
  • Сохраняются ли workflows после перезапуска контейнера;
  • Получают ли webhooks внешние запросы;
  • Подключается ли n8n к PostgreSQL;
  • Поднимаются ли контейнеры после reboot;
  • Создаётся ли бэкап базы;
  • Можно ли восстановить данные из бэкапа.

Самые частые ошибки — запускать n8n без HTTPS, хранить данные в ephemeral container, не бэкапить PostgreSQL, открывать редактор всем в интернет, не ограничивать webhooks, забывать про обновления контейнеров и не проверять восстановление после аварии.

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

Архитектура n8n на VPS

Self-hosted n8n на VPS лучше сразу собирать как небольшую рабочую систему, а не как один контейнер “на попробовать”. Даже если автоматизации личные, внутри n8n быстро появляются credentials, webhook-ссылки, токены, данные CRM, таблиц, почты и мессенджеров.

Минимальная архитектура обычно строится вокруг пяти частей: сервер, контейнеры, база данных, HTTPS-доступ и постоянное хранение данных.

Домен → reverse proxy → n8n → PostgreSQL

VPS, Docker Compose и домен

VPS — это основа, на которой будут работать Docker, n8n, PostgreSQL и reverse proxy. Для личной автоматизации обычно достаточно небольшого сервера, но важно оставить запас по памяти и диску: workflows, execution logs, база и Docker images со временем растут.

Docker Compose нужен, чтобы описать всю схему в одном файле: сервис n8n, сервис PostgreSQL, volumes, network и переменные окружения. Это удобнее, чем запускать контейнеры длинными командами вручную.

Домен или поддомен нужен для нормальной работы внешних интеграций. Например: n8n.example.com

Без домена и стабильного HTTPS-адреса могут возникнуть проблемы с webhooks, OAuth callback, внешними сервисами и ссылками, которые n8n формирует внутри интерфейса.

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

После сервера и домена следующий ключевой элемент — база данных. Именно там n8n будет хранить рабочее состояние.

n8n и PostgreSQL

n8n — это приложение, в котором создаются workflows, credentials, webhooks, интеграции и автоматизации. Но сам контейнер n8n не должен быть единственным местом, где живут данные.

Для нормальной self-hosted установки лучше использовать отдельную базу PostgreSQL. Она хранит важные данные n8n: workflows, настройки, executions, credentials metadata и другое состояние приложения.

В Docker Compose это обычно два отдельных сервиса:

  • n8n
  • postgres

Такую схему проще обслуживать: приложение можно обновлять отдельно, а база остаётся в своём volume. Если контейнер n8n удалить и создать заново, данные не должны исчезнуть.

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

Но база сама по себе не делает установку публично доступной. Чтобы n8n корректно открывался по домену, нужен reverse proxy и SSL.

Reverse proxy и SSL

Reverse proxy принимает запросы из интернета и передаёт их в контейнер n8n. Обычно для этого используют Nginx, Caddy, Traefik или другой proxy.

Снаружи пользователь открывает: https://n8n.example.com

А внутри VPS reverse proxy передаёт запрос в контейнер n8n по внутреннему порту.

SSL обязателен. n8n нельзя нормально и безопасно использовать через обычный HTTP, особенно если через него проходят credentials, OAuth, cookies, webhook-запросы и данные внешних сервисов.

HTTPS нужен не только для защиты трафика. Он также важен для интеграций: многие сервисы не принимают небезопасные callback URL и webhook endpoints.

В этой части архитектуры нужно проверить три вещи:

  • Домен указывает на VPS;
  • reverse proxy передаёт запросы в n8n;
  • SSL-сертификат выпущен и HTTPS работает без ошибок.

Когда публичный доступ настроен, важно убедиться, что данные не пропадут после перезапуска или обновления контейнеров.

Volumes, env и бэкапы

Volumes нужны для постоянного хранения данных. Если хранить данные только внутри контейнера, они могут исчезнуть при пересоздании, обновлении или ошибочной очистке Docker.

Минимально нужны два постоянных хранилища:

  • volume для PostgreSQL;
  • volume для данных n8n.

PostgreSQL volume хранит базу. Volume n8n может хранить локальные файлы, настройки и данные, которые n8n сохраняет вне базы.

Переменные окружения задают важные параметры установки: публичный URL, timezone, подключение к PostgreSQL, режим работы, адрес webhooks и настройки безопасности.

Примеры того, что обычно выносят в env:

N8N_HOST=n8n.example.com

N8N_PROTOCOL=https

WEBHOOK_URL=https://n8n.example.com/

GENERIC_TIMEZONE=Europe/Berlin

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

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

Если база не бэкапится, обновление контейнера, ошибка администратора или повреждение volume могут привести к потере workflows и настроек.

После хранения и бэкапов остаётся последний обязательный слой — доступ к редактору n8n.

Auth и безопасность редактора

Редактор n8n нельзя оставлять открытым для всего интернета. Это не обычная публичная страница, а панель управления автоматизациями и интеграциями.

Через n8n могут быть доступны:

  • API-ключи;
  • OAuth-токены;
  • credentials внешних сервисов;
  • webhook endpoints;
  • Сценарии обработки заявок;
  • Интеграции с CRM, почтой, таблицами и мессенджерами.

Поэтому доступ к редактору нужно ограничивать. Для личного использования может быть достаточно встроенной авторизации n8n и дополнительного Basic Auth, доступом через VPN или ограничения по IP на уровне reverse proxy.

Для команды важнее нормальная модель пользователей, роли, правила доступа и понятный процесс выдачи учётных записей. Для бизнеса желательно также продумать, кто может менять workflows, кто видит credentials и кто отвечает за обновления.

Отдельно нужно относиться к webhooks. Они часто должны быть публичными, иначе внешние сервисы не смогут отправлять события в n8n. Но публичный webhook — это не то же самое, что открытый редактор.

Правильная схема такая: редактор защищён, HTTPS включён, credentials не лежат в случайных файлах, webhooks ограничены логикой workflow, а доступ к серверу и Docker есть только у администраторов.

В итоге архитектура n8n на VPS должна закрывать не только запуск контейнера, но и рабочую эксплуатацию: домен, SSL, PostgreSQL, volumes, env, auth, webhooks, бэкапы и обновления.

Сценарии использования

n8n можно поставить на VPS для разных задач: от личных уведомлений до рабочих процессов бизнеса. Техническая база может быть похожей — Docker Compose, PostgreSQL, домен и SSL, — но требования к безопасности, бэкапам и доступу будут разными.

Поэтому перед установкой полезно понять, какую роль n8n будет играть: личный инструмент, командная среда или часть бизнес-инфраструктуры.

Личная автоматизация

Для личной автоматизации n8n обычно используют как универсальный сервер сценариев. Он может принимать webhooks, отправлять уведомления, обновлять таблицы, запускать Telegram-ботов, собирать данные из API и связывать между собой разные сервисы.

Примеры личных сценариев:

  • Уведомления в Telegram;
  • Автоматическая запись данных в Google Sheets;
  • Напоминания;
  • Обработка webhook-событий;
  • Простые интеграции с почтой;
  • Сбор данных из открытых API;
  • Домашние или личные рабочие автоматизации.

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

Но даже для личного использования нельзя относиться к n8n как к одноразовому контейнеру. Внутри быстро появятся credentials, токены, workflows и история запусков. Поэтому нужны volumes, HTTPS, закрытый редактор и бэкап PostgreSQL.

Если n8n используется только одним человеком, доступ можно ограничить проще: сильный пароль, HTTPS, Basic Auth на reverse proxy, ограничение по IP или VPN. Главное — не оставлять редактор открытым для всего интернета.

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

Команда

В командном сценарии n8n становится общей средой автоматизации. Несколько человек могут создавать workflows, подключать сервисы, менять интеграции и работать с одними и теми же данными.

Здесь уже важно думать не только об установке, но и о правилах эксплуатации.

Нужно заранее определить:

  • Кто имеет доступ к редактору;
  • Кто может создавать и менять workflows;
  • Кто отвечает за credentials;
  • Кто обновляет контейнеры;
  • Кто проверяет ошибки workflows;
  • Кто следит за бэкапами;
  • Как фиксируются изменения в важных сценариях.

Для команды особенно важны домен, HTTPS и понятная авторизация. Если n8n доступен по случайному IP и открыт всем, это быстро превращается в риск: любой найденный доступ может дать возможность менять автоматизации и работать с подключёнными сервисами.

Также стоит разделять тестовые и рабочие workflows. Если несколько человек одновременно меняют сценарии, легко случайно сломать обработку заявок, уведомлений или интеграцию с CRM.

В командной установке бэкапы PostgreSQL уже нельзя считать “желательной опцией”. Потеря базы может означать потерю рабочих процессов, credentials, истории запусков и настроек, которыми пользуется вся команда.

Если n8n начинает влиять на реальные заявки, продажи или поддержку, это уже следующий уровень — небольшой бизнес.

Небольшой бизнес

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

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

Поэтому для бизнеса минимальная установка должна включать:

  • PostgreSQL с регулярными бэкапами;
  • Постоянные volumes;
  • HTTPS;
  • Закрытый доступ к редактору;
  • Понятный домен;
  • Мониторинг контейнеров;
  • План обновлений;
  • Проверку восстановления;
  • Контроль публичных webhooks.

Особое внимание нужно уделить webhooks. Многие workflows должны принимать запросы извне: от сайта, CRM, платёжной системы, формы или другого сервиса. Но публичный webhook не должен превращаться в неограниченную точку входа.

Для важных процессов стоит проверять токены, секреты, подписи запросов, метод запроса, источник данных и логику обработки. Иначе webhook может начать принимать мусорные или вредные запросы.

Также бизнесу важно понимать ответственность за self-hosted формат. Если n8n установлен на собственном VPS, обновления, бэкапы, безопасность, мониторинг и восстановление после аварии остаются на стороне владельца сервера.

В итоге сценарий использования определяет глубину настройки. Для личных задач достаточно простой, но защищённой установки. Для команды нужны правила доступа и обслуживания. Для бизнеса n8n нужно разворачивать как полноценный сервис: с HTTPS, PostgreSQL, бэкапами, ограничением доступа, обновлениями и проверкой восстановления.

Установка через Docker Compose

Docker Compose удобен тем, что вся установка n8n описывается в одном проекте: контейнер приложения, PostgreSQL, volumes, network и переменные окружения.

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

Подготовка сервера

Перед установкой нужен VPS с обновлённой системой, Docker, Docker Compose и доменом, который указывает на IP сервера.

Для начала создайте отдельную директорию проекта:

mkdir -p /opt/n8n

cd /opt/n8n

В этой директории будут лежать:

  • docker-compose.yml;
  • .env;
  • Данные volumes;
  • Дополнительные скрипты для бэкапов, если они понадобятся позже.

Проверить Docker можно так:

docker --version

docker compose version

Если на сервере включён firewall, снаружи обычно открывают только 80 и 443 порты для reverse proxy. Сам порт n8n 5678 лучше не публиковать напрямую в интернет.

n8n должен открываться через домен и HTTPS, например: https://n8n.example.com

Когда сервер готов, можно описывать сервисы в docker-compose.yml.

docker-compose.yml

Минимальный docker-compose.yml для self-hosted n8n с PostgreSQL может выглядеть так:

services:

  postgres:

    image: postgres:16

    container_name: n8n-postgres

    restart: unless-stopped

    environment:

      POSTGRES_USER: ${POSTGRES_USER}

      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}

      POSTGRES_DB: ${POSTGRES_DB}

    volumes:

      - postgres_data:/var/lib/postgresql/data

  n8n:

    image: n8nio/n8n:latest

    container_name: n8n

    restart: unless-stopped

    depends_on:

      - postgres

    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_PROTOCOL: https

      WEBHOOK_URL: ${WEBHOOK_URL}

      GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}

      TZ: ${GENERIC_TIMEZONE}

      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}

    volumes:

      - n8n_data:/home/node/.n8n

    ports:

      - "127.0.0.1:5678:5678"

volumes:

  postgres_data:

  n8n_data:

В этой схеме PostgreSQL доступен только внутри Docker-сети, а n8n публикуется на 127.0.0.1:5678. Это значит, что напрямую из интернета порт не открыт, а внешний доступ должен идти через reverse proxy.

Строка:

ports:

  - "127.0.0.1:5678:5678"

специально ограничивает порт локальным интерфейсом. Так Nginx, Caddy или Traefik на этом же VPS смогут проксировать запросы в n8n, но случайный пользователь не откроет редактор по http://server-ip:5678.

После compose-файла нужно вынести чувствительные значения в .env.

Переменные окружения

Файл .env должен лежать рядом с docker-compose.yml. В нём указывают домен, доступы к базе, timezone и ключ шифрования.

Пример:

POSTGRES_USER=n8n

POSTGRES_PASSWORD=change_this_strong_password

POSTGRES_DB=n8n

N8N_HOST=n8n.example.com

WEBHOOK_URL=https://n8n.example.com/

GENERIC_TIMEZONE=Europe/Berlin

N8N_ENCRYPTION_KEY=change_this_to_long_random_string

Пароли и N8N_ENCRYPTION_KEY нужно заменить на свои. Ключ шифрования особенно важен: он используется для защиты чувствительных данных n8n. Если потерять этот ключ, после восстановления из бэкапа могут возникнуть проблемы с доступом к зашифрованным credentials.

Сгенерировать случайную строку можно так: openssl rand -hex 32

В N8N_HOST указывают домен без https://. В WEBHOOK_URL — полный публичный адрес, по которому внешние сервисы будут обращаться к webhooks.

Если WEBHOOK_URL не настроен правильно, n8n может формировать webhook-ссылки с неправильным доменом, протоколом или локальным адресом.

После подготовки .env можно запускать контейнеры.

Запуск контейнеров

Запуск выполняется из директории проекта:

cd /opt/n8n

docker compose up -d

Проверить состояние контейнеров: docker compose ps

Посмотреть логи n8n: docker compose logs n8n --tail=100

Посмотреть логи PostgreSQL: docker compose logs postgres --tail=100

Если контейнер n8n не стартует, чаще всего причина в переменных окружения, подключении к PostgreSQL, неправильном .env или ошибке в docker-compose.yml.

Если PostgreSQL не стартует, проверьте пароль, имя базы, volume и логи контейнера.

После первого запуска n8n ещё не стоит сразу считать готовым к работе. Нужно проверить доступ, HTTPS, сохранение данных и webhooks.

Проверка n8n

На этом этапе n8n должен отвечать локально на VPS: curl -I http://127.0.0.1:5678

Если ответ есть, значит контейнер n8n работает и слушает локальный порт. Дальше доступ должен идти через reverse proxy и домен: https://n8n.example.com

После настройки proxy и SSL нужно проверить:

  • Открывается ли редактор по HTTPS;
  • Создаётся ли первый пользователь;
  • Сохраняется ли workflow;
  • Не исчезают ли данные после перезапуска контейнера;
  • Работает ли подключение к PostgreSQL;
  • Правильно ли формируется webhook URL;
  • Видит ли n8n внешний HTTPS-адрес;
  • Нет ли ошибок в docker compose logs n8n.

Перезапуск для проверки: docker compose restart

После перезапуска workflow и настройки должны остаться на месте. Если данные исчезли, значит проблема с volumes или n8n был запущен без постоянного хранения.

Также стоит проверить автозапуск после reboot VPS: sudo reboot

После перезагрузки сервера контейнеры должны подняться автоматически благодаря:

restart: unless-stopped

Если n8n открывается только локально, но не открывается по домену, проблема уже не в Docker Compose, а в DNS, reverse proxy, SSL или firewall. Поэтому следующий шаг после запуска контейнеров — настроить домен, HTTPS и проксирование запросов.

Домен, SSL и reverse proxy 

После запуска контейнеров n8n ещё не должен открываться напрямую по IP и порту 5678. Для нормальной установки нужен домен, HTTPS и reverse proxy, который будет принимать внешние запросы и передавать их в контейнер n8n.

Рабочая схема выглядит так: https://n8n.example.com → Nginx → http://127.0.0.1:5678 → n8n

Так n8n остаётся за proxy, а наружу открываются только стандартные HTTP/HTTPS-порты.

DNS-запись

Для начала нужно создать DNS-запись для домена или поддомена, на котором будет работать n8n.

Например: n8n.example.com  A  203.0.113.10

Где 203.0.113.10 — IP-адрес VPS.

Если используется ipv6, важно не забыть проверить и АААА-запись.

Проверить, куда указывает домен, можно так: dig A n8n.example.com +short

Или через nslookup: nslookup n8n.example.com

DNS должен указывать именно на тот VPS, где запущены Docker Compose, n8n и reverse proxy. Если домен всё ещё ведёт на старый IP или не резолвится, SSL не выпустится, а webhooks не будут работать снаружи.

После DNS нужно убедиться, что на VPS открыты 80 и 443 порты. Порт 80 нужен для HTTP-запросов и выпуска сертификата, порт 443 — для HTTPS.

Если используется UFW:

sudo ufw allow 80/tcp

sudo ufw allow 443/tcp

sudo ufw status

Когда домен резолвится и порты доступны, можно настраивать Nginx как reverse proxy.

Nginx proxy

Nginx будет принимать запросы на n8n.example.com и передавать их в контейнер n8n, который слушает локальный адрес 127.0.0.1:5678.

Пример базового конфига:

server {

    listen 80;

    server_name n8n.example.com;

    location / {

        proxy_pass http://127.0.0.1:5678;

        proxy_http_version 1.1;

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_set_header Upgrade $http_upgrade;

        proxy_set_header Connection "upgrade";

    }

}

Файл можно разместить, например, здесь: /etc/nginx/sites-available/n8n.example.com

Затем включить сайт:

sudo ln -s /etc/nginx/sites-available/n8n.example.com /etc/nginx/sites-enabled/

sudo nginx -t

sudo systemctl reload nginx

Если docker-compose.yml публикует n8n только на 127.0.0.1:5678, Nginx на этом же VPS сможет обратиться к n8n, а прямой доступ извне к порту 5678 будет закрыт.

Это нормальная схема: пользователь работает с https://n8n.example.com, а внутренний порт контейнера не торчит наружу.

После проверки proxy можно выпускать SSL-сертификат.

Let’s Encrypt

Для HTTPS обычно используют Let’s Encrypt и Certbot. Если Nginx уже настроен и домен указывает на VPS, сертификат можно выпустить так: sudo certbot --nginx -d n8n.example.com

Certbot добавит SSL-конфигурацию и может настроить редирект с HTTP на HTTPS.

После выпуска сертификата нужно проверить, что сайт открывается по адресу: https://n8n.example.com

Также полезно проверить редирект:

curl -I http://n8n.example.com

curl -I https://n8n.example.com

В нормальной схеме HTTP должен перенаправлять на HTTPS, а HTTPS — возвращать страницу n8n без ошибок SSL.

Если сертификат не выпускается, чаще всего причина в одном из пунктов:

  • DNS ещё не указывает на VPS;
  • Порт 80 закрыт firewall;
  • Nginx не запущен;
  • server_name не совпадает с доменом;
  • Перед сервером стоит CDN с неправильным SSL-режимом;
  • Домен открывается не с этого VPS.

Когда HTTPS заработал, нужно проверить ещё одну важную настройку — публичный URL для webhooks.

Webhook URL

Для n8n важно знать свой внешний адрес. Он используется в webhook-ссылках, OAuth callback и интеграциях, которые обращаются к n8n извне.

В .env нужно указать публичный HTTPS-адрес:

N8N_HOST=n8n.example.com

N8N_PROTOCOL=https

WEBHOOK_URL=https://n8n.example.com/

Если WEBHOOK_URL указан неправильно, n8n может показывать webhook-ссылки с локальным адресом, HTTP вместо HTTPS, IP-адресом сервера или неправильным доменом.

После изменения .env нужно перезапустить контейнеры:

cd /opt/n8n

docker compose up -d

Проверять webhook лучше не только в интерфейсе. Создайте простой test workflow с webhook trigger и отправьте запрос снаружи: curl -X POST https://n8n.example.com/webhook/test

Точный путь будет зависеть от URL, который n8n выдаст для конкретного workflow.

Если webhook не срабатывает, нужно проверить:

  • Активирован ли workflow;
  • Правильный ли webhook URL;
  • Работает ли HTTPS;
  • Доходит ли запрос до Nginx;
  • Передаёт ли Nginx запрос в n8n;
  • Нет ли ошибок в docker compose logs n8n;
  • Не блокирует ли firewall или CDN нужный запрос.

В итоге домен, SSL и reverse proxy нужны не только для красивого адреса. Без них n8n может работать локально, но внешние webhooks, OAuth-интеграции и безопасный доступ к редактору будут настроены неправильно.

Безопасность и обслуживание

После запуска n8n важно не оставить установку в состоянии “контейнер работает — значит готово”. Self-hosted n8n быстро становится частью инфраструктуры: он хранит credentials, принимает webhooks, подключается к внешним сервисам и может запускать действия от имени пользователя или команды.

Поэтому безопасность и обслуживание нужно продумать сразу. Минимальный набор: HTTPS, ограниченный доступ к редактору, аккуратная работа с webhooks, регулярные бэкапы PostgreSQL и обновления контейнеров.

HTTPS обязательно

n8n не стоит запускать в открытый интернет по обычному HTTP. Через интерфейс и workflows могут проходить токены, cookies, credentials, OAuth-данные, webhook-запросы и служебная информация.

Если трафик идёт без HTTPS, эти данные хуже защищены при передаче. Кроме того, многие внешние сервисы не принимают небезопасные callback URL и webhook endpoints.

Правильная схема: https://n8n.example.com → reverse proxy → http://127.0.0.1:5678

Снаружи пользователь и внешние сервисы работают только с HTTPS. Внутри VPS reverse proxy передаёт запросы в контейнер n8n по локальному адресу.

После выпуска SSL нужно проверить:

  • Открывается ли n8n по HTTPS;
  • HTTP перенаправляется на HTTPS;
  • Нет ли ошибок сертификата;
  • WEBHOOK_URL использует https://;
  • OAuth callback тоже формируется с HTTPS.

Если n8n работает по HTTPS, следующий слой защиты — сам редактор. Его нельзя оставлять доступным всем подряд.

Доступ к редактору

Редактор n8n — это панель управления workflows и интеграциями. Через него можно менять сценарии, подключать сервисы, запускать автоматизации и работать с credentials.

Поэтому редактор должен быть закрыт от случайных посетителей и ботов. Нельзя оставлять его просто доступным по адресу: https://n8n.example.com без нормальной авторизации и ограничений.

Для личной установки можно использовать несколько уровней защиты:

  • Встроенную авторизацию n8n;
  • Сильный пароль;
  • Basic Auth на reverse proxy;
  • Ограничение доступа по IP;
  • VPN;
  • Отдельный закрытый поддомен.

Для команды важно заранее решить, кто может создавать workflows, кто управляет credentials и кто отвечает за изменения в рабочих сценариях.

Если n8n используется для бизнеса, доступ к редактору лучше выдавать только тем, кому он действительно нужен. Чем меньше людей может менять workflows и credentials, тем ниже риск случайной или опасной правки.

Редактор должен быть закрыт, но webhooks часто остаются публичными. Их нужно защищать уже на уровне логики и маршрутов.

Webhooks

Webhooks нужны, чтобы внешние сервисы могли отправлять события в n8n. Например, сайт отправляет заявку, CRM передаёт изменение сделки, платёжная система сообщает о статусе оплаты, а форма отправляет новые данные.

Публичный webhook — это нормально. Но публичный webhook не должен быть неограниченной точкой входа.

Для важных workflows стоит проверять:

  • Метод запроса: GET, POST или другой;
  • Наличие секретного токена;
  • Подпись запроса, если сервис её поддерживает;
  • Структуру входящих данных;
  • Источник события;
  • Частоту запросов;
  • Обработку ошибочных payload;
  • Защиту от повторной отправки одного события.

Простой вариант — добавлять секрет в URL или заголовок и проверять его в workflow. Более надёжный вариант — использовать подписи запросов, если внешний сервис поддерживает такую проверку.

Также не стоит делать webhook слишком универсальным. Лучше несколько понятных endpoints под конкретные задачи, чем один общий webhook, который принимает всё подряд.

Если webhook начинает получать мусорные запросы, нужно смотреть логи, ограничивать обработку, добавлять проверки и при необходимости менять URL.

Webhooks отвечают за входящие события, но сохранность workflows, credentials и истории зависит от базы данных. Поэтому следующий обязательный пункт — бэкапы PostgreSQL.

Бэкапы PostgreSQL

PostgreSQL хранит основное состояние n8n: workflows, credentials metadata, настройки, executions и другие рабочие данные. Если база потеряется, контейнер n8n сам по себе не восстановит автоматизации.

Минимальный бэкап PostgreSQL можно делать через pg_dump внутри контейнера: docker exec n8n-postgres pg_dump -U n8n n8n > /opt/n8n/backups/n8n-db-$(date +%F).sql

Если база большая, dump лучше сжимать: docker exec n8n-postgres pg_dump -U n8n n8n | gzip > /opt/n8n/backups/n8n-db-$(date +%F).sql.gz

Но локального файла на том же VPS недостаточно. Копию нужно отправлять в удалённое хранилище: object storage, backup-сервер или другое независимое место.

Также нужно сохранять не только dump базы, но и важные файлы установки:

  • docker-compose.yml;
  • .env;
  • volume n8n, если в нём есть важные данные;
  • Инструкцию по восстановлению;
  • N8N_ENCRYPTION_KEY.

Ключ шифрования особенно важен. Если восстановить базу, но потерять N8N_ENCRYPTION_KEY, могут возникнуть проблемы с расшифровкой credentials.

Бэкап считается рабочим только после проверки восстановления. Хотя бы периодически нужно поднимать копию на тестовом окружении и проверять, что workflows, credentials и webhooks доступны.

Когда бэкапы настроены, остаётся обслуживание: контейнеры нужно обновлять, но делать это аккуратно.

Обновления контейнеров

n8n и PostgreSQL не стоит оставлять без обновлений на неопределённый срок. В новых версиях могут быть исправления безопасности и багов, изменения зависимостей и улучшения работы workflows.

Но обновлять контейнеры “вслепую” тоже опасно. Перед обновлением нужно сделать бэкап PostgreSQL и сохранить текущую версию.

Посмотреть текущие images можно так: docker compose images

Обновление обычно выглядит так: cd /opt/n8n

docker compose pull

docker compose up -d

После обновления нужно проверить:

  • Открывается ли редактор;
  • Запускаются ли основные workflows;
  • Работают ли webhooks;
  • Не появились ли ошибки в логах;
  • Подключается ли PostgreSQL;
  • Сохранились ли credentials;
  • Корректно ли работает OAuth;
  • Не изменились ли важные настройки.

Логи n8n после обновления: docker compose logs n8n --tail=100

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

Оптимальная схема — обновлять регулярно, но с бэкапом, проверкой changelog, тестом ключевых workflows и возможностью отката.

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

Типовые ошибки 

n8n часто устанавливают как простой контейнер для экспериментов, а потом постепенно начинают использовать для реальных задач. В этом и появляется риск: временная схема остаётся в продакшене, через неё начинают проходить заявки, токены, webhooks и данные внешних сервисов.

Большинство проблем возникает не из-за самого n8n, а из-за неправильной эксплуатации: нет HTTPS, нет volumes, нет бэкапов, редактор открыт всем, webhooks принимают любые запросы, а контейнеры месяцами не обновляются.

n8n без HTTPS

Запуск n8n без HTTPS — одна из самых опасных ошибок. Через интерфейс и workflows могут проходить cookies, credentials, OAuth-данные, webhook payload, API-ключи и другая чувствительная информация.

Плохая схема выглядит так: http://n8n.example.com

Или так: http://server-ip:5678

Такой вариант может подойти только для локального теста, но не для публичного сервера.

Для рабочей установки нужен HTTPS: https://n8n.example.com

Если n8n стоит за reverse proxy, наружу должен смотреть только HTTPS-домен, а сам контейнер может слушать локальный порт: https://n8n.example.com → Nginx → http://127.0.0.1:5678

Без HTTPS также могут ломаться OAuth-интеграции и внешние webhooks, потому что многие сервисы не принимают небезопасные callback URL.

Данные без volume

Ещё одна частая ошибка — хранить данные внутри контейнера и не подключать постоянный volume. Контейнер кажется рабочим, пока его не пересоздали, не обновили или не удалили.

Проблема в том, что контейнер — это не надёжное место для хранения состояния. Его можно пересоздать одной командой, и данные внутри исчезнут.

Правильнее сразу использовать volumes:

volumes:

  - n8n_data:/home/node/.n8n

И отдельный volume для PostgreSQL:

volumes:

  - postgres_data:/var/lib/postgresql/data

Если n8n используется с PostgreSQL, основное состояние хранится в базе. Но volume n8n всё равно важен для локальных данных и корректной работы установки.

После запуска нужно проверить, что workflows и настройки не исчезают после перезапуска: docker compose restart

Если после перезапуска n8n выглядит как новый, значит проблема с volumes или база подключена неправильно.

PostgreSQL без бэкапов

PostgreSQL может работать стабильно месяцами, но это не отменяет бэкапы. Если база повреждена, volume удалён, VPS сломан или администратор ошибся командой, workflows и настройки можно потерять.

Плохой подход — считать volume бэкапом. Volume хранит данные, но не защищает от удаления, повреждения, ошибки обновления или потери сервера.

Минимальный dump можно сделать так: docker exec n8n-postgres pg_dump -U n8n n8n | gzip > /opt/n8n/backups/n8n-db-$(date +%F).sql.gz

Но такой файл нельзя оставлять только на том же VPS. Если сервер потерян, локальный бэкап потеряется вместе с ним.

Нормальная схема:

  • Регулярный dump PostgreSQL;
  • Хранение копии вне VPS;
  • Сохранение docker-compose.yml и .env;
  • Отдельное хранение N8N_ENCRYPTION_KEY;
  • Периодическая проверка восстановления.

Бэкап без проверки восстановления — это только надежда, а не гарантия.

Редактор открыт всем

Редактор n8n нельзя оставлять доступным для всего интернета без ограничений. Это не публичная страница, а панель управления автоматизациями.

Через редактор можно менять workflows, подключать сервисы, просматривать настройки и работать с credentials. Если доступ к нему получит посторонний, он может вмешаться в реальные процессы.

Опасный вариант: https://n8n.example.com открыт всем, кто знает адрес

Лучше использовать несколько уровней защиты:

  • Встроенную авторизацию n8n;
  • Сильный пароль;
  • Basic Auth на reverse proxy;
  • Ограничение по IP;
  • VPN;
  • Отдельные учётные записи для команды;
  • Минимальный доступ только тем, кому он нужен.

Для личной установки иногда достаточно сильного пароля и Basic Auth. Для команды и бизнеса лучше заранее определить, кто имеет доступ к редактору, кто может менять workflows и кто отвечает за credentials.

Особенно опасно использовать простой или повторяющийся пароль. Если n8n связан с CRM, почтой, таблицами, мессенджерами или платёжными сервисами, компрометация редактора может затронуть не только сам VPS.

Webhooks без ограничений

Webhooks часто должны быть публичными, иначе внешние сервисы не смогут отправлять события в n8n. Но публичный webhook не должен принимать любые запросы без проверки.

Плохой сценарий: webhook принимает POST из интернета и сразу создаёт заявку, отправляет письмо, пишет в CRM или запускает другую важную цепочку.

Для рабочих webhooks нужно проверять входящие данные:

  • Есть ли секретный токен;
  • Совпадает ли подпись запроса;
  • Правильный ли метод запроса;
  • Ожидаемая ли структура payload;
  • Нет ли повторной отправки одного события;
  • Не превышена ли частота запросов;
  • Можно ли безопасно обработать ошибочные данные.

Простой вариант — добавить секрет в заголовок или параметр и проверять его в workflow. Если внешний сервис поддерживает подписи запросов, лучше использовать их.

Также не стоит делать один webhook “для всего”. Лучше разделять endpoints по задачам: отдельно заявки, отдельно оплаты, отдельно уведомления, отдельно технические события.

Если webhook начал получать мусорные запросы, его URL можно сменить, а workflow усилить проверками. Важные действия не должны запускаться только потому, что кто-то отправил запрос на публичный endpoint.

Нет обновлений

n8n, PostgreSQL, Docker images и сам VPS нужно обновлять. Если этого не делать, установка постепенно устаревает: появляются несовместимости, старые баги, закрытые уязвимости и проблемы с зависимостями.

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

Базовый порядок:

cd /opt/n8n

docker compose pull

docker compose up -d

Перед этим стоит сделать dump PostgreSQL:

docker exec n8n-postgres pg_dump -U n8n n8n | gzip > /opt/n8n/backups/n8n-db-before-update-$(date +%F).sql.gz

После обновления нужно проверить:

  • Открывается ли редактор;
  • Запускаются ли ключевые workflows;
  • Работают ли webhooks;
  • Не появились ли ошибки в логах;
  • Подключается ли PostgreSQL;
  • Не сломались ли OAuth-интеграции;
  • Сохранились ли credentials.

Логи можно посмотреть так: docker compose logs n8n --tail=100

Автообновления без контроля могут быть удобны для тестовой установки, но для рабочих процессов они рискованны. Контейнер может обновиться в неподходящий момент, а ошибка проявится уже на реальных заявках или интеграциях.

В итоге типовые ошибки сводятся к одному: n8n нельзя оставлять в “временном” состоянии, если через него уже проходят реальные процессы. HTTPS, volumes, PostgreSQL backups, закрытый редактор, защищённые webhooks и регулярные обновления — это не украшения, а базовая эксплуатация self-hosted n8n.

Заключение

n8n на VPS лучше разворачивать как небольшую рабочую систему, а не как один временный контейнер. Минимальная безопасная схема включает Docker Compose, n8n, PostgreSQL, reverse proxy, домен, HTTPS, volumes, переменные окружения, закрытый доступ к редактору и регулярные бэкапы.

Для личной автоматизации такая установка даёт контроль и гибкость. Для команды — общую среду workflows. Для небольшого бизнеса — возможность связать заявки, CRM, формы, уведомления, документы и другие сервисы без отдельной разработки под каждую интеграцию.

Главное — не оставлять self-hosted n8n в “тестовом” состоянии, если через него уже проходят реальные процессы. HTTPS, PostgreSQL backups, защищённый редактор, проверенные webhooks и обновления контейнеров должны быть частью базовой эксплуатации.

FAQ

Можно ли установить n8n на VPS без PostgreSQL?

Можно, но для рабочей self-hosted установки лучше использовать PostgreSQL. Если n8n нужен только для тестов, простая схема может быть допустима. Но для постоянных workflows, команды или бизнеса отдельная база надёжнее и удобнее для бэкапов.

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

Зачем n8n нужен домен?

Домен нужен не только для удобного входа в интерфейс. Он важен для webhooks, OAuth callback и внешних интеграций.

Например, вместо временного адреса вида: http://server-ip:5678

Лучше использовать нормальный HTTPS-адрес: https://n8n.example.com

Так внешние сервисы смогут стабильно отправлять запросы в n8n, а сам n8n будет правильно формировать публичные webhook-ссылки.

Можно ли открыть n8n просто по IP и порту 5678?

Для теста, в локальной сети — можно. Для рабочей установки — не стоит. Порт 5678 лучше не открывать напрямую в интернет.

Правильнее оставить n8n на локальном адресе: 127.0.0.1:5678

А внешний доступ сделать через reverse proxy и HTTPS: https://n8n.example.com → Nginx → 127.0.0.1:5678

Так проще контролировать SSL, заголовки, доступ и дополнительные ограничения.

Почему нельзя запускать n8n без HTTPS?

Через n8n могут проходить credentials, OAuth-токены, cookies, webhook payload, данные CRM, почты, таблиц и других сервисов. Без HTTPS трафик хуже защищён при передаче.

Кроме того, часть внешних сервисов не принимает небезопасные callback URL и webhook endpoints. Поэтому для публичного n8n HTTPS должен быть обязательным.

Что обязательно сохранять в бэкап?

Минимально нужно сохранять:

  • dump PostgreSQL;
  • docker-compose.yml;
  • .env;
  • N8N_ENCRYPTION_KEY;
  • volume n8n, если в нём есть важные данные;
  • инструкцию по восстановлению.

Особенно важно не потерять N8N_ENCRYPTION_KEY. Если восстановить базу без него, могут возникнуть проблемы с доступом к зашифрованным credentials.

Нужно ли защищать webhooks?

Да. Webhook может быть публичным, но это не значит, что он должен принимать любые запросы без проверки.

Для важных workflows стоит проверять секретный токен, подпись запроса, метод, структуру payload и повторные отправки. Иначе внешний endpoint может стать точкой для мусорных или вредных запросов.

Список источников

1. n8n Docs — Docker Compose installation

2. n8n Docs — Environment variables

3. n8n Docs — Securing n8n

4. PostgreSQL Documentation — pg_dump

Подпишитесь на нашу рассылку и получайте статьи и новости

    Ознакомьтесь с другими нашими материалами