Replaces the cv and docs minikube Deployments with ansible roles that
download release tarballs into ~/cv/content and ~/docs/content on indri.
Caddy now serves those directories directly via a new kind=static
service-block in the Caddy template; no daemon, no nginx pod, no
ProxyGroup ingress on the request path.
This commit adds the deploy-side artifacts only. Live cutover (delete
argocd apps, run ansible, verify) is staged manually after PR review;
the dead containers/{cv,quartz} and argocd manifests are removed in a
follow-up commit so each commit is internally consistent.
Workflows are simplified: the deploy step now bumps the role's pinned
version and pushes; running ansible + purging the Fly cache is manual
from gilbert (matches the devpi pattern).
service-versions.yaml: cv and docs are type=ansible. docs current-version
remains 1.28.2 for now to keep container-version-check passing while
containers/quartz still exists; will move to the docs release tag in the
cleanup commit.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2.8 KiB
| title | modified | last-reviewed | tags | ||
|---|---|---|---|---|---|
| Docs on Indri | 2026-04-29 | 2026-04-29 |
|
Docs on Indri
How the Quartz documentation site (docs.eblu.me) is deployed on indri natively. Replaces the prior minikube Deployment; same shape as cv-on-indri with one extra wrinkle for Quartz's clean URLs.
Why native, not Kubernetes
The docs site is fully static HTML produced by Quartz. Caddy can serve the extracted tarball directly. The Quartz-specific behavior the previous nginx container provided (try_files $uri $uri/ $uri.html =404 and a custom /404.html) maps cleanly to Caddy's try_files and handle_errors.
Layout
| Concern | Path / detail |
|---|---|
| Content dir | /Users/erichblume/docs/content/ |
| Version sentinel | /Users/erichblume/docs/.installed-version |
| Caddy entry | docs service in ansible/roles/caddy/defaults/main.yml (kind: static, try_html: true) |
| Public URL | https://docs.eblu.me (via flyio-proxy) |
| Private URL | https://docs.ops.eblu.me (Caddy on indri) |
| Tarball source | Forgejo release asset on the blumeops repo (docs-<version>.tar.gz) |
docs_version in ansible/roles/docs/defaults/main.yml is the blumeops release tag (e.g. v1.16.0). The role's download/extract is gated by an on-disk sentinel.
Deploy
- Run the
Build BlumeOpsForgejo workflow → builds the tarball, creates a release, bumpsdocs_versionin the ansible role, pushes to main - From gilbert:
mise run provision-indri -- --tags docs - From gilbert:
fly ssh console -a blumeops-proxy -C "sh -c 'rm -rf /tmp/cache && nginx -s reload'"
The Caddy block uses try_files {path} {path}/ {path}.html and a handle_errors 404 → /404.html rewrite, matching the original nginx behavior so Quartz's clean URLs continue to work.
Verify
ssh indri 'cat ~/docs/.installed-version'
ssh indri 'ls ~/docs/content/'
curl -fsSI https://docs.ops.eblu.me/ # private
curl -fsSI https://docs.eblu.me/ # public
curl -fsSI https://docs.eblu.me/explanation/agent-change-process # clean URL → .html fallback
curl -fsSI https://docs.eblu.me/no-such-path-exists/ # → /404.html
Bumping the docs version
Normally driven by the workflow. If you need to pin manually, edit docs_version in ansible/roles/docs/defaults/main.yml and re-run mise run provision-indri -- --tags docs.
Backup
Content dir is not borgmatic-backed. Source is in this repo; release tarballs are on the forge.
Rollback
Set docs_version back to the previous release tag in the role defaults and re-run. Older release tarballs remain available as Forgejo release assets.
Related
- cv-on-indri — sibling service, simpler (no
try_html) - devpi-on-indri — pattern reference for indri-native services
- docs — service reference