---
title: "Серверы"
id: "1305"
type: "page"
slug: "servers"
published_at: "2026-08-15T21:48:48+00:00"
modified_at: "2026-10-04T10:26:43+00:00"
url: "https://pastukhov.com/agents/multiagent/docs/servers"
markdown_url: "https://pastukhov.com/agents/multiagent/docs/servers.md"
excerpt: "Сервер — управляемая Linux-машина, на которой MultiAgent разворачивает агентов и инструменты. Всё управление идёт по…"
---

# Серверы

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

Сервер — управляемая Linux-машина, на которой MultiAgent разворачивает [агентов](/agents/agent)
 и инструменты. Всё управление идёт по 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 ведёт сам, по закрытому каналу к серверу, поэтому закрытые порты не мешают ни чатам, ни проверкам.

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

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

## Общий Postgres

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

## Git-сервер Forgejo

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

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

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.

Подробнее — на странице [Домашняя страница сервера](/agents/multiagent/docs/heimdall)
.

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

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