Серверы

Сервер — управляемая Linux-машина, на которой MultiAgent разворачивает агентов и инструменты. Всё управление идёт по SSH: MultiAgent выполняет команды, передаёт файлы и читает статусы контейнеров, не требуя на сервере ничего, кроме базовой системы.

Добавление сервера

Кнопка «Добавить сервер» открывает форму: имя, хост, SSH-порт, пользователь и аутентификация — пароль или приватный PEM-ключ. Там же задаётся слаг развёртывания — короткое имя (по умолчанию agents), которое отделяет это развёртывание от других MultiAgent на той же машине: из него складываются имя docker-сети, приставка имён контейнеров и корни папок. Двум серверам на одной машине нельзя дать один и тот же слаг. Для соединений через бастион настраивается proxy jump: отдельные хост, порт, пользователь и учётные данные прыжка.

Если MultiAgent работает на Windows, в форме появляется режим «Локальный WSL»: вместо удалённого хоста выбирается дистрибутив WSL на этом же компьютере. Ни пароль, ни ключ не нужны — MultiAgent работает с дистрибутивом от имени своей службы, а ссылки ведут на localhost (или на сетевое имя машины, если открывать приложения нужно с других компьютеров). В установке через Docker этот режим не показывается — там доступен только SSH.

После сохранения доступен статус соединения: не проверено, OK или ошибка. Кнопка «Проверить подключение» проверяет ровно одно — доступ по SSH: получилось ли открыть сессию на сервере. Готовность сервера к развёртыванию показывает чек-лист проверок: он называет всё, чего не хватает, и предлагает исправление.

Карточка сервера

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

В той же карточке — строка действий. «Проверить и исправить» открывает чек-лист готовности (о нём ниже), «Управление» показывается, когда на сервере развёрнут свой MultiAgent, и открывает его без пароля. «Скопировать логин», «Скопировать пароль» и «Ссылка для входа» видны, только когда установлен центральный вход, — это одни и те же учётные данные для входа на сервер. Кнопка «Файлы» открывает доступ к папкам сервера, а удаление сервера вынесено в самый правый край строки.

«Ссылка для входа» кладёт в буфер обмена одноразовую ссылку, по которой человек попадает на панель сервера без пароля. Каждый клик выдаёт новую ссылку, а прежние продолжают работать, пока не истекут, — можно спокойно отправить ссылку нескольким людям. Если домашняя страница ещё не установлена, кнопка честно скажет, что сначала нужно установить её на вкладке «Домашняя страница»; если центральный вход не установлен или защита не включена, она напомнит, что ссылке нужен центральный вход за работающей защитой HTTPS.

Отдельной карточки со списком агентов на странице больше нет — лишняя копия того, что и так видно в дереве навигации. Строки создаются из меню строки сервера, а «Импортировать агентов» переехало в строку операций вкладки «Статус» — сразу справа от «Добавить ключ».

Меню строки сервера

Правый клик по строке сервера в дереве навигации (или кнопка с тремя точками) открывает меню действий. Кроме «Открыть» и «Добавить агента», там есть «Развернуть» — оно поднимает разом все строки сервера, у которых контейнера ещё нет: сначала агентов, потом приложения, по одному. Пункт виден только пока такие строки есть, и запускает работу в очередь задач: её журнал открывается в разделе «Задачи», оттуда же работу можно остановить (строка, которая уже начала разворачиваться, доводится до конца). Рядом — «Пересоздать плавно» и «Пересоздать принудительно» для всех развёрнутых строк; принудительное пересоздание в конце само удаляет ненужные образы Docker — в том же журнале, отдельно нажимать «Очистка Docker» не нужно.

Связь с сервером

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

Onboarding-проверки

Кнопка «Проверить и исправить» (Check) на странице сервера открывает карточку-чек-лист: каждая проверка — отдельная строка с зелёной галочкой (готово), жёлтым предупреждением, красным крестом (ошибка) или серой пометкой «пропущено», а внизу — итог «Все проверки пройдены» либо «n из m проверок требуют внимания».

