blumeops/docs/reference/services/postgresql.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

1.5 KiB

title date-modified tags
PostgreSQL 2026-02-07
service
database

PostgreSQL

Database cluster via CloudNativePG operator.

Quick Reference

Property Value
URL tcp://pg.ops.eblu.me:5432
Metrics http://cnpg-metrics.tail8d86e.ts.net:9187/metrics
Namespace databases
Cluster blumeops-pg
Operator CloudNativePG

Databases

Database Owner Purpose
miniflux miniflux miniflux feed data
teslamate teslamate teslamate vehicle data

Users

User Role Purpose
postgres superuser CNPG internal
miniflux app owner Owns miniflux database
teslamate superuser TeslaMate (needs extensions)
eblume superuser Admin access
borgmatic pg_read_all_data [[borgmatic

Backup

Backed up via borgmatic postgresql_databases hook. Streams pg_dump directly to Borg (no intermediate files, no downtime). See backup for overall backup policy.

Credentials

1Password items:

  • guxu3j7ajhjyey6xxl2ovsl2ui - eblume password
  • mw2bv5we7woicjza7hc6s44yvy - borgmatic password

CNPG-managed secrets:

  • blumeops-pg-app - miniflux user
  • blumeops-pg-eblume - eblume superuser
  • blumeops-pg-borgmatic - borgmatic backup user
  • blumeops-pg-teslamate - teslamate user