Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

DevOps / SRE

Maintenance only. Keeps the deployment healthy, upgraded, backed up and observable; drains a node before a change and restores a database after one. Has no reason to read prompts, mint keys or change who may do what — but today the screens they need are all superadmin-only, so they hold superadmin anyway.

Goal: “I know it is healthy, I can change it without an outage, and I can put it back if the change goes wrong.”

Dogfood account: dev@rolter.local (superadmin). See dogfood data.

The observer watches: the gateway’s /metrics and Cluster Config while D2–D4 run, and SigNoz rolter · overview for anything that got slower.

D0 — the role

#stepwhereexpectstatus
D0.1operate the deployment without superadmin—an operator role: cluster, health, runtime policy, alerting, connectors; no tenant data or grantsgap — #1834

D1 — stand it up and upgrade it

#stepwhereexpectstatus
D1.1installplatform-admin A0both planes, Postgres, Redis, ClickHouse healthyverified (compose)
D1.2reproduce an issue on a local copyjust dogfoodthe whole stack on one hostpartial — #1819 on hosts with a low nofile cap
D1.3preview an upgradeupgradingwhat the new version will change in the stored configuration, before it runsworks
D1.4upgradenew image; migrations run on control-plane bootthe new control plane opens its listener only once migrations finish, so neither probe answers until then; the chart’s startupProbe (5 minutes by default) holds liveness off meanwhile; the migrations check in /readyz only fails for a process serving a database it did not migrateworks

D2 — know it is healthy

#stepwhereexpectstatus
D2.1liveness and readiness/healthz, /readyz on both planesliveness never depends on the database; readiness doesverified
D2.2every node on the current configCluster Configeach gateway live and converged; a lagging one is distinguishable from a dead oneverified
D2.3the fleet’s own pictureCircuit Breaker, Adaptive Routing → Dashboard, provider healthbreaker states, per-target latency, adaptive engagementworks; dogfood adaptive never engages — #1817
D2.4metrics and traces in the tools the team already uses/metrics; Connectors for OTLP exportrequest rate, latency, errors, queue depth; traces in the team’s backendpartial — #1855 (no per-provider queue depth)

D3 — tune capacity

#stepwhereexpectstatus
D3.1size the per-provider queueSettings → Performance Tuningworkers requests in flight per provider; capacity waiting; error/block backpressurebug — #1815 (one in flight whatever workers says)
D3.2retries and timeoutsthe same screena retry budget that absorbs a flaky target without multiplying loadworks
D3.3switch subsystems on and off without a restartSettings → Feature Flagsthe change reaches every replica on the next config pollbug — #1856

D4 — handle an incident

#stepwhereexpectstatus
D4.1a provider goes downstop a fleet targetits breaker opens, its routes fail over, health shows the outage and the recovery (MTTR)works
D4.2clients time outLLM Logs, status 499which target the clients were waiting onbug — #1816
D4.3be pagedAlerting → Channels / Rules: error_rate, p95_latency_msa webhook when the error rate or p95 crosses the lineverified (created; firing not exercised)
D4.4take a node out before touching itCluster Config → Drainthe node reports not-ready, finishes in-flight work, receives nothing newverified (refuses to drain the only live gateway)

D5 — back up and restore

#stepwhereexpectstatus
D5.1back up the control-plane databasebackup and restorea dump plus the KEK, stored apartworks
D5.2restore it and prove the secrets still openrolter kek verifyevery sealed column opensverified
D5.3keep the configuration as a file toorolter config exportproviders, groups, routes, prices, templates; no credentialsverified

D6 — automate

#stepwhereexpectstatus
D6.1apply configuration from CI with a least-privilege credential—a scoped control-plane tokengap — #1836 (the admin token is superadmin)
D6.2apply it from a filerolter-seed --importdesired state for the sections it importspartial — #1818 (silent about the rest)