Сервер — управляемая Linux-машина, на которой MultiAgent разворачивает агентов и инструменты. Всё управление идёт по SSH: MultiAgent выполняет команды, передаёт файлы и читает статусы контейнеров, не требуя на сервере ничего, кроме базовой системы.
Добавление сервера
Кнопка «Добавить сервер» открывает форму: имя, хост, SSH-порт, пользователь и аутентификация — пароль или приватный PEM-ключ. Для соединений через бастион настраивается proxy jump: отдельные хост, порт, пользователь и учётные данные прыжка.
После сохранения доступен статус соединения: не проверено, OK или ошибка. Кнопка «Проверить подключение» выполняет тест с выводом каждого шага в реальном времени проверки в интерфейс.
Onboarding-проверки
Для каждого сервера MultiAgent прогоняет набор onboarding-проверок и подсвечивает, что готово, а что требует внимания:
- SSH — доступность подключения;
- Docker — установлен ли и запущен ли демон;
- daemon.json — корректность конфигурации Docker;
- Папки — наличие папок для агентов, данных, проектов и инструментов;
- Postgres — общий экземпляр Postgres для агентов;
- Forgejo — встроенный Git-сервер;
- Бэкапы — rsyncd-контейнер для резервного копирования.
Установка Docker
Если Docker на сервере отсутствует, MultiAgent установит его сам — одной кнопкой, с потоковым выводом команд в интерфейс. Там же можно отредактировать /etc/docker/daemon.json (например, зеркала реестра или логирование) — MultiAgent применит файл и перезапустит демон.
Для образов из частного реестра на сервере настраивается Registry Auth: пользователь и токен реестра, которые MultiAgent использует при pulling образов агентов и инструментов.
Папки сервера
MultiAgent хранит файлы агентов в четырёх папках сервера — все настраиваются, значения по умолчанию:
- Папка агентов —
/root/agents: по подпапке на каждого агента с егоcompose.yml; - Папка данных —
/root/data: данные агентов, у каждого своя подпапка, монтируется внутрь контейнера в/data; - Папка проектов —
/root/projects: git-репозитории агентов, монтируются в/project; - Папка инструментов —
/root/tools: файлы сервисов, развёрнутых из библиотеки инструментов.
Единая структура папок упрощает бэкапы: все данные всех агентов сервера лежат в одном дереве каталогов.
Общий Postgres
Вместо отдельной SQLite-базы у каждого агента можно поднять общий Postgres на сервере: MultiAgent развернёт контейнер docker-compose (по умолчанию порт 5436), сохранит пароль и проверит соединение. Для агентов с включённым Postgres в их окружение автоматически подставляется строка подключения AGENT_DATABASE.
Git-сервер Forgejo
MultiAgent разворачивает на сервере Forgejo — self-hosted Git-сервер (по умолчанию порт 3200) с выделенным admin-пользователем. Для каждого агента можно привязать существующий репозиторий или создать новый; SSH-ключи для доступа MultiAgent выпускает и хранит сам. Подробнее — в разделе Агенты.
Резервное копирование
Onboarding устанавливает на сервер rsyncd-контейнер с пятью read-only модулями, покрывающими все папки: агенты, данные, проекты, инструменты и Forgejo. Бэкапы забираются с сервера вашими клиентскими машинами по rsync — например, nightly-заданием на машине с бэкап-хранилищем:
rsync -avz rsync://backup@server-host:873/data/ /backups/server-host/data/
Nginx-роутинг и сертификаты
MultiAgent сам никогда не маршрутизирует запросы: на каждом сервере свой Nginx-контейнер (agents-nginx, образ nginx:alpine), который устанавливается и обновляется из вкладки Nginx страницы сервера. Конфигурация маршрутов — проекция базы: она пересобирается и применяется автоматически при каждом изменении (создали агента, продукт или инструмент — он сразу получил свою подпапку).
- Три вида маршрутов — агенты и продукты (read-only), инструменты с веб-интерфейсом (read-only) и пользовательские маршруты на любой http(s)-адрес (единственный вид с ручным управлением: редактирование, отключение, удаление);
- Единое пространство имён — слаг первого уровня
[a-z0-9-]+на сервер для всех видов; системные пути MultiAgent (api, agents, servers, data и другие) зарезервированы; - Внутренняя сеть контейнеров — приложения адресуются по именам контейнеров в общей docker-сети; упавший сервис отдаёт 502 только на своей подпапке, остальные маршруты работают.
Сертификаты — три вида из той же вкладки: самоподписанный (становится запасным сертификатом), собственная пара PEM и Let’s Encrypt (ACME через сам Nginx, тестовая и рабочая CA, один запрос за раз). Подписи и ключи хранятся только на сервере — в базе лишь метаданные. Просрочка отслеживается при каждом обновлении конфигурации (renew за 30 дней до истечения). HTTPS-порт опционален: пока он пуст, публикуется только HTTP.
Домашняя страница сервера (Heimdall)
В корне сервера можно поднять домашнюю страницу Heimdall — таб Heimdall (справа от Nginx) устанавливает контейнер agents-heimdall без собственного порта: он доступен только через корень nginx, поэтому сначала ставится Nginx. Страница получает свой вход: логин и пароль (bcrypt-хэш создаётся внутри контейнера) задаются во вкладке, при установке без значений они генерируются автоматически.
Карточки на странице синхронизируются из базы MultiAgent: по карточке на каждого агента, продукт и инструмент с адресом — с реальными логотипами проектов, а вкладка страницы подписывается «Agents». Синк проходит при каждом обновлении конфигурации nginx; всё, что пользователь добавил в Heimdall сам, не трогается. Если Heimdall остановлен, страдает только корень — подпапки приложений продолжают работать.
Шаблон URL агентов
Для адресации агентов используется шаблон URL с плейсхолдерами {slug}, {host} и {port}. Если шаблон имеет вид {база}/{slug}, его база становится публичной базой сервера — и публичный адрес каждого приложения выводится как {база}/{slug}/ (схема берётся из шаблона, поэтому сервер за внешним прокси получает https-ссылки без собственного сертификата). Прямой доступ http(s)://{хост}[:{порт}] остаётся запасным путём.
https://apps.example.com/{slug}
Файловый менеджер
У каждого сервера есть встроенный файловый менеджер: просмотр дерева каталогов, чтение и редактирование файлов, загрузка и скачивание, подсчёт токенов текстовых файлов. Это позволяет поправить конфиг или посмотреть логи на сервере, не покидая MultiAgent.