---
title: "Фабрики"
id: "1305"
type: "page"
slug: "factories"
published_at: "2026-08-15T21:48:48+00:00"
modified_at: "2026-11-06T09:51:29+00:00"
url: "https://pastukhov.com/agents/multiagent/docs/factories/"
markdown_url: "https://pastukhov.com/agents/multiagent/docs/factories.md"
excerpt: "Фабрика — это место, где собираются и работают ваши агенты: у неё своё имя развёртывания…"
---

# Фабрики

[https://pastukhov.com/agents/multiagent/docs/factories/.md](https://pastukhov.com/agents/multiagent/docs/factories/.md)

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

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

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

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

Здесь же можно сразу назначить фабрике **флот** — это необязательно. Назначение добавляет в флот всех агентов и приложения фабрики, а созданные позже попадают туда сами. Подробнее — на странице [Менеджмент](/agents/multiagent/docs/management)
.

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

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

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

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

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

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

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

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

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

## Общий Postgres

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

## Git-сервер Forgejo

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

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

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

Подробнее — на странице [Домашняя страница фабрики](/agents/multiagent/docs/home-page)
.

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

Чтобы посетитель входил один раз и получал доступ к любому защищённому приложению фабрики, на ней можно установить **центральный вход** — это вкладка **«Авторизация»** (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-роутинг](/agents/multiagent/docs/routes)
.

## Шаблон 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. Заглянуть в экземпляр клиента можно кнопкой **«Управление»** в шапке страницы — вход выполняется сам, без пароля. Подробнее — на странице [Передача фабрики](/agents/multiagent/docs/handover)
.

[← Оглавление документации](/agents/multiagent/docs)
