Raxx · internal docs

internal · gated

RCA — console.raxx.app 526 (Heroku ACM renewal blocked by CF Access)

Incident ID: 2026-07-24-console-acm-cf-access-526 Date: 2026-07-24 Severity: SEV-1 (user-facing production outage — console.raxx.app) Duration: ~7m from remediation start to verified-fixed (root cause had been silently accumulating for ~30 days prior to detection) Blast radius: Operator/authenticated console.raxx.app sessions (Raxx Console — Heroku app raxx-console-prod). Note: during remediation, console-staging.raxx.app (Heroku app raxx-console-staging) was found to be independently affected by the identical failure mode (see Action item 3) — its fix is out of this incident's authorized scope and remains open. Author: sre-agent

Summary

console.raxx.app's origin TLS certificate (Heroku ACM, Let's Encrypt, CN=console.raxx.app) expired Jul 23 23:00:09 2026 GMT. Cloudflare's zone SSL mode is strict (Full Strict), so any request that Cloudflare Access proxied through to origin was rejected with an HTTP 526. Heroku's ACM auto-renewal had been failing silently since approximately 2026-06-24 (acm_status: failed, reason "DNS redirect not forwarding path") because the CF Access application "Raxx Console" gates the entire console.raxx.app hostname and 302-redirects every unauthenticated request — including Heroku's ACM HTTP-01 challenge probes to /.well-known/acme-challenge/* — to the CF Access login page, so the challenge could never complete. Fix: a new, path-scoped CF Access application for console.raxx.app/.well-known/acme-challenge/* with a single bypass policy (include: everyone), which takes precedence over the broader hostname-root app. This let Heroku's ACM challenge reach origin; a subsequent heroku certs:auto:refresh completed within ~2 minutes and issued a fresh cert (notAfter=Oct 22 16:59:45 2026 GMT). The main CF Access gate on console.raxx.app was not modified — every other path remains fully gated.

Timeline (all times UTC)

Impact

What went well

What didn't go well

Root cause analysis

Detection

Resolution

Action items

# Action Owner Due Issue
1 Add console.raxx.app origin TLS probe (tls_connect_origin_console) to the fleet cert-expiry monitor — closes the exact gap that let this expire silently sre-agent 2026-07-24 done, this PR
2 Document Failure mode E (CF Access blocking Heroku ACM renewal) + the scoped-bypass remediation in docs/ops/runbooks/cf-access.md sre-agent 2026-07-24 done, this PR
3 console-staging.raxx.app is CONFIRMED already in the identical failed state (acm_status: failed, origin cert expired 2026-07-23 22:42 UTC) — verified during this incident but out of the authorized remediation scope (console.raxx.app only). Needs operator authorization to apply the identical scoped-bypass fix. This is a live, unfixed duplicate of this incident, not a hypothetical. operator/sre-agent ASAP to file
4 Add a proactive poll of heroku certs:auto / acm_status for CF Access-gated Heroku apps (console prod + staging, and any future ones) so an ACM renewal failure pages well before the cert actually expires, independent of the origin TLS probe sre-agent TBD to file
5 Sweep all other CF Access-gated, Full-Strict hostnames for the same gap (hostname-root Access app with no ACME-path carve-out) before their next renewal window sre-agent TBD to file

References