Строки чек-листа названы по роли службы, а не по имени продукта:

  • Подключение по SSH — доступность соединения;
  • Docker — установлен ли и запущен ли демон, корректен ли daemon.json;
  • Папки на сервере — наличие папок для агентов, данных, домашних файлов, проектов, инструментов и временных файлов;
  • Пользователь агента (agent, 999:999) — есть ли учётная запись с нужным uid/gid;
  • Nginx — веб-сервер для маршрутизации;
  • SSL-сертификат — выдан ли и не истекает ли (если защищённое соединение обеспечивает верхний прокси, проверка предложит указать публичный адрес сервера);
  • Домашняя страница — панель карточек приложений в корне сервера (проверяется после Nginx и пропускается, если Nginx нет);
  • Центральный вход (Authelia) — обязательная служба единого входа;
  • База данных (Postgres) — общий экземпляр Postgres для агентов: установлен ли и запущен ли;
  • Git-сервис (Forgejo) — встроенный Git-сервер;
  • Сервис резервных копий (rsyncd) — контейнер для резервного копирования.

Если проверка даёт ссылку «Нажмите здесь, чтобы установить» (или «создать» / «заказать») — это исправление в один клик: оно запускает ту же одношаговую установку, что и соответствующая вкладка (Docker, папки, пользователь агента, Nginx, сертификат Let’s Encrypt, Postgres, Forgejo, бэкапы, домашняя страница, центральный вход). После успешного исправления проверки автоматически перезапускаются, и строка зеленеет. Проверка, чьи предпосылки отсутствуют (например, нет Docker или Nginx), помечается «пропущено» — она не считается, и ссылку исправления не предлагает. Кнопка центрального входа не трогает сертификат и порт HTTPS — только саму службу.

Некоторые строки ждут вашего ввода или простого действия. Строка «SSL-сертификат» без сертификатов предложит указать публичный адрес сервера вида https://ваш-домен/{слаг}, когда защищённое соединение обеспечивает верхний прокси, — или запросить сертификат Let’s Encrypt. Установленный, но остановленный Postgres чинится кнопкой запуска, а не переустановкой: данные при этом не трогаются.

Что MultiAgent умеет проверять и чинить:

  • SSL-сертификат — нет сертификата → предупреждение со ссылкой, которая предлагает два пути: указать публичный адрес сервера, когда TLS снимает верхний прокси, или заказать сертификат Let’s Encrypt (если хост похож на домен; иначе — совет сделать самоподписанный); истекающий в течение 30 дней или истёкший — предупреждение без действия, достаточно обновить на вкладке Nginx; пока не задан порт HTTPS, сертификаты сохранены, но не раздаются;
  • Центральный вход — обязательная служба: не установлен → предупреждение со ссылкой установки; установлен, но не запущен → предупреждение и переразвёртывание;
  • Forgejo — внешний экземпляр (адрес не нашего вида) проверяется по учётным данным и установку не предлагает; для собственной установки адрес выводится сам — публичная подпапка /forgejo/; пустая карточка заполняется автоматически (логин agents, автосоздание репозиториев, пароль генерируется); поле «Компания» задаёт организацию, в которой создаются и из которой видны репозитории агентов;
  • Сервис резервных копий — проверка пройдена, только когда контейнер запущен и отдаёт все семь модулей.
  • Postgres — установленный, но остановленный экземпляр — это предупреждение с кнопкой запуска (а не «не установлен»); после запуска проверка сама убедится, что сохранённые учётные данные подходят.

Установка Docker

Если Docker на сервере отсутствует, MultiAgent установит его сам — одной кнопкой, с потоковым выводом команд в интерфейс. Там же можно отредактировать /etc/docker/daemon.json (например, зеркала реестра или логирование) — MultiAgent применит файл и перезапустит демон.

