## Summary Migrates the docs build pipeline to Dagger (Phase 2 of the Dagger CI adoption plan). - **Backfill `date-modified` frontmatter** on all 80 docs — Dagger's `--src=.` excludes `.git`, so Quartz can't use git history for page dates. Frontmatter dates work with or without git. - **New `docs-check-frontmatter` mise task + pre-commit hook** — validates all docs have `title`, `tags`, and `date-modified` - **New Dagger functions** — `build_changelog` (towncrier in Python container) and `build_docs` (chains changelog → Quartz build in Node container, returns tarball) - **Simplified CI workflow** — the ~44-line inline Quartz build (clone, npm ci, build, tar, cleanup) is replaced by `dagger call build-docs`. Changelog step remains local on the runner since towncrier needs to modify the host working tree for the git commit. ### Design decisions - **Towncrier runs twice in CI**: once inside Dagger (for the docs tarball) and once on the runner (for the git commit). This is intentional — Dagger's directory export is additive and can't delete the consumed changelog fragments from the host. - **Artifact hosting stays on Forgejo Releases** (not migrated to Forgejo Packages as the plan doc originally suggested). That migration can happen independently. - **`date-modified` frontmatter** preserved even though `build_changelog` installs git — the git there is only for towncrier's `git add` call, not for history. The local iteration story (`dagger call build-docs --src=. --version=dev` with uncommitted changes) depends on frontmatter dates. ### Local iteration ```bash dagger call build-docs --src=. --version=dev export --path=./docs-dev.tar.gz tar tf docs-dev.tar.gz | head -20 ``` ## Deployment and Testing - [x] `dagger call build-docs --src=. --version=dev` produces valid 1.1MB tarball (149 HTML pages) - [x] Pre-commit hooks pass (including new `docs-check-frontmatter`) - [ ] Full `workflow_dispatch` run after merge 🤖 Generated with [Claude Code](https://claude.com/claude-code) Reviewed-on: https://forge.ops.eblu.me/eblume/blumeops/pulls/157
1.9 KiB
1.9 KiB
| title | date-modified | tags | ||
|---|---|---|---|---|
| Backups | 2026-02-10 |
|
Backup Policy
Daily automated backups from indri to sifaka NAS.
Schedule
| Time | Frequency | System |
|---|---|---|
| 2:00 AM | Daily | borgmatic |
What Gets Backed Up
Directories
| Path | Description | Priority |
|---|---|---|
~/code/personal/zk |
Zettelkasten notes | Critical |
/opt/homebrew/var/forgejo |
Git repositories | Critical |
~/.config/borgmatic |
Backup config | High |
~/Documents |
Personal documents (includes 1password encrypted export) | High |
Databases
| Database | Host | Method |
|---|---|---|
| miniflux | [[postgresql | pg.ops.eblu.me]] |
| teslamate | [[postgresql | pg.ops.eblu.me]] |
Sifaka-Native Data
Some data lives directly on sifaka rather than being backed up to it (photos via immich, music via navidrome, video via jellyfin). See sifaka for data protection details.
What Is NOT Backed Up
| Data | Reason |
|---|---|
ZIM archives (~/transmission/) |
Re-downloadable via torrent |
| Prometheus metrics | Ephemeral, in k8s PVC |
| Loki logs | Ephemeral, in k8s PVC |
| devpi cache | Re-fetchable from PyPI |
Retention Policy
| Period | Retention |
|---|---|
| Daily | 7 backups |
| Monthly | 12 backups |
| Yearly | 1000 backups |
Backup Target
Repository: /Volumes/backups/borg/ on sifaka
Monitoring
Metrics exposed to prometheus:
borgmatic_up- Repository accessibleborgmatic_last_archive_timestamp- Last backup timeborgmatic_repo_deduplicated_size_bytes- Disk usage
Dashboard: "Borgmatic Backups" in grafana
Related
- borgmatic - Backup system details
- sifaka - Backup storage
- postgresql - Database backups
- restore-1password-backup - Recover 1Password from backup