Phase 4: Helm chart enforces api vs enterprise-api, closing the deployment-topology gap

deploy/helm/sentry/templates/api.yaml and the new enterprise-api.yaml
are mutually exclusive, gated on opposite sides of the same
enterprise.enabled flag -- exactly one renders, both as a Deployment+
Service named {{ .Release.Name }}-api on port 8080, so every consumer
(alerting's API_QUERY_URL, web's build args) needs zero conditional
logic of its own. This is the concrete fix for what the threat model
named as the single largest remaining gap once both storage engines'
isolation mechanisms were built: previously nothing forced or flagged
whether a deployment ran the tenant-isolated binary. Now the same flag
that turns on RBAC/audit/SSO also chooses the query binary.

Verified by parsing (not eyeballing) helm template's rendered output
under both value sets: exactly one sentry-api Deployment/Service either
way, with the right image, and kubeconform -strict clean against the
real Kubernetes 1.31 schema. Not applied to a live cluster (still no
cluster in this environment) -- docker-compose.yml also still runs
plain api unconditionally, so this enforcement is Helm-only for now.

Updated the threat model, architecture doc, CLAUDE.md, and deploy/
READMEs to reflect this and to name what's left: ingest has no tenant
concept for either storage engine (undesigned), and the Tenant CRD
(deploy/operator) and enterprise-api -provision-tenant are still two
separate, unreconciled provisioning mechanisms.
This commit is contained in:
2026-08-14 06:20:20 -07:00
parent ba2276aa1a
commit 3037b31b0f
9 changed files with 287 additions and 69 deletions
+15 -8
View File
@@ -147,15 +147,22 @@ escape hatch is opaque to any compiler-injected filter.
`chrunner`/`searchclient` becomes tenant-aware on the write side,
which is undesigned, not merely unbuilt.
- `deploy/operator`'s `Tenant` CRD still manages only the K8s-side
artifact (a credential Secret); the Helm chart has no service
definition for `enterprise-api` yet.
artifact (a credential Secret); it doesn't call
`enterprise-api -provision-tenant` or otherwise trigger ClickHouse-side
provisioning. The two mechanisms are independent today, not reconciled
into one state machine.
The deployment-topology gap — giving the system an actual way to route
traffic to `enterprise-api` instead of `api` (a Helm service, or at
minimum a documented, enforced convention) — is now the single largest
remaining gap between this system and the isolation model it was
designed to have; both storage engines' connection/index-layer
mechanisms themselves are built.
**The deployment-topology gap is closed for the Helm chart**: `deploy/
helm/sentry/templates/api.yaml`/`enterprise-api.yaml` are mutually
exclusive on `enterprise.enabled`, rendering to the same Service name
and port either way, so a Helm-deployed cluster can't accidentally run
the wrong binary — the same flag that turns on RBAC/audit/SSO now also
chooses the query binary. `docker-compose.yml` still runs plain `api`
unconditionally, so this enforcement doesn't yet extend to local/dev.
With both storage engines' connection/index-layer mechanisms built and
deployment topology enforced at the Helm layer, the largest remaining
gaps are ingest's lack of tenant-awareness (undesigned) and unifying the
`Tenant` CRD with `-provision-tenant` into one provisioning flow.
## Licensing boundary