64 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. Prefer a bcrypt DASHBOARD_PASSWORD_HASH over a plaintext password. (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.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.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.hpa.enabled=true); set maxReplicas based on traffic patterns.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.