blumeops/docs/reference/reference.md
Erich Blume b197bd5f58 Adopt Dagger CI for docs build (Phase 2) (#157)
## 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
2026-02-11 16:33:16 -08:00

2.5 KiB

title date-modified tags
Reference 2026-02-10
reference

Reference

Technical specifications, inventories, and configuration details for BlumeOps infrastructure.

Services

Individual service reference cards with URLs and configuration details.

Service Description Location
[[alloy Alloy]] Observability collector (metrics & logs)
argocd GitOps continuous delivery k8s
borgmatic Backup system indri
caddy Reverse proxy & TLS termination indri
1password Secrets management cloud + k8s
forgejo Git forge & CI/CD indri
grafana Dashboards & visualization k8s
immich Photo management k8s
jellyfin Media server indri
kiwix Offline Wikipedia & ZIM archives k8s
loki Log aggregation k8s
miniflux RSS feed reader k8s
navidrome Music streaming k8s
postgresql Database cluster k8s
prometheus Metrics collection k8s
teslamate Tesla data logger k8s
transmission BitTorrent daemon k8s
zot Container registry indri
devpi PyPI caching proxy k8s
docs Documentation site (Quartz) k8s
flyio-proxy Public reverse proxy (Fly.io + Tailscale) Fly.io
automounter SMB share automounter indri

Infrastructure

Host inventory and network configuration.

  • hosts - Device inventory
  • indri - Primary server
  • gilbert - Development workstation
  • tailscale - ACLs, groups, tags
  • gandi - DNS hosting for eblu.me
  • unifi - Home WiFi router (UniFi Express 7)
  • routing - DNS domains, port mappings
  • power - Battery-backed power chain

Kubernetes

Cluster configuration and application registry.

Ansible

Configuration management for indri-hosted services.

  • roles - Available ansible roles

Storage

Network storage and backup configuration.

Operations

Operational concerns and their components.