Skip to content

feat(backup): cloud backup of critical cluster state to Cloudflare R2#274

Merged
swares merged 5 commits into
mainfrom
feat/cloud-backup-track1
Jul 22, 2026
Merged

feat(backup): cloud backup of critical cluster state to Cloudflare R2#274
swares merged 5 commits into
mainfrom
feat/cloud-backup-track1

Conversation

@swares

@swares swares commented Jul 22, 2026

Copy link
Copy Markdown
Owner

What

Installs backup-cloud.service + backup-cloud.timer on H4 via a new Ansible playbook.

Sources backed up offsite daily (03:00 UTC):

  • k3s etcd snapshots (~450 MB)
  • lldap DB snapshots (~3 MB)
  • Vault raft snapshots (if present)
  • Postgres dumps: Authelia, Immich, Semaphore (via kubectl exec, ~few hundred MB)

Destination: Cloudflare R2 homelab-backup bucket (S3-compatible, free 10 GB tier, zero egress)

Retention: 7 daily, 4 weekly, 3 monthly

How to run

Requires VAULT_TOKEN with read on secret/lab/cloudflare-r2:

VAULT_TOKEN=hvs.xxx ansible-playbook ansible/playbooks/backup-cloud.yml

Or set VAULT_TOKEN as an environment variable in Semaphore.

swares added 5 commits July 22, 2026 02:31
- CLAUDE.md: clarify RPi 4B / opi-zero2w-1 DNS roles
- ARCHITECTURE.md: add Reloader and Zot to services table
- HARDWARE.md: fix OPi Zero 2W #4 role (MQTT secondary broker)
- WORKFLOWS.md: note that standard workloads don't need gitops/apps/ entry
- services.md: add Reloader and Zot entries
- STANDUP.md: remove Proxmox API token ref; archive Phase 5
- LAB-DESIGN.md: add design-proposal disclaimer (Proxmox not implemented)
The PVC was never mounted by the Deployment (only config and secrets
volumes are used). It has been Pending for 3 days as local-path waits
for a consumer that never arrives, causing ArgoCD to report the app as
Progressing indefinitely.

No data loss risk: the PVC was never bound.
…CD health diagnostics

- Add Reloader section (Section 4): explains Stakater Reloader annotation and
  which deployments carry it (Authelia, Semaphore, Zot)
- Expand ArgoCD Progressing diagnostic: add jq resource-health query and
  app controller log command before the hard refresh step
- Expand PVC Pending cause: distinguish orphaned PVC (no consumer, stays
  Pending forever with WaitForFirstConsumer) from provisioner errors;
  document the fix (delete manifest, ArgoCD prune cleans it up)
Installs backup-cloud.service + timer on H4 (runs 03:00 UTC daily).

What gets backed up offsite (Cloudflare R2, free 10GB tier):
  - k3s etcd snapshots
  - lldap DB snapshots
  - Vault raft snapshots (if present)
  - Postgres dumps: Authelia, Immich, Semaphore (via kubectl exec)

Total estimated size: well under 2GB. Restic retention: 7 daily,
4 weekly, 3 monthly. Credentials read from Vault at secret/lab/cloudflare-r2.

Closes the single-location gap for cluster state — NAS media stays
on the two cold-tier RAID disks (Track 2 decision pending).
@swares
swares merged commit c8e549a into main Jul 22, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant