Состав поставки¶
Статья перечисляет компоненты платформы Taimen, показывает, как они
раскладываются по профилям deploy/local/compose.yml, и фиксирует статус каждого
профиля: что входит в набор по умолчанию, что экспериментально, что заморожено.
Она нужна при планировании стенда и при выборе, какие профили включать.
Устройство репозитория¶
Платформа собирается в суперпроекте — репозитории-зонтике, к которому
компоненты подключены git-сабмодулями: сервисы — в services/, библиотеки — в sdk/:
<суперпроект>/
├── services/
│ ├── control-plane/ # сабмодуль
│ ├── iam-service/ # сабмодуль
│ ├── memory-service/ # сабмодуль
│ └── notification-service/ # сабмодуль (профиль notify)
├── sdk/
│ ├── platform-auth-sdk/ # сабмодуль (библиотека)
│ ├── skill-sdk/ # сабмодуль (библиотека)
│ ├── platform-llm/ # сабмодуль (библиотека)
│ └── package-sdk/ # сабмодуль (инструменты автора пакетов)
├── deploy/
│ ├── local/compose.yml # единое описание сервисов, запуск из корня
│ └── bootstrap.py, caddy/ # инициализация, Caddyfile
├── .env.example Makefile
├── tools/ # compose (обёртка), smoke, fill_secrets, docs_gen, …
└── docs/ # архитектура и ADR
Раскладка services/, sdk/ обязательна
control-plane, memory-service и другие сервисы подключают
platform-auth-sdk path-зависимостью ../../sdk/platform-auth-sdk,
поэтому их образы собираются с контекстом — корнем суперпроекта. Переносить
сабмодули в другие каталоги нельзя: сборка сломается. Compose запускается из
корня — целями make или обёрткой tools/compose.
Изменение в компоненте коммитится в его репозитории, а указатель сабмодуля в
суперпроекте обновляется отдельным коммитом. 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) |
| console | Веб-консоль работающей организации: пульс, происхождение работы, процессы, правила, агенты, управляющие действия, пакеты, люди и роли. Сабмодуль console, своей базы нет; см. Консоль |
console |
нет (сессии в памяти) |
| memory-service | Граф знаний с временными фактами и provenance, документы, гибридный поиск (векторный + лексический + графовый), Context Compiler; HTTP API, MCP-сервер, CLI | memory-service |
PostgreSQL 16 с pgvector и pg_trgm, граф — обычные таблицы (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-схеме, ретраи и переключение моделей |
| package-sdk | Инструменты автора пакетов каталога: CLI package-sdk (check, test, lock, plan, apply), схемы формата, среда наблюдателя package_sdk.connector и плагин Claude Code package-author. См. Пакеты |
| control-plane-client | Клиент Control Plane (дистрибутив в services/control-plane/client): обмен PAT на токен, ретраи, типизированные вызовы. См. Клиенты сервисов |
Периферия¶
| Компонент | Что делает | Статус |
|---|---|---|
| notification-service | Уведомления людей по правилам: читает журнал событий Control Plane и доставляет сообщения в каналы (Telegram) | опционально, профиль notify |
Профили compose¶
Корневой deploy/local/compose.yml — один файл, одна сеть (${TAIMEN_NETWORK}), одинаковые
DNS-имена сервисов локально и на промышленном стенде. Набор сервисов выбирается
профилями.
flowchart LR
subgraph default["по умолчанию: make up"]
core[core]
edge[edge]
end
subgraph opt["опционально"]
notify[notify]
idp[idp]
console[console]
harness[harness]
fleet[fleet]
end
core --> edge
notify -.-> core
console -.-> idp
harness -.-> idp
idp -.-> core
fleet -.-> core
| Профиль | Сервисы | Статус | Когда включать |
|---|---|---|---|
core |
iam-db, iam-service, control-plane-db, control-plane-api, control-plane-worker, context-adapter, memory-db, memory-service, minio, minio-bootstrap |
стабильное ядро | всегда (MinIO — содержимое артефактов ядра) |
edge |
caddy |
стабильный | всегда, кроме случаев, когда периметр обеспечен иначе |
notify |
notification-db, notification-service |
опционально | уведомления людей по событиям Control Plane; учётку сервиса заводит bootstrap |
Команды:
make up # core edge (по умолчанию)
make up PROFILES="core notify edge" # с уведомлениями
tools/compose --profile core --profile edge up -d # то же без make
make down останавливает все профили (--profile "*"), данные в volumes
сохраняются.
Интерполяция идёт по всему файлу
Docker Compose подставляет переменные во весь deploy/local/compose.yml, а не только
в сервисы включённых профилей. Поэтому обязательными (${VAR:?…})
объявлены только значения, которые генерирует make secrets.
Идентификаторы опциональных профилей (например, IAM_TENANT_ID) по
умолчанию пусты и проверяются сервисами своих профилей, так что make up
для core edge работает на чистом .env — см.
Установку и первый запуск.
Образы и сборка¶
| Образ | Контекст сборки | Dockerfile |
|---|---|---|
${IMAGE_PREFIX}/control-plane |
корень суперпроекта (CP_BUILD_CONTEXT) |
services/control-plane/Dockerfile |
${IMAGE_PREFIX}/iam-service |
./services/iam-service (IAM_BUILD_CONTEXT) |
services/iam-service/Dockerfile |
${IMAGE_PREFIX}/memory-service |
корень (MEMORY_BUILD_CONTEXT) |
services/memory-service/Dockerfile |
${IMAGE_PREFIX}/memory-db |
services/memory-service/infra/memory-db |
PostgreSQL + pgvector; основан на образе apache/age, расширение AGE сервис не использует |
${IMAGE_PREFIX}/notification-service |
корень (NOTIFY_BUILD_CONTEXT) |
services/notification-service/Dockerfile |
${IMAGE_PREFIX}/human-harness |
./services/human-harness |
Dockerfile (сервис harness-image, только сборка) |
${IMAGE_PREFIX}/harness-launcher |
./services/human-harness |
packages/launcher/Dockerfile |
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_NOTIFY_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-сервер. - LLM-провайдер — внешний OpenAI-совместимый endpoint; память может работать без него на офлайн-заглушках.