Для образов из частного реестра на сервере настраивается Registry Auth: пользователь и токен реестра, которые MultiAgent использует при pulling образов агентов и инструментов.

Папки сервера

MultiAgent хранит файлы агентов в нескольких папках сервера — все настраиваются, значения по умолчанию:

  • Папка агентов — /root/agents/docker: по подпапке на каждого агента с его compose.yml;
  • Папка данных — /root/agents/data: данные агентов, у каждого своя подпапка, монтируется внутрь контейнера в /data;
  • Домашняя папка — /root/agents/home: домашний каталог агента внутри контейнера, /home/agent;
  • Папка проектов — /root/agents/projects: git-репозитории агентов, монтируются в /project;
  • Папка инструментов — /root/agents/tools: файлы сервисов, развёрнутых из библиотеки инструментов;
  • Папка временных файлов — /root/agents/tmp: черновая папка агента внутри контейнера (/tmp/agent) — сюда попадают временные файлы моделей и всё, что можно пересоздать; в резервные копии она намеренно не входит.

Все значения по умолчанию собраны из слага развёртывания: вместо {слаг} подставляется он сам, по умолчанию agents. Слаг задаётся при добавлении сервера и меняется на вкладке «Общее»; он же даёт имя общей docker-сети и приставку имён контейнеров. Смена слага действует только на новые развёртывания: запущенные контейнеры сохраняют старые имена, и ничего на диске не переезжает.

Единая структура папок упрощает бэкапы: все данные всех агентов сервера лежат в одном дереве каталогов. Уже созданные серверы сохраняют свои прежние пути — MultiAgent ничего не переносит на хосте.

Порты: закрытые по умолчанию

Новый агент, приложение или инструмент появляется с частным портом: снаружи он не отвечает, а доступен только через nginx этого сервера — по подпапке — и с самой машины. Так развёртывания на одном компьютере не видны друг другу: даже если на хосте живёт несколько серверов MultiAgent, порты одного не открыты ни другому, ни интернету.

Чтобы открыть порт наружу, включите у него переключатель «Публичный порт» — вкладка «Порты» у агента и приложения, строка порта у инструмента. Два порта публичны всегда и переключателя не имеют: HTTP/HTTPS самого nginx — это входная дверь ко всем приложениям сервера — и порт службы резервного копирования, по которому бэкапы забирают с сервера другие машины. Общий Postgres, наоборот, всегда закрыт.

Ссылка на приложение с частным портом ведёт на его адрес через nginx, а не на прямой http://{хост}:{порт}: по прямому адресу браузер всё равно не дошёл бы. Управление такими приложениями MultiAgent ведёт сам, по закрытому каналу к серверу, поэтому закрытые порты не мешают ни чатам, ни проверкам.

Общие переменные окружения сервера

Если одну и ту же переменную окружения нужно задать всем развёртываниям сервера (например, часовой пояс или уровень подробности в журналах), её задают один раз в настройках сервера — она попадёт в конфигурацию каждого агента и приложения этого сервера. Значение, заданное у конкретного агента, всегда важнее общего: так можно сделать исключение для одного развёртывания. Подробнее — на странице Агенты.

Общий Postgres

Вместо отдельной SQLite-базы у каждого агента можно поднять общий Postgres на сервере: MultiAgent развернёт контейнер docker-compose (по умолчанию порт 5436), сохранит пароль и проверит соединение. Для агентов с включённым Postgres в их окружение автоматически подставляется строка подключения AGENT_DATABASE.

Git-сервер Forgejo

