Перейти к содержимому

Keeper

Центральный сервер Soul Stack. Stateless-кластер поверх общих PostgreSQL и Redis; масштабируется горизонтально — добавление инстанса не требует репликации состояния между ними.

  • Хранит реестры — управляемых хостов (souls), операторов (operators), каталог сервисов. Авторитетное состояние живёт в PostgreSQL.
  • Рендерит Destiny на своей стороне. Шаблонизация (CEL для YAML-выражений + Go text/template для файлов) выполняется на Keeper-е; агенту уходит уже отрендеренный набор задач. Агент не тянет шаблонизатор, vault-клиент и логику резолва — это упрощает и обезопасивает хост.
  • Диспетчит прогоны. Решает, какие задачи на каких хостах применить (таргетинг по covens и предикатам), доставляет их и собирает отчёты.
  • Ведёт RBAC и аудит. Каждый вызов Operator API проходит проверку прав оператора и пишется в аудит-журнал.
  • Фоновые подсистемы — например, очистка реестра от просроченных записей и согласование presence с фактом живых стримов.

Keeper поднимает несколько независимых listener-ов:

ПортListenerПротоколНазначение
8080Operator APIHTTP / OpenAPIпервичный интерфейс оператора, health-check /readyz, вьювер спеки /docs, встроенный web-UI /ui
8081MCPHTTPинтерфейс для MCP-клиентов (опциональный listener)
9090метрикиHTTPPrometheus scrape (/metrics)
9442gRPC bootstrapserver-only TLSонбординг агента (soul init): обмен токена + CSR на mTLS-идентичность
8443gRPC EventStreammTLSдолгоживущий bidi-стрим к агенту (soul run): доставка задач, отчёты

Агенты сами инициируют соединение к Keeper-у — на управляемых хостах входящие порты открывать не нужно.

Keeper-инстансы stateless: всё авторитетное состояние — в общей PostgreSQL, presence и координация — в общем Redis. Поэтому:

  • несколько инстансов Keeper работают за L4-балансировщиком (для probe достаточно TCP-проверки порта EventStream);
  • любой инстанс обслуживает любой запрос оператора и любой стрим агента;
  • горизонтальное масштабирование — это просто добавление инстансов на тот же PostgreSQL + Redis.

Каждый инстанс в кластере имеет собственный идентификатор (kid в конфиге), уникальный в пределах кластера.

Основной способ работы с Keeper-ом — Operator API (HTTP/OpenAPI) и MCP. CLI soulctl — тонкая обёртка над теми же эндпоинтами. Полную OpenAPI-спеку с поиском и кнопкой «Try It» Keeper отдаёт в браузере по GET /docs.

Дополнительно Keeper отдаёт встроенный операторский web-UI по GET /ui — он включён в исполняемый файл и доступен сразу после старта, без отдельного деплоя (на том же порту 8080). UI включён по умолчанию; его можно выключить тогглом в конфиге, не затрагивая Operator API. Это надстройка над тем же Operator API — всё, что делает UI, доступно и через CLI/MCP/OpenAPI.

Keeper ставится из пакета soul-stack-keeper, бинарного релиза или сборки. Bootstrap первого оператора — административная подкоманда keeper init. Полная процедура (провижининг Vault, TLS-материал, конфиг, запуск через systemd) — Установка из пакетов.