Tropic Host

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

8 мин чтения
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, внешним исполнителем задач и Caddy.
  4. Открыть интерфейс по HTTPS и создать учетную запись владельца.
  5. Подключить Telegram, CRM, электронную почту или внешний API.
  6. Настроить обработку ошибок и срок хранения данных выполнений.
  7. Автоматизировать резервное копирование базы данных, данных и ключа шифрования.

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

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

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

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

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

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

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

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

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

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

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

Типичные сценарии использования:

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

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

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

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

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

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

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

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

SQLite подходит для обучения и небольшой установки с одним экземпляром. Для production удобнее 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 повлияет на редактор и обработку вебхуков.

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 нужны, чтобы редактор формировал правильные публичные адреса вебхуков и доверял заголовкам от одного обратного прокси.

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 оставьте только имя, адрес электронной почты и источник.
  3. Используйте узел If, чтобы отклонить заявку без обязательных данных.
  4. Создайте сделку в CRM или отправьте запрос через HTTP Request.
  5. Добавьте уведомление в Telegram.
  6. Завершите цепочку узлом Respond to Webhook.
  7. После тестирования активируйте workflow и замените тестовый webhook на рабочий URL.

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

Защита n8n после установки

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

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

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

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

docker compose exec n8n n8n audit

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

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

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

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

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

Для восстановления понадобятся дамп PostgreSQL, volume 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 становится необходим, когда длительные задачи задерживают вебхуки, одновременно запускается много 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 без интенсивной обработки файлов.

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

Заключение

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

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

FAQ

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

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

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

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

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

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

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

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

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

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

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