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

Компоненты

Soul Stack — это четыре исполняемых файла с разными ролями: два демона (Keeper и Soul) и два инструмента оператора (soulctl и soul-lint).

КомпонентРоль
KeeperЦентральный сервер: реестры, рендер и доставка Destiny, RBAC, аудит. Stateless-кластер на общих PostgreSQL + Redis. Отдаёт встроенный операторский web-UI на /ui.
SoulАгент на управляемом хосте: применяет Destiny, режимы pull (демон) и push (oneshot по SSH).
soulctlКлиентский CLI оператора — тонкая обёртка над Operator API.
soul-lintОфлайн-линтер Destiny / сценариев / сервисов / манифестов плагинов.

В центре — Keeper: один или несколько stateless-инстансов поверх общих PostgreSQL (холодное состояние) и Redis (presence, координация). Keeper держит реестры, рендерит Destiny и через долгоживущий gRPC-стрим поверх mTLS управляет душами.

На каждом управляемом хосте — Soul: агент, который сам инициирует соединение к Keeper-у (на хостах не нужно открывать входящие порты), получает отрендеренные задачи и применяет их через core-модули. Тот же исполняемый файл работает и в push-режиме (oneshot по SSH без постоянного демона).

Оператор работает через Operator API (HTTP/OpenAPI). Поверх него — soulctl: тонкий CLI для тех же эндпоинтов (регистрация хостов, запуск сценариев, просмотр инкарнаций), а также встроенный web-UI, который Keeper отдаёт на /ui из коробки (без отдельного деплоя). Перед применением конфигурации soul-lint статически валидирует Destiny, сценарии, сервисы и манифесты плагинов — на рабочей станции или в CI, ничего не исполняя.

flowchart TB
    Op["операторы<br/>soulctl · OpenAPI / MCP"] --> K
    K["Keeper<br/>Operator API · рендер · реестры<br/>RBAC · аудит · stateless-кластер"]
    K --> PG[("PostgreSQL — состояние")]
    K --> R[("Redis — presence, координация")]
    S1["Soul"] -->|"gRPC bidi-stream поверх mTLS<br/>соединение инициирует Soul"| K
    S2["Soul"] --> K
    S3["Soul"] --> K
    S4["Soul"] --> K
    SL["soul-lint — офлайн, рядом с оператором: валидирует артефакты до применения"]

Подробно про каждый компонент — по ссылкам в таблице выше.