Фабрики

Фабрика — это место, где собираются и работают ваши агенты: у неё своё имя развёртывания (слаг), общая сеть контейнеров, папки, база Postgres, Git-сервер, веб-сервер Nginx с маршрутами, домашняя страница, вход и резервные копии. Сама фабрика разворачивается на машине — сервере: её подключение настраивается отдельно и может обслуживать сразу несколько фабрик. Поэтому на одной машине спокойно живут несколько независимых фабрик — их сети, папки и службы не пересекаются.

Добавление фабрики

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

Слаг — короткое имя (по умолчанию agents), которое отделяет эту фабрику от других на той же машине. Из него собирается всё развёртывание: имя docker-сети ({слаг}), приставка имён контейнеров ({слаг}-…, например agents-nginx) и корни папок (/root/{слаг}/…). Двум фабрикам на одной машине нельзя дать один и тот же слаг — сохранение отклоняется с подсказкой. Слаг меняется на вкладке «Общее» и действует только на новые развёртывания: запущенные контейнеры сохраняют прежние имена, и ничего на диске не переезжает.

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

Карточка фабрики

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

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

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

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

Вкладка «Общее»

Вкладка «Общее» — паспорт фабрики: здесь задаётся всё, по чему MultiAgent строит её развёртывание и публичные ссылки.

  • Имя — как фабрика называется в интерфейсе;
  • Значок — по умолчанию у фабрики собственный знак MultiAgent (флажок на подставке в фирменном градиенте). Свой значок выбирают кликом по аватару в шапке или кнопкой на этой вкладке: открывается общая галерея значков с поиском, в ней же строка «Стандартный значок» — она возвращает знак MultiAgent. Выбранный значок рисуется фирменным градиентом везде: в дереве навигации, в списке фабрик, в шапке и на домашней странице;
  • Слаг — то же поле, что задаётся при создании: оно определяет сеть, приставку имён контейнеров и папки;
  • Сервер — на какой машине живёт фабрика. Смена сервера переносит подключение: все операции и ссылки переключаются на новую машину;
  • Бренд — по нему выбираются образы агентов и язык домашней страницы. Уже развёрнутые агенты сохраняют свой образ;
  • Публичный адрес и шаблон адреса агентов — как строятся публичные ссылки фабрики (подробнее — в разделе «Шаблон URL агентов»);
  • Лицензия — какую лицензию получают агенты этой фабрики: выбранная лицензия автоматически назначается каждому агенту и приложению, развёрнутым или пересозданным здесь. В том же списке можно оставить «Нет» или выпустить новую лицензию;
  • Флот — в шапке карточки рядом с именем видны чипы флотов, в которые фабрика входит, и кнопка «+ Флот» с отметками для быстрого выбора. Отметка этой фабрики в диалоге флота вносит в него всех её агентов — и тех, что появятся позже. Снятие отметки выводит тех, кто попал туда через фабрику, а лично добавленные агенты остаются: у флота две отдельные записи — фабрики и агенты.

Меню строки фабрики

Правый клик по строке фабрики в дереве навигации (или кнопка с тремя точками) открывает меню действий. Кроме «Открыть» и «Добавить агента», там есть:

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

У корневой строки «Фабрики» в меню те же два пересоздания и два обновления, «Добавить фабрику» и «Вставить фабрику». Пересоздания и обновления проходят по всем фабрикам, которые видны в дереве: если в шапке выбран флот, работа идёт только по его агентам.

Копирование и вставка фабрики

«Скопировать фабрику» и «Вставить фабрику» — самый быстрый способ собрать такую же фабрику на другой машине или у другого клиента. Копируется вся фабрика целиком: её поля, папки, шаблоны compose, порты Nginx, общие переменные, карточки Postgres, Forgejo, резервного копирования и входа, а также все её агенты и приложения. Пароли и ключи попадают в копию в открытом виде — храните буфер обмена так же бережно, как пароли.

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

Onboarding-проверки

Кнопка «Проверить и исправить» на странице фабрики открывает карточку-чек-лист: каждая проверка — отдельная строка с зелёной галочкой (готово), жёлтым предупреждением, красным крестом (ошибка) или серой пометкой «пропущено», а внизу — итог «Все проверки пройдены» либо «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 (домен берётся из адреса машины, если это домен, а не IP, иначе — из имени фабрики, если оно похоже на домен; если ни то ни другое не подходит — совет сделать самоподписанный); истекающий в течение 30 дней или истёкший — предупреждение без действия, достаточно обновить на вкладке Nginx; пока не задан порт HTTPS, сертификаты сохранены, но не раздаются;
  • Центральный вход — обязательная служба: не установлен → предупреждение со ссылкой установки; установлен, но не запущен → предупреждение и переразвёртывание;
  • Forgejo — внешний экземпляр (адрес не нашего вида) проверяется по учётным данным и установку не предлагает; для собственной установки адрес выводится сам — публичная подпапка /forgejo/; пустая карточка заполняется автоматически (логин agents, автосоздание репозиториев, пароль генерируется); поле «Компания» задаёт организацию, в которой создаются и из которой видны репозитории агентов;
  • Сервис резервных копий — проверка пройдена, только когда контейнер запущен и отдаёт все семь модулей.
  • Postgres — установленный, но остановленный экземпляр — это предупреждение с кнопкой запуска (а не «не установлен»); после запуска проверка сама убедится, что сохранённые учётные данные подходят.

