Closes the last DR gap from kubernetes/MIGRATION-sops-openbao.md.
CronJob openbao-raft-snapshot (openbao ns, 03:00 Europe/Berlin): logs in via kubernetes auth (new SA openbao-snapshot → role → policy raft-snapshot, read on sys/storage/raft/snapshot only — already configured in OpenBao, no token stored anywhere), saves bao operator raft snapshot to a dedicated 5Gi PVC, keeps the newest 7. Same image as the server (quay.io/openbao/openbao:2.5.5), uid 100/fsGroup 1000 to match.
Velero Schedule openbao-daily (06:15, last free stagger slot): ships only the snapshot PVC offsite via the app.kubernetes.io/component: raft-snapshots label — the live raft data PVC is deliberately excluded (crash-consistent db files; the .snap is the supported restore artifact). 30 d retention like the other schedules.
Failure = signal: a sealed OpenBao (forgotten unseal after pod restart) fails the login step and the Job goes Failed — that's the alarm that backups stopped.
Migration doc DR section updated; the remaining DR item is one tested restore before phase 4 — I'd run that against a scratch namespace after the first nightly snapshot exists.
After merge I'll trigger one manual Job run to prove the pipeline end-to-end rather than waiting for 03:00.
Closes the last DR gap from kubernetes/MIGRATION-sops-openbao.md.
- **CronJob `openbao-raft-snapshot`** (openbao ns, 03:00 Europe/Berlin): logs in via kubernetes auth (new SA `openbao-snapshot` → role → policy `raft-snapshot`, read on `sys/storage/raft/snapshot` only — **already configured in OpenBao**, no token stored anywhere), saves `bao operator raft snapshot` to a dedicated 5Gi PVC, keeps the newest 7. Same image as the server (`quay.io/openbao/openbao:2.5.5`), uid 100/fsGroup 1000 to match.
- **Velero Schedule `openbao-daily`** (06:15, last free stagger slot): ships **only the snapshot PVC** offsite via the `app.kubernetes.io/component: raft-snapshots` label — the live raft data PVC is deliberately excluded (crash-consistent db files; the .snap is the supported restore artifact). 30 d retention like the other schedules.
- **Failure = signal:** a sealed OpenBao (forgotten unseal after pod restart) fails the login step and the Job goes Failed — that's the alarm that backups stopped.
- Migration doc DR section updated; the remaining DR item is **one tested restore before phase 4** — I'd run that against a scratch namespace after the first nightly snapshot exists.
After merge I'll trigger one manual Job run to prove the pipeline end-to-end rather than waiting for 03:00.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01CRgBFn9m8a2ncFMLusikH6
bao operator raft snapshot save nightly at 03:00 to a dedicated PVC
(keep 7), authenticated via a new k8s-auth role openbao-snapshot ->
policy raft-snapshot (read on sys/storage/raft/snapshot only; applied
2026-07-14). Velero openbao-daily (06:15) ships ONLY the snapshot PVC
offsite via label selector — the live raft data PVC stays unbacked
(crash-consistent files; the .snap is the restore artifact). A failed
Job doubles as the sealed-after-restart alarm.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRgBFn9m8a2ncFMLusikH6
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Closes the last DR gap from kubernetes/MIGRATION-sops-openbao.md.
openbao-raft-snapshot(openbao ns, 03:00 Europe/Berlin): logs in via kubernetes auth (new SAopenbao-snapshot→ role → policyraft-snapshot, read onsys/storage/raft/snapshotonly — already configured in OpenBao, no token stored anywhere), savesbao operator raft snapshotto a dedicated 5Gi PVC, keeps the newest 7. Same image as the server (quay.io/openbao/openbao:2.5.5), uid 100/fsGroup 1000 to match.openbao-daily(06:15, last free stagger slot): ships only the snapshot PVC offsite via theapp.kubernetes.io/component: raft-snapshotslabel — the live raft data PVC is deliberately excluded (crash-consistent db files; the .snap is the supported restore artifact). 30 d retention like the other schedules.After merge I'll trigger one manual Job run to prove the pipeline end-to-end rather than waiting for 03:00.
🤖 Generated with Claude Code
https://claude.ai/code/session_01CRgBFn9m8a2ncFMLusikH6