PROTOTYPE Clickable mockup Β· simulates the finished app β—ƒ Product overview
Petanque Life Operator Console
Production OP

Reliability & continuity

β†’ Operations (live SLO & status page)

How we find out something is broken, who gets paged, and how we restore. Alert routing, the rule catalog, on-call, verified backups with monthly restore drills, and the observability stack configuration. Times in UTC.

Alert routingAlert rules & on-callBackups & DR drillsObservability config
Alert routing Β· per tenant, cooldown-deduplicated
ScopeChannelCooldownLast fired
Platform (global) PagerDuty Events v2 + Slack #ops-alerts 10 min INC-451 · 22 min ago ✎ edit routing
Svenska Boulefârbundet Opsgenie + email 15 min 3 d ago ✎ edit routing
Norges Bouleforbund Webhook (custom NOC) 15 min never ✎ edit routing
Alert history keeps every fired/suppressed decision (24 h: 6 fired, 41 suppressed by cooldown). Test-fire available per channel.
Alert rules & on-call
RuleThresholdSeverityState
API 5xx rate Sev1 ● Quiet
Database throttling Sev1 ● Quiet
Email bounce rate (ACS) Sev1 ● Quiet
Container App restarts Sev2 ● Quiet
API latency p95 Sev2 ● FIRING
Stripe webhook failures Sev2 ● Quiet
Severity matrix: Sev1 = page immediately, respond 15 min Β· Sev2 = page business hours, respond 4 h Β· Sev3 = ticket, next business day.
On-call rotation
NowPatrik W (primary) Β· Maja L (backup)
Next weekMaja L (primary) Β· Jonas B (backup)
Escalationprimary β†’ backup after 10 min unacked β†’ founder
Postmortems (blameless)
PM-2026-06 Β· INC-448 webhook queue2 actions open
PM-2026-05 Β· INC-431 deploy regressionclosed
Template: timeline Β· root cause Β· contributing factors Β· action list.
Backups & disaster recovery Β· RPO target 4 h / RTO target 8 h
Monthly restore drills (automated) Β· temp database from point-in-time restore + smoke queries vs prod Β±1 %
DrillRun atRPO measuredRTO measuredResult
2026-07 monthly restore drill 2026-07-01 04:12 UTC 2 h 10 m 3 h 40 m ● PASS
2026-06 monthly restore drill 2026-06-02 04:09 UTC 2 h 55 m 4 h 05 m ● PASS
2026-05 monthly restore drill 2026-05-04 04:15 UTC 3 h 20 m 5 h 10 m ● PASS (slow smoke)
Latest verified snapshot: 2026-07-02 12:00 UTC (2 h old). A failed weekly backup-verify auto-opens a Sev2. PITR restore is destructive β†’ step-up auth + audit reason required. Drill runs under a least-privilege service principal.
Scenario runbooks
Data corruption
detect β†’ contain β†’ PITR restore β†’ post-mortem
Region down
fail over per runbook Β· comms via status page
Credential leak
rotate (Stripe / ACS / DB) β†’ revoke β†’ audit sweep
Ransomware
isolate β†’ verified snapshot restore β†’ report
Delete-by-mistake
point-in-time restore of affected tables
Credential rotation procedures
CredentialProcedureLast rotated / verified
Stripe API keys container-app secret set + update 2026-05-20 Run rotation β†’
ACS connection string regenerate-key + container update 2026-04-11 Run rotation β†’
Key Vault (backup) soft-delete + purge protection Β· secret backup/restore verified 2026-07-01 Run rotation β†’
Observability configuration
Structured logging
JSON renderer in prod Β· request context (request/tenant/user/trace id) bound to every line Β· sensitive-field masking ON.
Metrics & dashboards
Scrape endpoint live Β· business metrics (licenses, auth, scores, sync, audit) Β· 12-panel API overview dashboard provisioned.
Distributed tracing
OpenTelemetry exporter enabled Β· API, HTTP clients and data layer auto-instrumented Β· trace id echoed in the response header.
Health probes
ProbePurposeLatencyState
/health liveness 4 ms ● OK
/ready readiness (DB ping) 11 ms ● OK
/startup startup probe (container platform) β€” ● OK
/health/detailed per-dependency: database 9 ms Β· cache 2 ms 12 ms ● OK
Frontend error capture (Sentry)
DSN served to apps Β· CSP-safe envelope tunnel through the API Β· 24 h: 12 frontend errors (0 new signatures).
Continuous profiling
Always-on CPU/memory profiles on the API Β· flame graphs retained 14 days Β· overhead budget under 2 %.
States
⏳ Loading drill history…
βœ“ No alerts firing β€” on-call is quiet.
⚠ Last restore drill FAILED β€” Sev2 opened automatically, RPO/RTO baseline not updated.