Nginx-роутинг

MultiAgent никогда не распределяет запросы сам: на каждом сервере работает свой Nginx-контейнер agents-nginx, который MultiAgent разворачивает, настраивает и обновляет. Все приложения сервера — агенты, продукты, инструменты с веб-интерфейсом и произвольные сервисы — раздаются по подпапкам одного адреса: {база}/{слаг}/. Никаких отдельных доменов, поддоменов и ручных конфигов под каждое приложение: у сервера один адрес, и каждое приложение живёт в своей подпапке.

Как это работает

На каждом управляемом сервере MultiAgent поднимает один контейнер agents-nginx (образ nginx:alpine, сервис nginx). Контейнер ставится из вкладки Nginx страницы сервера: MultiAgent создаёт файлы конфигурации на сервере (загружаются по защищённому каналу), присоединяет контейнер к общей docker-сети и запускает его.

Конфигурация маршрутов собирается из базы MultiAgent автоматически: при каждом изменении (создали агента, продукт или инструмент, добавили или отредактировали кастомный маршрут, изменили порты) конфиг пересобирается и применяется сам. Установки показывают свои шаги в ленте прогресса, изменения записей применяются в фоне. Кнопка «Apply configuration» во вкладке прогоняет то же обновление вручную — удобно, когда правку сделали прямо на сервере.


Источники маршрутов

Общая таблица маршрутов собирается из трёх источников:

  • Агенты и продукты — каждая развёрнутая запись агента (включая продукты из каталога) автоматически даёт маршрут: появляется вместе с записью и исчезает с её удалением;
  • Инструменты с веб-интерфейсом — инструмент, у шаблона которого объявлен веб-порт, получает маршрут автоматически (порт берётся из шаблона и обновляется при каждом развёртывании); без веб-порта инструмент остаётся на прямом адресе http://{хост}:{порт};
  • Кастомные маршруты — единственный вид с ручным управлением: произвольный http(s)-адрес (не обязательно управляемый MultiAgent — служба на своём порту, локальный сервис, внешняя система), с редактированием, отключением и удалением.

Вкладка показывает все маршруты, отсортированные по слагу, с публичным адресом и целью для каждого; автоматические виды помечены «Managed by MultiAgent» и кликом ведут к исходной записи.


Схема трафика

Трафик идёт так: http(s)://{хост сервера}/{слаг}/ → Nginx сервера → контейнер приложения во внутренней docker-сети ({имя контейнера}:{порт}). Приложения адресуются по именам контейнеров, поэтому публиковать порты наружу не нужно.

  • Резолвинг на лету — конфиг использует внутренний резолвер и переменные адресов: Nginx стартует и работает независимо от того, какие приложения существуют. Неработающее, остановленное или ещё не развёрнутое приложение даёт ошибку только на своей подпапке, остальные маршруты продолжают работать;
  • WebSocket и большие ответы — поддерживаются постоянные соединения (живые чаты агентов), длинные таймауты и безлимитный размер передаваемых данных;
  • Заголовки — приложению передаются служебные данные о префиксе, хосте и схеме, поэтому чувствительные к префиксу приложения строят правильные абсолютные адреса; за внешним прокси приложения получают https-схему и исходный хост;
  • Корень / — отдаётся домашней страницей сервера Heimdall, когда она установлена (см. ниже); без неё корень ведёт себя как обычная резервная страница.

Пространство имён и зарезервированные префиксы

Слаг первого уровня — единое пространство имён на каждый сервер, общее для агентов, продуктов, инструментов и кастомных маршрутов: один и тот же слаг может существовать на разных серверах, но на одном сервере его можно занять только один раз. Слаги — только строчные буквы, цифры и дефисы ([a-z0-9-]+).

Служебные пути MultiAgent зарезервированы и не могут стать слагами: api, v1, swagger, servers, agents, tools, workspaces, analytics, accounts, data и другие пути интерфейса. Агента с именем api или servers создать нельзя — форма подсветит это сразу, а сервер отклонит запись.


Кастомные маршруты

Кастомный маршрут направляет подпапку на любой абсолютный http(s)-адрес, доступный с сервера: служба на своём порту, локальное приложение, внешняя система. Для создания нужны имя, слаг по правилам пространства имён и цель — абсолютный адрес вида http(s)://… (значение без схемы отклоняется).

  • Каждое изменение (создание, редактирование, включение, отключение, удаление) сразу пересобирает и применяет конфиг;
  • Отключённый маршрут убирает свою подпапку — она начинает отвечать ошибкой 404, запись остаётся в таблице;
  • Удаление освобождает слаг для любого вида — другой агент, инструмент или маршрут сможет его занять;
  • Если у цели есть собственный базовый путь (например, http://host/wiki), он подставляется вместо слага: /{слаг}/docs/page достигает /wiki/docs/page.

Сертификаты

Сертификаты управляются из того же вкладки Nginx — три вида:

  • Самоподписанный — генерируется MultiAgent и служит резервным сертификатом; его можно скачать как файл .crt и импортировать в доверенные сертификаты системы;
  • Собственная пара PEM — вставляется или загружается; цепочка и ключ проверяются до записи (ключ должен совпадать с сертификатом, просроченный отклоняется с предупреждением);
  • Let’s Encrypt — бесплатные сертификаты через сам Nginx (проверка владения доменом по протоколу ACME): тестовая (staging) и рабочая площадка, один запрос за раз, домен должен указывать на сервер.

Ключевые материалы хранятся только на сервере (папка ssl/{домен}/: полная цепочка + приватный ключ) и монтируются в контейнер только для чтения — в базе MultiAgent лишь метаданные. Каждое обновление конфигурации продлевает сертификаты, истекающие в течение 30 дней (самоподписанные перегенерируются, Let’s Encrypt запрашивается заново), плюс есть ручное продление по строке. HTTPS-порт опционален: пока он пуст, публикуется только HTTP, и сертификаты хранятся, но не раздаются.


Домашняя страница сервера (Heimdall)

Корень / Nginx отдаёт домашнюю страницу сервера Heimdall, когда контейнер установлен (вкладка Heimdall страницы сервера; требуется установленный Nginx). Карточки приложений синхронизируются из базы MultiAgent с реальными логотипами проектов, а страница защищена собственным входом — отдельной учётной записью, не связанной с аккаунтами MultiAgent. Подробнее — на странице Домашняя страница сервера.

Подпапки приложений всегда имеют приоритет над путями Heimdall: агент со слагом settings будет отдан по /settings/, а сама домашняя страница продолжит работать в корне. Если Heimdall остановлен, страдает только корень — подпапки приложений продолжают работать.


Публичный адрес

Канонический публичный адрес каждого приложения — {база}/{слаг}/. База выводится в одном месте: это база из шаблона адреса агентов, когда он имеет вид {база}/{slug} (так за проксированным сервером получаются https-ссылки без собственного сертификата); иначе — http(s)://{хост сервера}[:{порт nginx}]. Схема следует одному правилу: любой сертификат + включённый HTTPS-порт → https, иначе http. Прямой доступ http://{хост}:{порт} остаётся запасным путём и помечен «direct access» в интерфейсе.

← Оглавление документации