MultiAgent разворачивает на сервере Forgejo — собственный Git-сервер (внутренний порт 3200). Он доступен по подпапке /forgejo/ на том же домене сервера, а адрес MultiAgent выводит сам — вводить его вручную не нужно. Для каждого агента можно привязать существующий репозиторий или создать новый; SSH-ключи для доступа MultiAgent выпускает и хранит сам. Если в поле «Компания» указать организацию, все новые репозитории агентов создаются в ней (при отсутствии она создаётся автоматически), а списки репозиториев показывают её содержимое. Подробнее — в разделе Агенты.

Резервное копирование

Onboarding устанавливает на сервер rsyncd-контейнер с семью read-only модулями, покрывающими все папки сервера: docker, home, data, projects, tools, а также два dump-модуля — postgres и forgejo. Модуль tools забирает то, что не отдаёт ни один другой модуль: сертификаты nginx, состояние центрального входа и compose инструментов; его же подпапки postgres/backup и forgejo/backup исключены из выгрузки — эти дампы отдаются своими модулями, чтобы при полном скачивании они не копировались дважды. Дампы Postgres и Forgejo формируются на самом сервере (сторонние контейнеры складывают их в папки резервного копирования). Бэкапы забираются с сервера вашими клиентскими машинами по rsync — например, nightly-заданием на машине с бэкап-хранилищем:

rsync -avz rsync://backup@server-host:873/data/ /backups/server-host/data/

Готовые команды для скачивания всех семи модулей (Linux и Windows) собраны во вкладке Backup страницы сервера — их можно запускать без изменений. Пройти проверку бэкапа сервер может только когда контейнер запущен и отдаёт все семь модулей; если какого-то не хватает, проверка укажет на переустановку.

Nginx-роутинг и сертификаты

MultiAgent сам никогда не маршрутизирует запросы: на каждом сервере свой Nginx-контейнер (имя {слаг}-nginx, по умолчанию agents-nginx), который устанавливается и обновляется из вкладки Nginx страницы сервера. Это Debian-сборка nginx (nginx:1.31), а не Alpine: она работает и на старых ядрах, на которых Alpine-сборка не запускается. Конфигурация маршрутов — проекция базы: она пересобирается и применяется автоматически при каждом изменении (создали агента, продукт или инструмент — он сразу получил свою подпапку). Применение проходит без обрыва соединений: конфигурация проверяется и перезагружается внутри уже работающего веб-сервера, поэтому открытые страницы и живые чаты не рвутся.

  • Пять видов маршрутов — агенты и продукты (read-only), инструменты с веб-интерфейсом (read-only), дополнительные ссылки агентов и продуктов (read-only: подпапка с портом со вкладки «Ссылки»), пользовательские маршруты на любой http(s)-адрес (единственный вид с ручным управлением: редактирование, отключение, удаление) и, когда установлен центральный вход, его производный маршрут auth (read-only, без переключателя защиты);
  • Единое пространство имён — слаг первого уровня [a-z0-9-]+ на сервер для всех видов; системные пути MultiAgent (api, agents, servers, data и другие) зарезервированы;
  • Внутренняя сеть контейнеров — приложения адресуются по именам контейнеров в общей docker-сети; упавший сервис отдаёт 502 только на своей подпапке, остальные маршруты работают.

Сертификаты — три вида из той же вкладки: самоподписанный (становится запасным сертификатом), собственная пара PEM и Let’s Encrypt (ACME через сам Nginx, тестовая и рабочая CA, один запрос за раз). Подписи и ключи хранятся только на сервере — в базе лишь метаданные. Просрочка отслеживается при каждом обновлении конфигурации (renew за 30 дней до истечения). HTTPS-порт опционален: пока он пуст, сертификаты сохранены, но не раздаются и публикуется только HTTP. Запрос Let’s Encrypt при пустом порте сам включает его (443), так что выпущенный сертификат сразу обслуживается; выбранный вами порт или явно выключенный HTTPS не переопределяется. В локальном защищённом режиме весь HTTP (включая подпапки маршрутов) автоматически перенаправляется на HTTPS, кроме пути проверки ACME; когда сервер стоит за верхним обратным прокси, который снимает TLS, HTTP-слушатель продолжает отдавать маршруты как обычно. Сразу правее вкладки Nginx находится вкладка Авторизация — установка центрального входа (см. ниже).

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