Установка Docker

Если Docker на машине отсутствует, MultiAgent установит его сам — одной кнопкой, с потоковым выводом команд в интерфейс. В выводе видны все строки команды целиком, вместе с ошибками: если на машине нет curl, установщик скачает скрипт через wget, а неудачная установка закончится настоящей причиной и кодом возврата установщика, а не сообщением «docker: команда не найдена». Там же можно отредактировать /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 ведёт сам, по закрытому каналу к машине, поэтому закрытые порты не мешают ни чатам, ни проверкам.

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

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

Переменные, которые задаёт сам агент

Тот же общий список умеет менять сам агент — прямо из чата. В его интерфейсе есть окно «Контейнер» с кнопкой «Глобальные переменные»: впишите ключ и значение (или попросите агента это сделать), нажмите «Сохранить и перезапустить» — и через полминуты переменная работает у всех агентов и приложений фабрики. Заходить в MultiAgent, править конфигурацию или лезть на сервер по SSH не нужно.

  • Агент не правит себя сам — он только оставляет заявку в своей папке global, а MultiAgent её забирает и применяет. Поэтому одно окно в чате не даёт агенту прав на всю инфраструктуру;
  • Слияние по ключу — общий список не затирается: новые ключи добавляются, совпадающие заменяются, а строка с пустым значением удаляет ключ;
  • Значения подставляются как есть — без раскрытия $ПЕРЕМЕННЫХ и без снятия кавычек;
  • Своё важнее общего — переменная конкретного агента или приложения не перебивается фабричной;
  • Изменение пересоздаёт агентов и приложения фабрики — короткий простой, поэтому лучше сразу вписать всё нужное. Повторная запись того же значения ничего не делает;
  • Если фабрика не управляется извне, окно честно предупредит: «Это развертывание не управляется извне — записанные здесь запросы никто не заберет».

Зачем это: ключ нового сервиса добавляется один раз и сразу становится общим — не нужно обходить десятки агентов вручную и помнить, где какой ключ прописан.

Общий Postgres

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

Git-сервер Forgejo

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

С центральным входом Forgejo связывается сам: отдельного переключателя нет. Как только вход установлен, защита работает и Forgejo запущен, на его странице входа появляется кнопка входа через центральный вход, а логин и пароль администратора следуют за учётными данными центрального входа — на вкладке Forgejo для этого есть кнопка «Синхронизировать авторизацию». Поэтому поля логина и пароля на этой вкладке только для чтения: они правятся на вкладке «Авторизация». На русском бренде интерфейс Forgejo отдаётся по-русски, на английском — по-английски.

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

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 (внутри уже лежит сам rsync) и файл для Docker-хоста: его достаточно положить в пустую папку и выполнить docker compose up -d — дальше копии снимаются сами, при старте и потом каждый день по встроенному расписанию, а журнал пишется рядом с копиями. Во всех трёх адрес, порт, пользователь и пароль уже вписаны, а файлы загрузок называются по имени фабрики: backup-имя.zip, backup-имя.sh и backup-имя.yml — поэтому копии нескольких фабрик на одной машине не путаются между собой.

Если фабрик несколько, идти по каждой не нужно: страница «Резервное копирование» в разделе «Активы» выдаёт такой же клиент сразу на всю область флота, выбранную в шапке. Один запуск обходит все фабрики области и складывает каждую в свою папку (~/backups/имя, c:\backup\agents\имя или ./backups/имя), а фабрику без адреса сервера страница честно называет пропущенной.

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

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, factories, servers, management, data и другие) зарезервированы;
  • Внутренняя сеть контейнеров — приложения адресуются по именам контейнеров в общей docker-сети; упавший сервис отдаёт 502 только на своей подпапке, остальные маршруты работают.

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

Домашняя страница фабрики

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

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

Надписи на странице идут на языке бренда фабрики: на русском бренде страница отдаётся по-русски, на английском — по-английски. Отдельного выбора языка на вкладке больше нет — язык следует за брендом, а вместе с ним меняются заголовок, кнопки и ссылка на сайт внизу страницы.

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

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

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

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

Защита работает только при защищённом соединении (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. Заглянуть в экземпляр клиента можно кнопкой «Управление» в шапке страницы — вход выполняется сам, без пароля. Подробнее — на странице Передача фабрики.

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