MultiAgent хранит чувствительные данные всей инфраструктуры: SSH-ключи серверов, пароли агентов, токены реестров и API-ключи. Эта страница — о том, как всё это защищено, как настроено резервное копирование и как устроены лицензии.
Шифрование секретов
Все секреты шифруются на хранении симметричным шифрованием AES-256-GCM. 32-байтный ключ лежит в /data/keys/management-secret.key — внутри volume MultiAgent, вне базы данных. Что защищено:
- SSH-пароли и приватные ключи серверов (включая учётные данные proxy jump);
- пароли Postgres и Forgejo на фабриках;
- токены реестров образов (Registry Auth);
- пароли менеджеров агентов и переменные-секреты моделей и инструментов;
- ключи программного интерфейса и пароли служб фабрики (Postgres, Forgejo, центральный вход, резервное копирование).
Подключение к машине — адрес, порт, логин, пароль или ключ, промежуточный хост — хранится на записи сервера, а не на каждой фабрике: несколько фабрик на одной машине пользуются одним подключением. Поправили адрес или пароль — это сразу действует на все фабрики этой машины. Секреты только записываются: ответы содержат лишь пометку «задан» или «не задан», а сам пароль или ключ обратно не выдаётся.
Проверка входа пользователей — JWT-токены со сроком 90 дней, подписанные отдельным ключом из /data/keys. Все действия API требуют проверки ключа; анонимна только страница входа, а программный интерфейс /api/agent/* открывается отдельным ключом X-API-Key.
Agent API — программный интерфейс
Программный интерфейс /api/agent/* предназначен для автоматических вызовов — например, из агентов и внешних систем. Каждый запрос проверяется заголовком X-API-Key: в переменной окружения MULTIAGENT_HASH хранится только «отпечаток» ключа (SHA-256), а сам ключ задаётся один раз при установке. Без переменной интерфейс отвечает 503 и не работает вовсе.
Особенности безопасности: GET /api/agent возвращает каталог всех операций с описаниями; секреты можно только записать — назад они не выдаются, только приметы «есть значение»; удалённого выполнения кода нет — только заранее определённые операции; долгие операции запускаются по схеме «запустил — проверяй» по адресу operations/{id}. Подробнее — Agent API.
Публичность портов
Агенты, приложения и инструменты по умолчанию не видны из интернета: их порты публикуются только на самом сервере (на адресе 127.0.0.1) и доступны его приложениям и nginx. Наружу порт открывается по желанию — переключателем «Публичный порт» у нужной привязки. Он есть и в мастере создания, и позже на вкладке «Порты» у агента или приложения: у каждой привязки свой переключатель, а новые строки появляются закрытыми. Изменение вступает в силу при следующем пересоздании, а смена основного порта сразу обновляет маршрут. Так фабрики на одной машине не видят друг друга: чужой контейнер до закрытого порта не достучится.
Публичными всегда остаются только сам nginx (входная дверь) и служба резервного копирования — они и должны быть доступны снаружи. Всё остальное закрыто, а управление закрытыми портами идёт через защищённый туннель, поэтому закрытый порт не мешает MultiAgent проверять состояние агента и управлять им.
Резервное копирование
На каждой фабрике MultiAgent поднимает службу резервного копирования — rsync с семью разделами, доступными только на чтение: папки docker, домашней страницы, данных, проектов и инструментов, а также две папки дампов (Postgres и Forgejo). Ваши машины-бэкаперы забирают данные по расписанию — типичной ночной задачей:
# nightly backup of all server data
rsync -avz rsync://backup@server-host:873/data/ /backups/server-host/data/
rsync -avz rsync://backup@server-host:873/projects/ /backups/server-host/projects/
Сам MultiAgent бэкапится вместе с volume /data: база, ключи шифрования и лицензия лежат там же. Подробнее о структуре данных — в документации.
Проверка «Проверить связь» смотрит на всё сразу: запущен ли контейнер, отдаёт ли он все семь модулей (чего не хватает — названо), совпадает ли опубликованный порт с сохранённым и принимает ли порт подключение снаружи. Всё найденное перечисляется одним списком — так «зелёная» проверка не скроет порт, до которого снаружи не достучаться. Рядом стоит кнопка «Переустановить rsync»: она заново разворачивает приём копий и публикует сохранённый порт, если развёртывание устарело.
Готовые клиенты выдаёт и страница «Резервное копирование» в разделе «Активы»: она собирает такой же клиент сразу на все фабрики выбранного в шапке флота — каждая попадает в свою папку, а фабрику без адреса сервера страница называет пропущенной. Подробнее о трёх клиентах — на странице Фабрики.
Лицензии агентов
Раздел «Лицензии» — центральное хранилище лицензионных ключей Pastukhov Agent. Ключ проверяется при добавлении, шифруется на хранении и никогда не возвращается из API — интерфейс показывает только распарсенные метаданные (тип, владелец, срок, покрытые продукты) и никогда сам ключ. На странице лицензий и в диалоге деталей показывается поле «Продукты»: перечень продуктов из ключа, а у универсального ключа — «Универсальная». Ключ, подписанный верно, но не покрывающий нужный продукт, выдаёт ошибку покрытия вместо срока действия — статус говорит, что именно не так. Один ключ назначается любому числу агентов и автоматически попадает в их переменную AGENT_LICENSE при развёртывании. Лицензия, назначенная хотя бы одному агенту или выбранная лицензией по умолчанию на фабрике, не удалится, пока её не отсоединить.
Ключ можно не только вставить, но и выпустить прямо в интерфейсе: если на узле лежит закрытый ключ подписи, в диалоге лицензии появляется пункт «Сгенерировать лицензию». В нём заполняются тип, кому выдана, email, описание и срок; готовый ключ сразу уходит в зашифрованное хранилище и становится лицензией фабрики по умолчанию — наружу сам ключ не показывается, как и у вставленного. Без ключа подписи на узле этот пункт не появляется, и ничего не меняется.
Видно и куда лицензия выдана: в диалоге её деталей перечислены фабрики и агенты, которые её используют, — по именам и со ссылками, а не только числом. Так можно отсоединить лицензию перед удалением, не обходя вручную все фабрики. Лицензия выбирается на вкладке «Общее» фабрики — она становится лицензией по умолчанию для всех новых агентов на ней.
У лицензии есть действие «Продлить», и оно открывается из того же диалога, что и список назначений, — отдельного окна для продления нет. Указывается срок в днях (по умолчанию 31) и дата окончания: поля связаны, изменили одно — пересчиталось другое. Ключ пересобирается с новой датой, а его владелец, тип, покрытые продукты и все назначения остаются прежними: выпускать новый ключ и заново назначать его агентам не нужно. Переименование и перевыпуск остались на шаг глубже — отдельной кнопкой внутри диалога.
Продлевать вручную не обязательно: у каждой лицензии со сроком есть переключатель «Автопродление», и у новой лицензии он сразу включён (у тех, что заведены раньше, читается как включённый). Пока он включён, проверка раз в шесть часов смотрит на срок: как только до конца остаётся меньше интервала проверки — или срок уже прошёл, — ключ пересобирается ещё на 31 день. Истёкшая лицензия считается от сегодняшнего дня, а не уходит в прошлое. В самом ключе не меняется ничего, кроме даты: владелец, тип, продукты и назначения остаются на месте, а сам ключ нигде не показывается.
После продления все агенты и приложения, которые держат эту лицензию — напрямую или как лицензию фабрики по умолчанию, — получают обычное плавное обновление: занятый чатом агент дождётся тишины, свободный пересоздастся сразу, а уже остановленный получит новый ключ при следующем запуске. Действующий чат не прерывается никогда. Переключатель есть у каждой лицензии со сроком — на её строке в списке, в форме добавления и в диалоге свойств; ручное продление его не сбрасывает. У бессрочной лицензии даты окончания нет, поэтому и переключателя на ней нет.
Лицензирование MultiAgent
Сам MultiAgent распространяется с 30-дневным пробным периодом, уже включённым в продукт. Лицензия — самодостаточная подписанная строка: загружается через переменную AGENT_LICENSE (ту же, что читают все продукты семейства) или файлом активации в папке данных и проверяется офлайн по встроенному ключу. Универсальный ключ (без списка продуктов) покрывает все продукты; действующая лицензия блокирует только создание новых сущностей и отправку сообщений. Лицензия входит в подписку «Фабрика агентов».
Статус лицензии подгружается сразу после входа: строка лицензии в интерфейсе показывает состояние, как только вы вошли, — в том числе при первом открытии панели в новом браузере, где вход происходит уже после загрузки страницы. Обновлять страницу вручную не нужно.
Язык интерфейса и часовой пояс
Язык интерфейса выбирает сам пользователь в окне «Внешний вид»: английский или русский. Русский — только значение по умолчанию русской сборки; на английской сборке интерфейс открывается на английском, но каждый может переключить его себе, и выбор сохраняется за учётной записью. Даты и числа при этом остаются в формате сборки.
Там же, под языком, выбирается часовой пояс — один на всю систему. Все даты, графики и отчёты показываются в нём, чтобы время в панели совпадало с вашим. На хранении всё остаётся по всемирному времени, поэтому смена пояса ничего не сдвигает и не портит данные — меняется только то, как они показываются.
Сеансы входа
Вход в панель запоминается на 90 дней — речь о входе в саму панель управления, а не в агентов. За это время ничего подтверждать заново не нужно: обычное обновление профиля сеанс не обрывает. Устройства, которые уже вошли, продолжают работать и тогда, когда ссылка для входа отозвана: отзыв закрывает вход новым, но уже вошедших не выкидывает. Если же нужно вывести всех сразу, на вкладке «Авторизация» есть кнопка «Применить конфигурацию» — она завершает все сеансы центрального входа, и войти заново придётся с текущим паролем.