В корне сервера можно поднять домашнюю страницу — панель карточек, с которой открываются все приложения сервера. Это статичная панель: MultiAgent сам собирает её файл и загружает на сервер, а nginx отдаёт его в корне. Отдельный контейнер для неё не нужен — достаточно установленного Nginx; собственного входа у страницы нет, а при включённом центральном входе она закрывается вместе с остальными приложениями.

Карточки MultiAgent ведёт из своей базы: по карточке на каждого агента, продукт и инструмент с адресом — с реальными логотипами проектов, а у агентов и приложений в углу карточки выводятся значки их дополнительных ссылок (вкладка «Ссылки»). Общие действия — не карточки, а строка кнопок-значков в правом верхнем углу: «Git» (пока на сервере запущен Forgejo), «Вход по QR-коду» (когда включён центральный вход) и всегда крайняя справа «Выйти»; «Выйти» завершает сессию центрального входа, выходит из всех агентов и продуктов (их токены удаляются) и из самой страницы. Кнопки в углу не считаются приложениями и в число карточек не входят. Вход по QR-коду и страница выхода описаны ниже. Панель обновляется сама при каждом изменении — развернули агента или инструмент, и его карточка появилась; вкладка предлагает и ручное применение. Язык надписей на странице выбирается во вкладке: английский или русский, по умолчанию — язык самого MultiAgent.

Подробнее — на странице Домашняя страница сервера.

Центральный вход (вкладка «Авторизация»)

Чтобы посетитель входил один раз и получал доступ к любому защищённому приложению сервера, на сервере можно установить центральный вход — это вкладка «Авторизация» (Authelia), расположенная сразу правее вкладки Nginx. Вход — это служба-контейнер {слаг}-auth (по умолчанию agents-auth) с фиксированным слагом auth и адресом портала /auth/; собственный порт не публикуется, поэтому сначала устанавливается Nginx. Логин — agents, пароль генерируется автоматически и виден на вкладке; установка никогда не трогает сертификат и порт HTTPS.

Когда центральный вход активен, агенты и продукты закрываются «за центральным входом» по умолчанию, а инструменты с веб-интерфейсом и свои маршруты — по вашему выбору (переключатель). Один вход на странице входа открывает все защищённые приложения сервера — повторные логины не нужны.

