Garage: surface missing GCS archive + add sovereign OpenTofu state bucket #9

Merged
founder merged 1 commit from codex/garage-backup-integrity into main 2026-07-25 22:50:30 +00:00
Owner

Blob replication silently skipped the GCS cold-archive leg (missing credential) while exiting 0 — one mirror, invisibly. Now fails visibly (opt-out via KEYSTORE_GCS_ARCHIVE_OPTIONAL=1). Also declares key-store-opentofu-state so it inherits provisioning + the mirror allowlist ahead of moving state off the closed AWS account. 🤖 Generated with Claude Code

Blob replication silently skipped the GCS cold-archive leg (missing credential) while exiting 0 — one mirror, invisibly. Now fails visibly (opt-out via KEYSTORE_GCS_ARCHIVE_OPTIONAL=1). Also declares key-store-opentofu-state so it inherits provisioning + the mirror allowlist ahead of moving state off the closed AWS account. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
garage: surface missing GCS archive + add sovereign OpenTofu state bucket
All checks were successful
Release: If Needed / Check (Release Needed) (push) Successful in 5s
Deploy: API / Deploy (API) (push) Successful in 4m48s
Deploy: Web / Deploy (Web) (push) Successful in 6m36s
580e1f862b
The blob replication ran with only one of the two mirrors KSE-0177 specifies.
The GCS archival leg has never run (missing /run/agenix/gcpServiceAccount) and
the script skipped it while still exiting 0 -- so a total absence of cold
archive looked exactly like a healthy run: no failed unit, no alert, false
durability. Keep running the working Hetzner leg, but exit non-zero when the
archival mirror never ran, so the degraded state is visible. Set
KEYSTORE_GCS_ARCHIVE_OPTIONAL=1 to deliberately accept Hetzner-only.

Also declare key-store-opentofu-state in storageBuckets, ahead of migrating
OpenTofu state off the closed AWS account (642524882698). Declaring it there
means it inherits both Garage bucket provisioning and the external mirror
allowlist -- state is the artifact that must survive losing the forge, so it
must never sit in an unmirrored bucket.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
key-store/key.store!9
No description provided.