Skip to content

History / Azure Hosting Cutover

Revisions

  • docs: eagle-admin on prod served from Azure storage

    @danieltruong danieltruong committed Oct 3, 2026
  • docs: eagle-admin on test served from Azure storage Test serves /admin/ from storage behind Front Door; dev and prod stay on OpenShift. Adds the admin origin switch, rule set, rollback and the Azure deploy workflows.

    @danieltruong danieltruong committed Oct 2, 2026
  • docs: prod edge split live

    @danieltruong danieltruong committed Sep 17, 2026
  • docs: current state, edge split diagram

    @danieltruong danieltruong committed Sep 16, 2026
  • docs: edge per-app split on test, rproxy plan

    @danieltruong danieltruong committed Sep 16, 2026
  • docs: edge probe /healthz, analytics origin list

    @danieltruong danieltruong committed Sep 10, 2026
  • docs: document the /demi-projects/ route

    @danieltruong danieltruong committed Sep 5, 2026
  • docs: document Front Door test+prod edge, rulesbackend, ACCESS_GATE Broaden Azure-Hosting-Cutover.md from prod-only to both eagle-edge profiles: origin groups, the rulesbackend rule set (redirects, rewrites, cache), custom domain/WAF state, and the RouteConfigurationOverride/propagation gotchas. Add ACCESS_GATE and CONTENT_SEARCH to the /api/config key table and document the access gate. Fix the Reverse Proxy page's key count and cross-link. Claude-Session: https://claude.ai/code/session_01SzJaJsq4NA8t4jS8gZs6hU

    @danieltruong danieltruong committed Aug 27, 2026
  • docs: eagle-edge prod dispatch runs on the tag Claude-Session: https://claude.ai/code/session_01Lv5nbmWMatCc8PzYmpupNb

    @danieltruong danieltruong committed Aug 26, 2026
  • docs: eagle-edge deploys from CI Claude-Session: https://claude.ai/code/session_01Lv5nbmWMatCc8PzYmpupNb

    @danieltruong danieltruong committed Aug 26, 2026
  • docs: rewrite wiki to current state Drop history, diaries, future plans and unverified claims. Delete Search-Cutover (diary) and API-Deployment (DeploymentConfig era). Every page verified against repos and live clusters, under 15 KB. Claude-Session: https://claude.ai/code/session_012J1PYLGauUNovjJ1MMoKy5

    @danieltruong danieltruong committed Aug 26, 2026
  • docs(azure): document the availability test on the cutover page The previous commit referenced [[Availability monitoring]] three times and no such page exists, so all three were dead links. Written as a section instead: what the test proves and what it does not, that alerting is off on purpose and how to turn it on, why public ingestion had to be opened before results could land, the mutation that proved it can go red, and the what-if Modify on the live origin that is an artifact rather than drift. Also records why rproxy's own probes are deliberately left alone: a readiness probe reaching through to Front Door would take /api, /admin/ and /eagle-search/ down during a Front Door outage. Claude-Session: https://claude.ai/code/session_01AAAbob8wxD4iH1RRthhEvN

    @danieltruong danieltruong committed Aug 22, 2026
  • docs(azure): the site is watched now, and Contributor cannot be granted Two claims on the cutover page went stale within a day. The availability test is no longer blocked and unshipped: it was deployed by hand on 2026-08-22 and probes the public hostname every 300 seconds from five locations. It has no action group and no metric alert, deliberately, so results are recorded and nobody is told — worth stating plainly, because a watched-but-silent site reads as monitored. The infra workflow's blocker was described as a missing grant. It is not grantable: an ABAC condition on the c4b0a8 management group's Owner assignment denies assigning Contributor, Owner, User Access Administrator, RBAC Administrator and two custom roles by GUID. Anyone who reads the old wording will go looking for someone to approve a request that no one in this subscription can approve. Claude-Session: https://claude.ai/code/session_01AAAbob8wxD4iH1RRthhEvN

    @danieltruong danieltruong committed Aug 22, 2026
  • docs: record the Azure hosting cutover as done projects.eao.gov.bc.ca serves its Angular bundle from Azure Front Door as of 2026-08-21 23:43 UTC, eao-nginx v2.7.14, run 32537298295. rproxy still fronts everything, so /api, /api/config, /admin/ and /eagle-search/ are unchanged and same-origin. Azure-Hosting-Cutover.md flips from runbook to record: what was executed (steps 1 and 5 only), what was not (no availability test, no test-side rehearsal, no fresh bundle republish), and the two things the day taught. The first Deploy to Prod failed on `dial tcp 142.34.194.119:6443: i/o timeout` — the Silver API unreachable from GitHub runners, which happens periodically and says nothing about the change. Rerunning the failed job succeeded. That failure exposed a hazard worth keeping: Tag Image for Prod runs and succeeds before the deploy job, and deploy/rproxy has an image trigger on rproxy:prod, so the image can roll while Helm never applies. Benign this time only because v2.7.13 and v2.7.14 differ in nothing the image contains. Also recorded: the flash on first load is not Front Door. src/index.html is byte-identical between v2.7.28 and the Azure branch, app-root is empty with no SSR or splash, and ConfigService.init() awaits /api/config before first render. Shell TTFB through rproxy measured 0.384-0.415s against 0.416-0.424s hitting the endpoint directly, so the edge adds nothing. Reverse-Proxy-Configuration.md and API-Architecture.md said `/` proxies to eagle-public:8080. True in dev and test, no longer true in prod. API-Architecture also listed /public as its own block; 5971894 deleted it and /lib, both of which now reach location / and return the same body. Claude-Session: https://claude.ai/code/session_01AAAbob8wxD4iH1RRthhEvN

    @danieltruong danieltruong committed Aug 21, 2026
  • docs: correct the cutover runbook and the config/search pages against prod Production moved on 2026-08-20 and these three pages did not. Re-measured 2026-08-21 against the live site. Azure-Hosting-Cutover.md carried two statements that would cause an outage if followed. The rollback said "redeploy v2.7.12" — the deploy job's checkout has no ref, so the chart renders from master while --set image.tag=prod picks the image; redeploying an older tag rolls the image back and leaves the Front Door value in place, which is the one broken combination. Correct rollback is oc set env on NGINX__EPIC__PROXY__ROOT, ~30-60s, then revert values on master. It also claimed proxy_cache globalcache "becomes dead weight" because Front Door sends no Cache-Control; both halves are false, AFD delegates to the origin and the origin sets the headers, so staleness is zero at both layers. Four of its five blockers are closed and are now recorded as such: $web holds a CI bundle, the blobs carry correct Cache-Control, /public and /lib are deleted rather than repointed, and the security headers were reconciled. The open gap is that no tag contains 5971894. Added the a01-not-z01 hostname trap, and six findings that appeared in no document: no upstream keepalive, capacity inverting onto two fixed proxies, assets/* shipping no-cache, dotted Angular routes returning 404, www.projects.eao.gov.bc.ca following the flip unmentioned, and the OpenShift pipeline staying runnable and gated by nobody. Configuration-Management.md said test and prod still serve /api/config from the rproxy ConfigMap. All three environments now serve it from eagle-api's Mongo Config document; the ConfigMap is rendered, mounted and read by nobody. Also four keys are dropped, not three — TYPESENSE_ENABLED was missing from the list. Eagle-Search.md said SEARCH_API_PATH is still empty in prod so the estate is indexed and dark. It is /eagle-search and the estate is live. Recorded that the path also answers anonymously with document full text and each row's read[] grants, that two of the four preconditions were never met, and that the live index counts are 358/61,582/1,128,576 against the 368/62,474 recorded at reindex time — unreconciled, both kept. Claude-Session: https://claude.ai/code/session_01AAAbob8wxD4iH1RRthhEvN

    @danieltruong danieltruong committed Aug 21, 2026
  • docs: record the Front Door purge role requirement CDN Endpoint Contributor covers classic CDN endpoints only and fails an AFD purge at every scope, with an error that reads like a scope problem. Names the role that works and marks the purge step proven by a real run.

    @danieltruong danieltruong committed Aug 21, 2026
  • docs: correct the cache-header diagnosis, and the unmatchable asset hash The $nostore batch was never broken. A hand upload-batch at 01:21:35Z with no --content-cache-control stripped every header; 46 of 48 blobs carry that timestamp and a null cacheControl, and the two survivors are CI blobs whose content-hashed names the hand upload did not reuse. The real defect is that upload-batch exits 0 on a failed precondition and nothing read it back. Also records that asset hashes cannot match production: the ancestry guard drags in develop's @angular/core 21.2.20 against the release line's 21.0.8. Source equality is the verifiable thing, not hash equality. Claude-Session: https://claude.ai/code/session_01AAAbob8wxD4iH1RRthhEvN

    @danieltruong danieltruong committed Aug 21, 2026
  • docs: Azure hosting cutover — 21 blockers from a read-only investigation Moving eagle-public's HTML from OpenShift pods to Front Door is not the one-line upstream change it looks like. Records the five preconditions (wrong bundle in $web, missing Cache-Control that breaks rollback, /public left pointing at the pod, a stale nginx branch, security headers regressing), the TLS directive set that 502s if shipped partially, the 421 that Host $host guarantees, and the resolve-once DNS risk that has a runbook rather than a fix. Claude-Session: https://claude.ai/code/session_01AAAbob8wxD4iH1RRthhEvN

    @danieltruong danieltruong committed Aug 21, 2026