One image, five roles
The single container is the smallest shape of one design. Set SERVICE_MODE and the same image runs each role on its own, so each part scales and fails independently.
A Site
| Role | Does | Scales |
|---|---|---|
| api | UI, query API, OTLP/HTTP and gRPC ingest, query coordinator | Stateless, any number behind a load balancer |
| worker | Writes ingest to Parquet, compaction, retention, quotas, uploads | Ingest and compaction shards are shared across workers |
| broker | NATS JetStream ingest buffer | Three nodes, one per zone |
| querier | Runs query fragments, with its own segment cache | Stateless, add replicas for query throughput |
| control-plane | One login and UI in front of many Sites; organizations, SCIM, shared channels, Synthetics monitors, cloud connections | One per company, in front of every Site |
| obzly-probe | Separate image: runs Synthetics checks and cloud scans from your locations | Probe groups of any size; failover within a minute |
Query path
Multi-site
admin stays as a break-glass account.Synthetics & cloud
Scaling & HA
Durable ingest
A batch is acknowledged only after the JetStream buffer has stored it on three replicas. Rows are searchable before they're written to Parquet.
Backpressure
When the buffer is full, clients get 429 or RESOURCE_EXHAUSTED and OTel Collectors retry.
One owner per shard
Leases give each ingest and compaction shard exactly one worker. Rolling updates drain readiness first.
Storage layout
Parquet is compacted in levels into hour-sorted files of one day each. A partitioned Postgres catalog keeps per-file statistics.
Cache warmup
Queriers keep their cache on a volume, pre-fetch each segment they own as it's uploaded, and warm up on start.
Self-monitoring
Every role serves Prometheus metrics on an internal port and traces its own requests into a system project.
Inventory per Site
A worker on each Site rebuilds the inventory every 5 minutes from data already stored. The control plane keeps none of it and merges the Sites in your browser.
Alerts survive the control plane
Sites fetch the shared channels and email relay every 5 minutes, sealed to their own key, and keep the last copy if the control plane is unreachable.