Compose profiles and Helm toggles for lean production or full demo stacks.
obleth ships as a small core plus optional components. Both the Docker Compose stack and the Helm chart let you turn pieces on and off so the same artifacts serve a one-command demo and a lean production install.
Core (always on): Postgres (config source of truth + audit), Redis (hot
cache + token budgets + response cache), ClickHouse (usage ledger), the obleth
data plane, and the control-plane dashboard.
Optional:
| Component | Role | When to enable |
|---|---|---|
mock-backend | GPU-free OpenAI-compatible upstream | dev / demos only |
| HAProxy / Ingress | TLS termination + round-robin across obleth pods | when you don't already have an edge LB |
| Prometheus + Grafana | metrics scrape + dashboards | when you want in-cluster metrics |
| Jaeger (OTLP collector) | distributed tracing backend | when OBLETH_OTEL_ENDPOINT is set |
HAProxy is a normal part of a gateway of this class. Keep it for self-contained
demos; in production you'll usually replace it with a managed load balancer
(Compose edge profile) or a Kubernetes Ingress (Helm ingress.enabled).
Profiles gate the optional services. Core services have no profile and always start.
# Lean core only (point obleth at a real upstream, see below)
docker compose -f deploy/docker/docker-compose.yml up
# Full dev/demo stack
docker compose -f deploy/docker/docker-compose.yml \
--profile mock --profile edge --profile observability up
Or default the profiles on for dev by setting COMPOSE_PROFILES in
deploy/docker/.env (copy from .env.example):
COMPOSE_PROFILES=mock,edge,observability
| Profile | Services |
|---|---|
mock | mock-backend |
edge | haproxy |
observability | prometheus, grafana, jaeger |
obleth no longer hard-depends on the mock backend. Set the upstream in .env:
OBLETH_UPSTREAM_BASE_URL=https://my-vllm-or-aibrix-endpoint/v1
Run without the mock profile and obleth routes straight to your real inference
endpoint. Per-model overrides still take precedence via the model registry.
.env.example documents the keys that must agree across services:
OBLETH_ADMIN_TOKEN — shared by obleth and control-plane.OBLETH_UPSTREAM_BASE_URL — default upstream for the data plane.OBLETH_OTEL_ENDPOINT — OTLP/HTTP collector base URL (empty = tracing off).DASHBOARD_USERNAME / DASHBOARD_PASSWORD / DASHBOARD_SESSION_SECRET — dashboard auth.The chart bundles dependencies for a self-contained install and lets you swap any of them for an external/operator-managed endpoint.
postgres:
enabled: false # use an external/operator Postgres
external:
url: postgres://user:pass@pg-host:5432/obleth
redis:
enabled: false
external:
url: redis://redis-host:6379
clickhouse:
enabled: false
external:
url: http://clickhouse-host:8123
mockBackend:
enabled: false # production: no mock
obleth:
upstreamBaseUrl: https://my-vllm-endpoint/v1
When a dependency is enabled: false, its external.url is required — the
chart wires obleth at that URL instead of an in-chart service. Leaving it blank
fails the render with a clear message rather than booting a misconfigured pod.
ingress:
enabled: true
className: nginx
host: obleth.example.com
servicePort: 8080
tls:
- secretName: obleth-tls
hosts: [obleth.example.com]
obleth:
otelEndpoint: http://my-collector:4318
controlPlane:
dashboardUsername: admin
dashboardPassword: change-me
dashboardSessionSecret: a-long-random-secret
| Value | Default | Effect |
|---|---|---|
postgres.enabled | true | bundle Postgres vs use postgres.external.url |
redis.enabled | true | bundle Redis vs use redis.external.url |
clickhouse.enabled | true | bundle ClickHouse vs use clickhouse.external.url |
mockBackend.enabled | true | bundle mock upstream (set false + obleth.upstreamBaseUrl in prod) |
ingress.enabled | false | expose obleth through an Ingress |
hpa.enabled | true | autoscale obleth on CPU |
serviceMonitor.enabled | false | create a Prometheus Operator ServiceMonitor |
obleth.otelEndpoint | "" | OTLP/HTTP trace export target |