Экспериментальные модули¶
В этом разделе описаны сервисы, которые входят в поставку, но не входят в
ядро и не поднимаются по умолчанию: Policy Decision Point (policy-service)
и сервис лицензирования (entitlement-service). Раздел нужен тем, кто хочет попробовать эти модули
или оценить, на что они способны, и тем, кто эксплуатирует инсталляцию, где
они уже включены.
Статус: experimental и frozen
Оба модуля работают и проверяются CI, но новых возможностей не
получают: дефекты исправляются, только если ломают сборку профиля.
Судьба policy будет решена на одной из следующих вех
платформы (TAI-ADR-0040); entitlement заморожен (TAI-ADR-0034 п.4).
Не стройте на них критичные сценарии без оценки рисков: API может
измениться или модуль может быть выведен из поставки.
Сводка¶
| Модуль | Профиль compose | Статус | Что делает | Кто им пользуется |
|---|---|---|---|---|
| Policy Service | policy |
experimental | ReBAC-решения «может ли principal P выполнить действие A над ресурсом R» поверх OpenFGA | Control Plane (CP_AUTHZ_MODE = shadow или policy), memory-service (CB_POLICY_ENABLED) |
| Entitlement Service | entitlement |
frozen | лицензии, планы, места и квоты продуктов | Control Plane (CP_ENTITLEMENT_ENABLED) |
Общие свойства¶
Оба модуля — resource services платформы и устроены одинаково:
- собственная PostgreSQL в своём профиле, миграции Alembic при старте
контейнера (
alembic upgrade head); - принимают только короткоживущий access token IAM своего audience и проверяют его через platform-auth-sdk (RS256 по JWKS, точные issuer и audience, fail closed);
- административные операции первого среза — через bootstrap-заголовок
(
X-Policy-Bootstrap-Token,X-Entitlement-Bootstrap-Token); это временная граница, а не замена ролевой модели; - публикуют журнал событий с курсором (
GET /api/v1/events) — потребители читают его сами, push-доставки нет; - порт на хосте — только
127.0.0.1; через Caddy наружу они не публикуются.
| Модуль | Audience IAM | Scopes | Порт в сети | Порт на хосте |
|---|---|---|---|---|
| policy-service | policy-service |
policy:check, policy:check-on-behalf, policy:admin |
8030 | POL_HOST_PORT (18040) |
| entitlement-service | entitlement-service |
entitlement:check-on-behalf |
8020 | ENT_HOST_PORT (18020) |
Audiences и потолки scopes заводит make bootstrap (реестр AUDIENCES в
deploy/bootstrap.py) — даже если профиль не поднят.
Включение¶
# ядро + нужный экспериментальный профиль
make up PROFILES="core policy edge"
make up PROFILES="core entitlement edge"
# после первого подъёма профиля — повторить bootstrap:
# он создаёт service accounts, env-файлы и регистрацию каталогов
make bootstrap
# для профиля policy — с ожиданием сервиса, чтобы шаг 7 не пропустился
make bootstrap ARGS=--policy
Что делает bootstrap для каждого профиля:
| Профиль | Шаг bootstrap | Результат |
|---|---|---|
policy |
7 (если в .env задан POL_BOOTSTRAP_TOKEN и policy-service отвечает) |
каталоги действий, публикация модели, store tenant'а, роль tenant-admin оператору, service accounts памяти и воркера проекции, файлы secrets/memory-service-iam.env и secrets/policy-service-cp.env |
entitlement |
— | только audience entitlement-service; каталог продуктов и лицензии заводятся через API сервиса |
Шаг 7 и профиль policy
make secrets заполняет POL_BOOTSTRAP_TOKEN, но шаг 7 выполняется, только
если policy-service уже отвечает на /healthz (одна проверка, без
ожидания). Если профиль policy не поднят, bootstrap печатает «7.
policy-service не отвечает (профиль policy не поднят) — шаг пропущен» и
завершается успешно. Сразу после up профиля сервис может ещё не
отвечать — запускайте make bootstrap ARGS=--policy: скрипт подождёт
/healthz до 30 с и упадёт не дождался …, если профиль так и не поднялся
(сделанное до шага 7 уже сохранено в state).
После появления env-файлов пересоздайте сервисы, которые их читают
(policy-worker, memory-service).
Выключение¶
Модули не являются зависимостями ядра, но ядро может быть настроено на них:
| Перед остановкой профиля | Иначе |
|---|---|
CP_AUTHZ_MODE=local для Control Plane (если было shadow/policy) |
в режиме policy все проверки прав с IAM-субъектом получают 503 policy_unavailable |
MEMORY_POLICY_ENABLED=false |
память отдаёт 503 на операции, требующие видимости |
CP_ENTITLEMENT_ENABLED=false |
запросы к Control Plane получают 503 entitlement_unavailable после истечения кэша |
Тома (policy_db, entitlement_db) сохраняются; для полного
удаления данных удалите их явно.