Tropic Host

n8n: что это и как установить на VPS через Docker Compose

7 мин чтения
Tropic
n8n: что это и как установить на VPS через Docker Compose

n8n на VPS: собственная платформа автоматизации без ручной рутины

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

Ниже разберем, как работает n8n и как установить его на VPS через Docker Compose с PostgreSQL, HTTPS и изолированным исполнением кода.

n8n за семь шагов

Минимальный план запуска:

  1. Создать VPS и направить на него поддомен, например n8n.example.com.
  2. Установить Docker и Docker Compose.
  3. Запустить n8n с PostgreSQL, внешним task runner и Caddy.
  4. Открыть интерфейс по HTTPS и создать учетную запись владельца.
  5. Подключить Telegram, CRM, почту или любой внешний API.
  6. Настроить обработку ошибок и срок хранения выполнений.
  7. Автоматизировать резервные копии базы, данных и ключа шифрования.

Для небольшой рабочей установки разумно начать с 2 vCPU и 4 ГБ RAM. Для тестов часто хватает 2 ГБ, но PostgreSQL, Docker и параллельные процессы быстро расходуют запас.

Что такое n8n и как он работает

n8n — платформа автоматизации рабочих процессов. Сценарий собирается из узлов: один запускает процесс, следующие получают и преобразуют данные, последний выполняет действие.

Простой workflow выглядит так:

Webhook → проверка данных → CRM → Telegram → ответ сайту

Цепочку могут запускать webhook, расписание, письмо, сообщение или событие внешнего сервиса. Между узлами доступны условия, циклы, фильтры, ожидание и обработка ошибок.

Сильная сторона n8n — автоматизация не ограничена готовыми интеграциями. К любому сервису с API можно обратиться через HTTP Request, а нестандартную логику написать в Code node на JavaScript или Python. Поэтому n8n находится между простым no-code-конструктором и собственным серверным кодом.

Почему это больше, чем пересылка данных

n8n полезен, когда процесс проходит через несколько систем и требует решения:

форма → проверка → поиск дубля → оценка ИИ → подтверждение менеджера → CRM

Человеку можно оставить только контрольную точку. Например, ИИ готовит ответ, но сообщение уходит клиенту после одобрения сотрудником.

Типичные сценарии:

  • продажи и поддержка: сбор заявок, распределение лидов и создание сделок;
  • контент и ИИ: черновики, классификация обращений и публикация после согласования;
  • DevOps: уведомления о сбоях, webhook из Git и проверки API;
  • внутренние операции: синхронизация таблиц, почты, календаря и корпоративных систем.

Self-hosted-установка контролирует процесс и базу, но не делает внешние сервисы локальными. Данные, отправленные в Telegram, CRM или облачную модель ИИ, покидают VPS.

n8n Cloud или собственный сервер

Параметрn8n Cloudn8n на VPS
ЗапускБез настройки сервераНужны домен, Docker и HTTPS
ОбновленияВыполняет n8nВыполняет владелец
База и файлыВ инфраструктуре сервисаНа выбранном сервере
МасштабированиеПо условиям облачного тарифаНастраивается самостоятельно
ОтветственностьМеньше администрированияБэкапы, защита и мониторинг на владельце
Кому подходитБыстрый старт без DevOpsКонтроль, кастомизация и постоянные процессы

Community Edition можно самостоятельно размещать бесплатно и использовать для личных и внутренних бизнес-процессов. Но n8n распространяется не по классической open-source-лицензии, а по fair-code-модели Sustainable Use License. Она разрешает внутреннее использование и модификацию, но не позволяет просто развернуть n8n, поставить свой логотип и продавать доступ как отдельный SaaS. Для такого продукта нужно отдельно проверять лицензионные условия.

Требования n8n к серверу

Нагрузка зависит от объема данных, параллельности и характера операций. Файлы, длинные списки, Code node и сценарии с ИИ требуют больше памяти, чем пересылка небольшого JSON между API.

СценарийСтартовая конфигурация
Тесты и личные текстовые workflow1 vCPU, 2 ГБ RAM, 20 ГБ NVMe
Небольшая рабочая установка2 vCPU, 4 ГБ RAM, 25–40 ГБ NVMe
Параллельные процессы, ИИ или файлы4 vCPU, 8 ГБ RAM и больше
Несколько worker-процессов в queue modeРасчет под число выполнений

SQLite подходит для знакомства и небольшого одиночного экземпляра. Для рабочей установки удобнее PostgreSQL: с ним проще делать бэкапы и позднее переходить к queue mode.

Как установить n8n на VPS

В примере используется Ubuntu 24.04, PostgreSQL, Caddy и внешний task runner. Замените n8n.example.com и часовой пояс на свои значения.

1. Настройте DNS и подготовьте сервер

