Состав поставки¶
Статья перечисляет компоненты платформы Taimen, показывает, как они
раскладываются по профилям корневого compose.yml, и фиксирует статус каждого
профиля: что входит в набор по умолчанию, что экспериментально, что заморожено.
Она нужна при планировании стенда и при выборе, какие профили включать.
Устройство репозитория¶
Платформа собирается в суперпроекте — репозитории-зонтике, к которому компоненты подключены git-сабмодулями плоско в корне:
<суперпроект>/
├── control-plane/ # сабмодуль
├── iam-service/ # сабмодуль
├── memory-service/ # сабмодуль
├── platform-auth-sdk/ # сабмодуль (библиотека)
├── skill-sdk/ # сабмодуль (библиотека)
├── platform-llm/ # сабмодуль (библиотека)
├── policy-service/ # сабмодуль (experimental)
├── entitlement-service/ # сабмодуль (заморожен)
├── platform-core/ # сабмодуль (заморожен)
├── platform-web/ # сабмодуль (заморожен)
├── compose.yml .env.example Makefile
├── deploy/ # bootstrap.py, Caddyfile, конфигурация стендов и runner-хоста
├── packages/ # пакеты каталога Control Plane (YAML)
├── integrations/ # коннекторы и скиллы (запускаются агентами fleet)
├── demos/ # демо, не входят в поставку компонентов
├── tools/ # smoke, fill_secrets, cp_packages, …
└── docs/ # архитектура и ADR
Плоская раскладка обязательна
control-plane, memory-service и другие сервисы подключают
platform-auth-sdk path-зависимостью соседней папкой
(../platform-auth-sdk), поэтому их образы собираются с контекстом — корнем
суперпроекта. Переносить сабмодули в подкаталоги нельзя: сборка сломается.
Изменение в компоненте коммитится в его репозитории, а указатель сабмодуля в
суперпроекте обновляется отдельным коммитом. make submodules поднимает
сабмодули на закреплённых ревизиях, make status показывает указатели.
Компоненты¶
Сервисы ядра¶
| Компонент | Что делает | Процессы в compose | Хранилище |
|---|---|---|---|
| control-plane | Авторитетное операционное состояние: задачи, типы, claims, runs, approvals, артефакты, цели, журнал событий, харнесс-протокол; CLI control-plane, MCP-сервер control-plane-mcp, демон исполнителя control-plane-agent |
control-plane-api, control-plane-worker, context-adapter (один образ) |
PostgreSQL 16 (control-plane-db) |
| iam-service | Tenants, principals, audiences, PAT, service accounts, федерация внешних IdP, SCIM, выпуск RS256-токенов, JWKS | iam-service |
PostgreSQL 16 (iam-db) |
| memory-service | Граф знаний с временными фактами и provenance, документы, гибридный поиск (векторный + лексический + графовый), Context Compiler; HTTP API, MCP-сервер, CLI | memory-service |
PostgreSQL 16 с Apache AGE и pgvector (memory-db, свой образ) |
Библиотеки¶
| Компонент | Назначение |
|---|---|
| platform-auth-sdk | Общий Policy Enforcement Point: проверка токенов IAM по JWKS, trusted auth context, отзыв, проверки entitlement и policy, единый контракт отказа, аудит. Используют все resource services |
| skill-sdk | Скилл пишется один раз в коде; SDK даёт контракт, контекст вызова, хостинг по протоколам local, http, mcp и экспорт YAML в пакет каталога |
| platform-llm | Общий LLM-клиент: любой OpenAI-совместимый /chat/completions, ответы по JSON-схеме, ретраи и переключение моделей |
| control-plane-client | Клиент Control Plane (дистрибутив в control-plane/client): обмен PAT на токен, ретраи, типизированные вызовы. См. Клиенты сервисов |
Периферия¶
| Компонент | Что делает | Статус |
|---|---|---|
| policy-service | Policy Decision Point над OpenFGA: роли, bindings, делегации, решения check/list_objects, проекция журналов Control Plane и IAM |
experimental |
| entitlement-service | Лицензирование: продукты, фичи, планы, гранты, места, квоты с reserve → consume/release |
заморожен |
platform-core (platform-api) |
Шлюз для панели: tenants/organizations/users, документы в S3/MinIO, feature flags, federation в IAM | заморожен |
| platform-web | Веб-консоль (Next.js): модуль Control Plane, вход через Keycloak | заморожен |
| human-harness | Рабочая поверхность человека — набор плагинов к DeepSeek Harness (отдельный репозиторий, в compose не входит) | развивается, см. Human Harness |
Что значит «заморожен» и «experimental»
Заморожен — компонент работает и получает исправления ошибок и безопасности, но новых функций в нём не делается. Experimental — поставляется опциональным профилем, в набор по умолчанию не входит, его дальнейшая судьба не решена; не стройте на нём критичные процессы. Обоснование — TAI-ADR-0034, TAI-ADR-0039, TAI-ADR-0040.
Профили compose¶
Корневой compose.yml — один файл, одна сеть (${TAIMEN_NETWORK}), одинаковые
DNS-имена сервисов локально и на промышленном стенде. Набор сервисов выбирается
профилями.
flowchart LR
subgraph default["по умолчанию: make up"]
core[core]
edge[edge]
end
subgraph opt["опционально"]
platform[platform<br/>заморожен]
entitlement[entitlement<br/>заморожен]
policy[policy<br/>experimental]
demo[demo]
end
core --> edge
platform -.-> core
policy -.-> core
demo -.-> core
| Профиль | Сервисы | Статус | Когда включать |
|---|---|---|---|
core |
iam-db, iam-service, control-plane-db, control-plane-api, control-plane-worker, context-adapter, memory-db, memory-service |
стабильное ядро | всегда |
edge |
caddy |
стабильный | всегда, кроме случаев, когда периметр обеспечен иначе |
platform |
platform-db, platform-redis, realm-render, keycloak, minio, minio-bootstrap, platform-migrations, platform-api, platform-web |
заморожен | нужна веб-консоль и вход людей через Keycloak |
entitlement |
entitlement-db, entitlement-service |
заморожен | нужно лицензирование; включается вместе с CP_ENTITLEMENT_ENABLED=true |
policy |
policy-db, openfga-migrate, openfga, policy-service, policy-worker |
experimental | проверка ReBAC-авторизации (CP_AUTHZ_MODE=shadow или policy), видимость памяти по principal |
demo |
support-bot |
демо | демонстрация чат-бота первой линии на памяти и Control Plane |
fleet |
fleet-controller |
ядро агентов | агенты описываются видом Agent и запускаются на узлах fleet — кодовые исполнители и источник наблюдений git-connector (сдвиги веток, реестр ADR, прогоны CI); см. Узлы и fleet |
Команды:
make up # core edge (по умолчанию)
make up PROFILES="core platform edge" # с панелью платформы
make up PROFILES="core policy edge" # с PDP
docker compose --profile core --profile edge up -d # то же без make
make down останавливает все профили (--profile "*"), данные в volumes
сохраняются.
Интерполяция идёт по всему файлу
Docker Compose подставляет переменные во весь compose.yml, а не только
в сервисы включённых профилей. Поэтому обязательными (${VAR:?…})
объявлены только значения, которые генерирует make secrets.
Идентификаторы опциональных профилей (IAM_TENANT_ID,
SUPPORT_BOT_PAT, SUPPORT_WORKSPACE_ID) по
умолчанию пусты и проверяются сервисами своих профилей, так что make up
для core edge работает на чистом .env — см.
Установку и первый запуск.
Образы и сборка¶
| Образ | Контекст сборки | Dockerfile |
|---|---|---|
${IMAGE_PREFIX}/control-plane |
корень суперпроекта (CP_BUILD_CONTEXT) |
control-plane/Dockerfile |
${IMAGE_PREFIX}/iam-service |
./iam-service (IAM_BUILD_CONTEXT) |
iam-service/Dockerfile |
${IMAGE_PREFIX}/memory-service |
корень (MEMORY_BUILD_CONTEXT) |
memory-service/Dockerfile |
${IMAGE_PREFIX}/memory-db |
memory-service/infra/memory-db |
PostgreSQL + AGE + pgvector |
${IMAGE_PREFIX}/policy-service |
корень | policy-service/Dockerfile |
${IMAGE_PREFIX}/entitlement-service |
корень | entitlement-service/Dockerfile |
${IMAGE_PREFIX}/platform-api, platform-migrations |
./platform-core |
apps/api/Dockerfile, workers/migrations/Dockerfile |
${IMAGE_PREFIX}/platform-web |
./platform-web |
Dockerfile (с build-args NEXT_PUBLIC_*) |
IMAGE_PREFIX по умолчанию taimen, IMAGE_TAG — local. Контейнеры сервисов
на Python работают под непривилегированным пользователем (у Control Plane и IAM
— uid 10001), поэтому файлы секретов, которые монтируются в контейнер, на
Linux должны принадлежать этому uid.
Volumes¶
Имена volumes задаются явно, чтобы промышленный стенд мог указать уже
существующие: VOLUME_CONTROL_PLANE_DB, VOLUME_IAM_DB, VOLUME_MEMORY_DB,
VOLUME_PLATFORM_DB и т.д. По умолчанию имя — ${COMPOSE_PROJECT_NAME}_<volume>,
например taimen_control_plane_db. Список — в
Переменных окружения, резервное копирование — в
Резервном копировании.
Что не входит в compose¶
- Runner (
control-plane-agent) — демон автономного исполнителя ставится на отдельный хост как systemd-юниты. См. Агенты и runner. - MCP-сервер и CLI Control Plane — ставятся на машину оператора
(
uv tool install). См. CLI и MCP-сервер. - Human Harness — ставится у человека поверх DeepSeek Harness.
- LLM-провайдер — внешний OpenAI-совместимый endpoint; память может работать без него на офлайн-заглушках.