Защита работает только при защищённом соединении (HTTPS): либо локальный сертификат и порт HTTPS из вкладки Nginx, либо публичный адрес сервера (или шаблон адреса вида https://{база}/{слаг}), когда TLS снимает верхний обратный прокси (тогда свой сертификат не нужен). Иначе установленный вход остаётся неактивным. Обращение напрямую по адресу host:port (если порт открыт) в обход nginx не закрывается — у приложения сохраняется собственный вход. Служебные машинные пути /{слаг}/api/… и /{слаг}/svelteChatHub тоже остаются открытыми (у них своя авторизация по JWT или API-ключу). Приложения получают заголовки личности и секрет X-SSO-Token (сверяется с SSO_PROXY_TOKEN в окружении агента), поэтому подделать их извне нельзя.

Кнопка «Применить конфигурацию» на этой вкладке не только применяет настройки, но и завершает все открытые сессии: каждому браузеру придётся войти заново с текущим паролем. Файл манифеста (manifest.json) защищённого приложения остаётся доступен без входа — браузер запрашивает его отдельно от страницы, и без этого он показывал бы ошибку.

Слаг auth зарезервирован на каждом сервере — нельзя создать агента, инструмент или маршрут с таким именем. Forgejo подключается к центральному входу сам, как только вход установлен, защита работает и Forgejo запущен: на его странице входа появляется кнопка входа через центральный вход, а первый вход заводит аккаунт из личности центрального входа. Логин и пароль администратора Forgejo следуют за центральным входом — на вкладке Forgejo для этого есть кнопка «Синхронизировать авторизацию». Если условия пропадают, кнопка входа исчезает сама. Удаление центрального входа открывает защищённые маршруты, а его данные и секреты сохраняются — повторная установка их переиспользует. Подробнее о маршрутах и защите — в разделе Nginx-роутинг.

Шаблон URL агентов

Куда ведут публичные ссылки на приложения сервера, решается по порядку. Сначала — поле «Публичный адрес» на вкладке «Общее»: если оно заполнено, все ссылки строятся от него, а реальный адрес сервера (вкладка «Подключение») остаётся служебным — по нему MultiAgent ходит по SSH и в тоннели. Это случай, когда публичный домен и сама машина — разные: например, сервер стоит в закрытой сети, а снаружи его открывает обратный прокси.

Если публичный адрес пуст, публичной базой становится база шаблона адреса агентов вида {база}/{slug} — как раньше. Если и шаблон не задан, ссылки строятся от адреса сервера: http(s)://{хост}[:{порт nginx}]/{слаг}/. Зачем тогда отдельное поле? Шаблон с плейсхолдерами {slug}, {host} и {port} в первую очередь говорит, как MultiAgent сам обращается к API агентов этого сервера. Если задать публичный домен в шаблоне, этим же путём пойдёт и служебный трафик управления — через внешний прокси и обратно; отдельное поле разводит эти две задачи. Прямой доступ http(s)://{хост}[:{порт}] остаётся запасным путём. Изменение публичного адреса, шаблона или имени сервера сразу пересобирает маршруты nginx и синхронизирует с новым адресом конфигурацию центрального входа.

https://apps.example.com/{slug}

Файлы

У каждого сервера есть встроенный доступ к файлам (пункт «Файлы» в боковой панели): просмотр дерева каталогов, чтение и редактирование файлов, загрузка и скачивание, переименование на месте, подсчёт размера и токенов текстовых файлов. Это позволяет поправить конфиг или посмотреть логи на сервере, не покидая MultiAgent.

Отдельная страница «Файлы» показывает две панели — каждая со своим сервером и своей папкой. Отметьте файлы и папки галочками в левой панели и нажмите «Копировать» — они перенесутся в папку правой панели. Панели могут смотреть на один сервер или на два разных: MultiAgent сам передаст файлы между серверами по своим сохранённым доступам, ничего настраивать между серверами не нужно. Перенос идёт в фоне, процент выполнения виден прямо в кнопке, а процесс можно отменить; одноимённые файлы заменяются, папки при совпадении имён объединяются. Пока копирование идёт, правая панель сама обновляется, так что прибывающие файлы видно на месте.

Рядом — кнопка «Терминал»: она открывает командную строку в папке, где вы сейчас находитесь. Команды выполняются на сервере, вывод идёт на экран построчно, история команд и прерывание работают привычно. Это удобно, чтобы быстро посмотреть состояние сервиса или разобраться с правами на файлы.

Передача сервера клиенту

Если сервер принадлежит клиенту, управление можно передать ему: на сервере разворачивается его собственный MultiAgent, и записи переезжают к нему — агенты, приложения, инструменты, маршруты и ключи доступа. Передача — разовая операция: она запускается со вкладки «Передача» на странице сервера, а предпросмотр заранее показывает, что переедет и что останется у вас. Запущенные приложения при этом не трогаются: ничего не останавливается и не переустанавливается.

После передачи маршрутизацией управляет экземпляр клиента, а у вас остаётся сам сервер: доступ по SSH, проверки, папки и очистка Docker. Заглянуть в экземпляр клиента можно кнопкой «Управление» в шапке страницы — вход выполняется сам, без пароля. Подробнее — на странице Передача сервера.

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