Создайте DNS-запись A, направленную на IPv4-адрес VPS, затем подключитесь по SSH:

ssh root@SERVER_IP
apt update && apt upgrade -y
apt install -y ca-certificates curl ufw openssl

Установите Docker Engine и плагин Compose из официального репозитория:

install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

cat > /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

apt update
apt install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin
docker compose version

Откройте только SSH, HTTP и HTTPS:

ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

Не закрывайте текущую SSH-сессию, пока не убедитесь, что новое подключение работает.

2. Создайте переменные окружения

Подготовьте каталог:

mkdir -p /opt/n8n
cd /opt/n8n

Создайте .env. Команды ниже сразу сгенерируют разные случайные секреты для PostgreSQL, шифрования n8n и task runner:

cat > .env <<EOF
N8N_VERSION=stable
N8N_HOST=n8n.example.com
GENERIC_TIMEZONE=Europe/Berlin

POSTGRES_DB=n8n
POSTGRES_USER=n8n
POSTGRES_PASSWORD=$(openssl rand -hex 32)

N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)
RUNNERS_AUTH_TOKEN=$(openssl rand -hex 32)
EOF

chmod 600 .env

Для первого запуска тег stable удобен. После проверки установки лучше зафиксировать конкретную версию n8n, чтобы очередное обновление образа не произошло неожиданно.

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

3. Создайте Docker Compose

Создайте файл compose.yaml:

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

  n8n:
    image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
    restart: unless-stopped
    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: "5678"
      N8N_PROTOCOL: https
      N8N_EDITOR_BASE_URL: https://${N8N_HOST}
      N8N_WEBHOOK_URL: https://${N8N_HOST}/
      N8N_PROXY_HOPS: "1"
      GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
      TZ: ${GENERIC_TIMEZONE}

      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
      N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
      N8N_BLOCK_ENV_ACCESS_IN_NODE: "true"

      N8N_RUNNERS_MODE: external
      N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
      N8N_RUNNERS_BROKER_LISTEN_ADDRESS: 0.0.0.0

      EXECUTIONS_DATA_PRUNE: "true"
      EXECUTIONS_DATA_MAX_AGE: "168"
      EXECUTIONS_DATA_PRUNE_MAX_COUNT: "10000"
    volumes:
      - n8n_data:/home/node/.n8n
    expose:
      - "5678"
    depends_on:
      postgres:
        condition: service_healthy

  n8n-runner:
    image: n8nio/runners:${N8N_VERSION}
    restart: unless-stopped
    environment:
      N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
      N8N_RUNNERS_TASK_BROKER_URI: http://n8n:5679
    depends_on:
      - n8n

  caddy:
    image: caddy:2-alpine
    restart: unless-stopped
    environment:
      N8N_HOST: ${N8N_HOST}
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config
    depends_on:
      - n8n

volumes:
  postgres_data:
    name: n8n_postgres_data
  n8n_data:
    name: n8n_data
  caddy_data:
    name: n8n_caddy_data
  caddy_config:
    name: n8n_caddy_config

Внешний task runner выполняет код отдельно от основного процесса n8n. Это безопаснее внутреннего режима и не позволяет ошибке в Code node так легко повлиять на редактор и обработку webhook.

4. Подключите HTTPS

Создайте Caddyfile:

{$N8N_HOST} {
    reverse_proxy n8n:5678
}

Caddy получит TLS-сертификат автоматически, если DNS уже указывает на VPS, а порты 80 и 443 доступны. Внутренний порт 5678 не публикуется в интернет: снаружи доступны только 80 и 443, а Caddy обращается к n8n по сети Docker.

Переменные N8N_WEBHOOK_URL и N8N_PROXY_HOPS нужны, чтобы редактор формировал правильные публичные адреса webhook и доверял заголовкам от одного reverse proxy.

5. Запустите n8n

Проверьте итоговую конфигурацию и запустите контейнеры:

docker compose config
docker compose up -d
docker compose ps
docker compose logs --tail=100 n8n caddy

Откройте:

https://n8n.example.com

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

Первый полезный workflow

Хороший тест — обработка заявки с сайта:

  1. Добавьте узел Webhook с методом POST.
  2. Через Edit Fields оставьте только имя, email и источник.
  3. Узлом If отклоните заявку без обязательных данных.
  4. Создайте сделку в CRM или отправьте запрос через HTTP Request.
  5. Добавьте уведомление в Telegram.
  6. Завершите цепочку узлом Respond to Webhook.
  7. После теста активируйте workflow и замените тестовый webhook на рабочий URL.

Такой пример сразу проверяет домен, HTTPS, входящие запросы, credentials и работу внешней интеграции. Затем стоит добавить отдельный Error Workflow, который будет уведомлять о сбое основной цепочки.

