Stub the phd-tower backup, deliberately unplugged #51

Merged
parkerhdavis merged 1 commit from forge-backup-stub into main 2026-10-12 22:26:08 -06:00
parkerhdavis commented 2026-10-12 22:26:06 -06:00 (Migrated from github.com)

Summary

Implements the phd-tower backup design (Software-Wiki: phd-tower Backup Design) as buildable, inert plumbing. One self-scheduling container — alpine + restic + postgresql16-client + crond in a new restic/ directory — replaces the design's earlier ofelia sketch: a monthly pg_dump of forgejo-db rides the compose network with FORGEJO_DB_PASSWORD (no Docker socket, no scheduler sidecar), then three tagged restic roots go into one repository — ForgeData, home, and the fresh dump — and forget --prune keeps a rolling year of monthlies plus three annual keepers. The run ends on a teeth-check that it produced a snapshot.

Deliberately dormant: the service sits behind the backups compose profile, so make up phd-tower never starts it — the initial restic run is postponed until after the personal-project migration, so the origin snapshot captures the real state. Plugging in is: fill BACKUP_* in .env, one manual restic init, then --profile backups up -d backup.

Verification

  • docker compose config -q passes without the backup service; --profile backups config includes it.
  • Image builds locally (restic 0.16.4 under alpine 3.20, pinned); backup.sh passes bash -n, and running it with an empty environment fails immediately with the legible 'backup not plugged in' message, before any upload attempt.
  • Crontab rides in the image (monthly, 3 AM on the 1st).
## Summary Implements the phd-tower backup design (Software-Wiki: phd-tower Backup Design) as buildable, inert plumbing. One self-scheduling container — alpine + restic + `postgresql16-client` + crond in a new `restic/` directory — replaces the design's earlier ofelia sketch: a monthly `pg_dump` of `forgejo-db` rides the compose network with `FORGEJO_DB_PASSWORD` (no Docker socket, no scheduler sidecar), then three tagged restic roots go into one repository — ForgeData, home, and the fresh dump — and `forget --prune` keeps a rolling year of monthlies plus three annual keepers. The run ends on a teeth-check that it produced a snapshot. **Deliberately dormant**: the service sits behind the `backups` compose profile, so `make up phd-tower` never starts it — the initial restic run is postponed until after the personal-project migration, so the origin snapshot captures the real state. Plugging in is: fill `BACKUP_*` in `.env`, one manual `restic init`, then `--profile backups up -d backup`. ## Verification - `docker compose config -q` passes without the backup service; `--profile backups config` includes it. - Image builds locally (restic 0.16.4 under alpine 3.20, pinned); `backup.sh` passes `bash -n`, and running it with an empty environment fails immediately with the legible 'backup not plugged in' message, before any upload attempt. - Crontab rides in the image (monthly, 3 AM on the 1st).
Sign in to join this conversation.
No reviewers
No labels
No milestone
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
parker/cumulus!51
No description provided.