67 docs indexed
Everything to verify before deploying obleth to production: datastores, secrets, TLS, capacity, monitoring, and backup.
This checklist covers the minimum steps to harden an obleth deployment for production traffic.
obleth.existingSecret / controlPlane.existingSecret) so credentials never enter values files or --set/CLI history. See Helm Values — Pre-created Secrets.OBLETH_ADMIN_TOKEN: strong random token (≥32 chars). No default — the gateway will not start without it. Use a Kubernetes Secret or Vault. Never commit to source control.OBLETH_ENCRYPTION_KEY: set to a base64 32-byte key (openssl rand -base64 32) so model api_key and MCP auth_header are AES-256-GCM encrypted at rest. Without it they are stored in plaintext.OBLETH_API_KEY_PEPPER: (optional, recommended) set a stable secret to strengthen API-key hashes against a DB leak.DASHBOARD_SESSION_SECRET: required, ≥32 characters. The dashboard fails closed if missing or too short.DASHBOARD_ADMIN_EMAIL (valid email) / DASHBOARD_PASSWORD (≥8 chars): required to seed the break-glass admin. (DASHBOARD_USERNAME is no longer used.)DATABASE_URL: required for the control plane — the auth tables (users, sessions) live here. Point it at the same database the gateway uses.TRUSTED_ORIGINS: set when the dashboard is reached by a LAN IP or an alternate hostname rather than the exact BETTER_AUTH_URL — comma-separated origins. Without it those logins are rejected as invalid-origin. * trusts every origin and belongs on trusted private networks only.observability profile: set GRAFANA_ADMIN_PASSWORD (anonymous Grafana access is disabled and Compose errors out without it).edge profile: change HAPROXY_STATS_USER / HAPROXY_STATS_PASSWORD from the dev examples — they protect the HAProxy /stats page..env is gitignored — only .env.example (labeled dev examples) should be committed.:8080) reachable only from HAProxy/Ingress, not from the internet.:9180) not publicly accessible — restrict to internal network or VPN. The admin token is the only auth and is compared in constant time.:9091) accessible only to your Prometheus scraper.127.0.0.1 only. The data plane (8088), dashboard (3002), and the edge HAProxy (80) are published on all interfaces — put a TLS-terminating proxy or firewall in front of those. Verify no override widens the loopback binds.api_base targets; link-local and cloud metadata are always blocked. For strict mode (OBLETH_BLOCK_PRIVATE_NETWORKS=1), set OBLETH_ALLOWED_PRIVATE_CIDRS to trusted internal ranges (e.g. 10.0.0.0/8) so cluster Services can be registered.X-Frame-Options) and login rate limiting are active.These are toggles in the Helm chart, defaulted sensibly and tuned for the Production profile.
runAsNonRoot, seccompProfile: RuntimeDefault, allowPrivilegeEscalation: false, and all capabilities dropped. On by default — verify they aren't overridden.affinity.antiAffinity: soft (or hard on multi-node clusters) so a single node failure can't take the whole data plane down.podDisruptionBudget.enabled: true keeps a minimum number of obleth pods available during node drains and rolling upgrades (rendered only when replicas > 1).networkPolicy.enabled: true to restrict their ports to obleth pods. Requires a CNI that enforces NetworkPolicy; a no-op for external datastores.OBLETH_GLOBAL_MAX_IN_FLIGHT to match real inference backend concurrency (start conservative: 64, increase based on queue depth).max_in_flight for routes that share a backend; use static mode with a manual cap for cloud APIs.obleth.replicas: 1 because each pod enforces OBLETH_GLOBAL_MAX_IN_FLIGHT on its own — with one pod the configured ceiling is the ceiling that reaches your upstream. For redundancy, raise replicas and divide globalMaxInFlight by it (values-production.yaml uses 3 × 85).hpa.enabled=false when the replica count is load-bearing — an autoscaled replica count moves the aggregate concurrency limit with no config change. To autoscale anyway, divide globalMaxInFlight by maxReplicas and accept that the upstream is under-subscribed below full scale-out.OBLETH_GLOBAL_MAX_IN_FLIGHT to the upstream's real concurrency so requests queue briefly rather than overwhelming the backend.OBLETH_FAIL_OPEN: true (keep serving under Redis failure) or false (strict budget enforcement).OBLETH_WAL_PATH to a persistent volume path (not /tmp). The WAL must survive pod restarts.:9091/metrics.obleth_queue_depth > threshold (admission saturation).obleth_telemetry_dropped > 0 (WAL pressure).obleth_requests_total{status="5xx"} spike (upstream failures).serviceMonitor.enabled=true if using Prometheus Operator.OBLETH_OTEL_ENDPOINT for distributed tracing.POST /api/v1/models or dashboard import) — a fresh Helm install has none. Use api_base ending in /v1 and the bare upstream_model name.sk_... secret.tokens_per_minute quotas initially; increase based on observed usage.GET /api/v1/audit.obench score against staging for a graded readiness scorecard, and keep the run as the baseline later runs are diffed against.