Безопасность n8n после установки

Установленный n8n еще не равен надежному n8n. После запуска проверьте, что:

  • редактор доступен только по HTTPS;
  • .env имеет права 600 и не попадает в Git;
  • внешние API-ключи имеют минимальные права;
  • webhook проверяет подпись или секрет источника;
  • история выполнений очищается автоматически;
  • ошибки критичных workflow отправляются администратору.

Community nodes устанавливаются как пакеты и могут получить доступ к данным workflow и серверу. Не добавляйте неизвестные узлы без проверки. Если они не нужны, отключите их переменной N8N_COMMUNITY_PACKAGES_ENABLED=false.

Запустите встроенный аудит:

docker compose exec n8n n8n audit

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

История выполнений и персональные данные

n8n сохраняет входные и выходные данные для отладки. Вместе с ними в базе могут оставаться письма, телефоны, документы и ответы API.

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

Резервное копирование и обновления

Для восстановления нужны дамп PostgreSQL, том n8n_data, конфигурационные файлы и .env с N8N_ENCRYPTION_KEY. Перед копированием остановите обработчики, оставив PostgreSQL запущенным. Это создаст короткий перерыв в работе workflow:

cd /opt/n8n
mkdir -p backup
docker compose stop n8n n8n-runner

docker compose exec -T postgres sh -c \
  'pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB"' \
  | gzip > "backup/n8n-db-$(date +%F).sql.gz"

docker run --rm \
  -v n8n_data:/source:ro \
  -v "$PWD/backup":/backup \
  alpine sh -c \
  'tar -czf /backup/n8n-data-$(date +%F).tar.gz -C /source .'

tar -czf "backup/n8n-config-$(date +%F).tar.gz" \
  .env compose.yaml Caddyfile

docker compose start n8n n8n-runner

Архив с .env содержит секреты: шифруйте его и храните вне VPS. Периодически проверяйте копию тестовым восстановлением.

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

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

У task runner и основного контейнера должен быть одинаковый тег версии.

Когда потребуется масштабирование

Не начинайте с Redis и нескольких worker без реальной нагрузки. Один экземпляр с PostgreSQL проще обслуживать и обычно покрывает небольшие внутренние процессы.

Queue mode понадобится, когда долгие задачи задерживают webhook, одновременно запускается много workflow или обработка файлов регулярно занимает всю память. Тогда основной экземпляр принимает события, Redis распределяет задания, а worker выполняют их параллельно. Все компоненты должны подключаться к одному PostgreSQL и использовать одинаковый N8N_ENCRYPTION_KEY.

Какой VPS выбрать для n8n

Для связки n8n, PostgreSQL, Caddy и task runner разумно начать с 2 vCPU, 4 ГБ RAM и NVMe-диска. На tropic.host этой конфигурации соответствует тариф Light: 2 vCPU, 4 ГБ RAM и 25 ГБ NVMe. Этого достаточно для первых рабочих workflow без тяжелой обработки файлов.

Для документов, больших массивов и множества параллельных сценариев с ИИ лучше выбрать 8 ГБ RAM. Важна и стабильная сеть: webhook, обратные вызовы OAuth и задачи по расписанию должны оставаться доступными постоянно.

Вывод

n8n превращает повторяющиеся операции в наглядные схемы: готовые узлы ускоряют запуск, HTTP Request подключает почти любой API, а Code node позволяет дописать собственную логику.

Self-hosted-версия дает контроль над сервером и базой, но требует HTTPS, ограниченных ключей, очистки истории и проверяемых резервных копий. Сохраняйте вместе с PostgreSQL ключ N8N_ENCRYPTION_KEY: без него восстановленные учетные данные нельзя расшифровать.

FAQ

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

Да. Community Edition можно бесплатно разместить на своем сервере для личных и внутренних процессов. Перепродажа размещенного n8n как отдельного SaaS ограничена fair-code-лицензией.

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

Для локального теста — да. Для публичных webhook и OAuth лучше использовать домен и HTTPS.

Сколько оперативной памяти нужно n8n?

Простым личным workflow часто хватает 2 ГБ RAM. Для n8n с PostgreSQL, Caddy и task runner разумнее 4 ГБ; файлы и параллельные запуски могут потребовать 8 ГБ и больше.

Остаются ли все данные внутри VPS?

Только те, которые workflow не отправляет наружу. База и история находятся на VPS, но узлы Telegram, CRM или внешней модели ИИ передают выбранные данные соответствующему сервису.

Что включить в резервную копию n8n?

Дамп PostgreSQL, том n8n_data, compose.yaml, Caddyfile и .env с N8N_ENCRYPTION_KEY. Копию храните вне VPS в зашифрованном виде и проверяйте восстановлением.