diff --git a/apps/gittensory-ui/src/routes/docs.self-hosting-backup-scaling.tsx b/apps/gittensory-ui/src/routes/docs.self-hosting-backup-scaling.tsx index 422d53b5f2..117ab0b10b 100644 --- a/apps/gittensory-ui/src/routes/docs.self-hosting-backup-scaling.tsx +++ b/apps/gittensory-ui/src/routes/docs.self-hosting-backup-scaling.tsx @@ -156,6 +156,33 @@ docker compose --profile backup run --rm backup sh /verify-backup.sh /backups/po can afford to drop. The script refuses to run when that URL equals the live backup source. +
+ This exact flow was run against a real production backup on a live instance on 2026-07-04
+ (backup gittensory-20260704T090939Z.dump): the dump was restored into a
+ throwaway, network-isolated scratch database (a separate container, never the live one),
+ which the script's own identity check confirmed was distinct from the backup source before
+ touching anything. The restore completed cleanly and, at the time of this drill, repopulated
+ all 84 application tables, including the largest operational tables with their full row
+ counts intact (hundreds of thousands of rows in the biggest tables) — not just an empty
+ schema. Table and row counts will grow over time; treat them as a point-in-time result, not
+ an invariant.
+
+ This proves the backup content and the restore path both work end-to-end against real data.
+ It deliberately stops short of booting a full app instance against the scratch database and
+ polling /ready: that endpoint also gates on live Redis, Qdrant, the configured
+ AI provider, Codex auth, and a real GitHub App key (see{" "}
+ Operations's health endpoints section) —
+ reproducing all of those for a disposable scratch instance would mean copying real
+ credentials into new, throwaway infrastructure, which is a bigger risk than the drill is
+ worth. This drill proves the dump can be restored and its contents inspected at the database
+ layer — it does not exercise the app's own db readiness probe, migration boot
+ path, or /ready response. A full disaster-recovery rehearsal still needs to
+ verify app readiness on the target infrastructure, using the operator's own real
+ credentials.
+
After scaling, revisit Operations and{" "} Security because network and credential