cv+docs: relocate content under ~/blumeops/{cv,docs}

Keeps blumeops-managed state grouped under a single namespace in the
home dir rather than scattered top-level dirs. Caddy block paths are
derived from cv_content_dir / docs_content_dir, so the role-defaults
edit propagates automatically.

Validated end-to-end on indri: tarballs extracted to the new paths,
sentinels written, second run is idempotent. Old ~/cv and ~/docs from
the earlier validation run were removed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Erich Blume 2026-04-29 14:54:01 -07:00
commit 5b52f18356
7 changed files with 16 additions and 16 deletions

View file

@ -5,6 +5,6 @@
cv_version: "v1.0.3" cv_version: "v1.0.3"
cv_release_url: "https://forge.eblu.me/api/packages/eblume/generic/cv/{{ cv_version }}/cv-{{ cv_version }}.tar.gz" cv_release_url: "https://forge.eblu.me/api/packages/eblume/generic/cv/{{ cv_version }}/cv-{{ cv_version }}.tar.gz"
cv_home: /Users/erichblume/cv cv_home: /Users/erichblume/blumeops/cv
cv_content_dir: "{{ cv_home }}/content" cv_content_dir: "{{ cv_home }}/content"
cv_version_sentinel: "{{ cv_home }}/.installed-version" cv_version_sentinel: "{{ cv_home }}/.installed-version"

View file

@ -6,6 +6,6 @@
docs_version: "v1.16.0" docs_version: "v1.16.0"
docs_release_url: "https://forge.eblu.me/eblume/blumeops/releases/download/{{ docs_version }}/docs-{{ docs_version }}.tar.gz" docs_release_url: "https://forge.eblu.me/eblume/blumeops/releases/download/{{ docs_version }}/docs-{{ docs_version }}.tar.gz"
docs_home: /Users/erichblume/docs docs_home: /Users/erichblume/blumeops/docs
docs_content_dir: "{{ docs_home }}/content" docs_content_dir: "{{ docs_home }}/content"
docs_version_sentinel: "{{ docs_home }}/.installed-version" docs_version_sentinel: "{{ docs_home }}/.installed-version"

View file

@ -19,8 +19,8 @@ CV is a tiny static site (HTML + CSS + PDF). It needs no daemon, no database, no
| Concern | Path / detail | | Concern | Path / detail |
|---|---| |---|---|
| Content dir | `/Users/erichblume/cv/content/` | | Content dir | `/Users/erichblume/blumeops/cv/content/` |
| Version sentinel | `/Users/erichblume/cv/.installed-version` | | Version sentinel | `/Users/erichblume/blumeops/cv/.installed-version` |
| Caddy entry | `cv` service in `ansible/roles/caddy/defaults/main.yml` (`kind: static`) | | Caddy entry | `cv` service in `ansible/roles/caddy/defaults/main.yml` (`kind: static`) |
| Public URL | `https://cv.eblu.me` (via [[flyio-proxy]]) | | Public URL | `https://cv.eblu.me` (via [[flyio-proxy]]) |
| Private URL | `https://cv.ops.eblu.me` (Caddy on indri) | | Private URL | `https://cv.ops.eblu.me` (Caddy on indri) |
@ -44,8 +44,8 @@ Two paths:
## Verify ## Verify
```fish ```fish
ssh indri 'cat ~/cv/.installed-version' ssh indri 'cat ~/blumeops/cv/.installed-version'
ssh indri 'ls -la ~/cv/content/' ssh indri 'ls -la ~/blumeops/cv/content/'
curl -fsSI https://cv.ops.eblu.me/ # private curl -fsSI https://cv.ops.eblu.me/ # private
curl -fsSI https://cv.eblu.me/ # public curl -fsSI https://cv.eblu.me/ # public
curl -fsSI https://cv.eblu.me/resume.pdf | grep -i disposition curl -fsSI https://cv.eblu.me/resume.pdf | grep -i disposition

View file

@ -19,8 +19,8 @@ The docs site is fully static HTML produced by Quartz. Caddy can serve the extra
| Concern | Path / detail | | Concern | Path / detail |
|---|---| |---|---|
| Content dir | `/Users/erichblume/docs/content/` | | Content dir | `/Users/erichblume/blumeops/docs/content/` |
| Version sentinel | `/Users/erichblume/docs/.installed-version` | | Version sentinel | `/Users/erichblume/blumeops/docs/.installed-version` |
| Caddy entry | `docs` service in `ansible/roles/caddy/defaults/main.yml` (`kind: static`, `try_html: true`) | | 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]]) | | Public URL | `https://docs.eblu.me` (via [[flyio-proxy]]) |
| Private URL | `https://docs.ops.eblu.me` (Caddy on indri) | | Private URL | `https://docs.ops.eblu.me` (Caddy on indri) |
@ -39,8 +39,8 @@ The Caddy block uses `try_files {path} {path}/ {path}.html` and a `handle_errors
## Verify ## Verify
```fish ```fish
ssh indri 'cat ~/docs/.installed-version' ssh indri 'cat ~/blumeops/docs/.installed-version'
ssh indri 'ls ~/docs/content/' ssh indri 'ls ~/blumeops/docs/content/'
curl -fsSI https://docs.ops.eblu.me/ # private curl -fsSI https://docs.ops.eblu.me/ # private
curl -fsSI https://docs.eblu.me/ # public 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/explanation/agent-change-process # clean URL → .html fallback

View file

@ -18,7 +18,7 @@ Personal resume/CV served as a static HTML page with PDF download, built from YA
| **Public URL** | `cv.eblu.me` (via [[flyio-proxy]]) | | **Public URL** | `cv.eblu.me` (via [[flyio-proxy]]) |
| **Private URL** | `cv.ops.eblu.me` (Caddy on indri) | | **Private URL** | `cv.ops.eblu.me` (Caddy on indri) |
| **Deployment** | Ansible role `cv` on indri (no daemon — Caddy serves files directly) | | **Deployment** | Ansible role `cv` on indri (no daemon — Caddy serves files directly) |
| **Content dir** | `~/cv/content/` on indri | | **Content dir** | `~/blumeops/cv/content/` on indri |
| **Source repo** | `forge.eblu.me/eblume/cv` (private, not mirrored to GitHub) | | **Source repo** | `forge.eblu.me/eblume/cv` (private, not mirrored to GitHub) |
| **Content packages** | `forge.eblu.me/eblume/-/packages` (generic package `cv`) | | **Content packages** | `forge.eblu.me/eblume/-/packages` (generic package `cv`) |
@ -29,7 +29,7 @@ Migrated from minikube to indri-native on 2026-04-29 (see [[cv-on-indri]]).
1. **Source**: `resume.yaml` (content) + `template.html` (Jinja2) + `style.css` in the cv repo 1. **Source**: `resume.yaml` (content) + `template.html` (Jinja2) + `style.css` in the cv repo
2. **Build**: `render.py` (uv script runner) generates `index.html`; WeasyPrint generates `resume.pdf` 2. **Build**: `render.py` (uv script runner) generates `index.html`; WeasyPrint generates `resume.pdf`
3. **Release**: Dagger `build` function packages `index.html`, `style.css`, `resume.pdf` into a tarball, uploaded to Forgejo generic packages 3. **Release**: Dagger `build` function packages `index.html`, `style.css`, `resume.pdf` into a tarball, uploaded to Forgejo generic packages
4. **Deploy**: ansible role downloads the tarball into `~/cv/content/` on indri; Caddy serves the directory directly 4. **Deploy**: ansible role downloads the tarball into `~/blumeops/cv/content/` on indri; Caddy serves the directory directly
## Endpoints ## Endpoints

View file

@ -18,7 +18,7 @@ Documentation site built with [Quartz](https://quartz.jzhao.xyz/).
| **Public URL** | https://docs.eblu.me (via [[flyio-proxy]]) | | **Public URL** | https://docs.eblu.me (via [[flyio-proxy]]) |
| **Private URL** | `docs.ops.eblu.me` (Caddy on indri) | | **Private URL** | `docs.ops.eblu.me` (Caddy on indri) |
| **Deployment** | Ansible role `docs` on indri (no daemon — Caddy serves files directly) | | **Deployment** | Ansible role `docs` on indri (no daemon — Caddy serves files directly) |
| **Content dir** | `~/docs/content/` on indri | | **Content dir** | `~/blumeops/docs/content/` on indri |
| **Source** | `docs/` directory in blumeops repo | | **Source** | `docs/` directory in blumeops repo |
| **Build** | Forgejo workflow `build-blumeops.yaml` | | **Build** | Forgejo workflow `build-blumeops.yaml` |
@ -28,7 +28,7 @@ Migrated from minikube to indri-native on 2026-04-29 (see [[docs-on-indri]]).
1. **Source**: Markdown files in `docs/` with Obsidian-compatible wiki-links 1. **Source**: Markdown files in `docs/` with Obsidian-compatible wiki-links
2. **Build**: `Build BlumeOps` Forgejo workflow runs towncrier + Quartz, uploads tarball as a release asset, and bumps `docs_version` in the ansible role 2. **Build**: `Build BlumeOps` Forgejo workflow runs towncrier + Quartz, uploads tarball as a release asset, and bumps `docs_version` in the ansible role
3. **Deploy**: ansible role downloads the tarball into `~/docs/content/` on indri; Caddy serves the directory directly with Quartz-style `try_files` (path → path/ → path.html → 404.html) 3. **Deploy**: ansible role downloads the tarball into `~/blumeops/docs/content/` on indri; Caddy serves the directory directly with Quartz-style `try_files` (path → path/ → path.html → 404.html)
## Configuration ## Configuration

View file

@ -226,7 +226,7 @@ services:
current-version: "1.0.3" current-version: "1.0.3"
upstream-source: https://forge.eblu.me/eblume/cv upstream-source: https://forge.eblu.me/eblume/cv
notes: >- notes: >-
Static tarball downloaded by ansible/roles/cv into ~/cv/content on indri; Static tarball downloaded by ansible/roles/cv into ~/blumeops/cv/content on indri;
served directly by Caddy (kind=static). Migrated from minikube 2026-04-29. served directly by Caddy (kind=static). Migrated from minikube 2026-04-29.
Review build deps (WeasyPrint, Jinja2) in source repo on upstream review. Review build deps (WeasyPrint, Jinja2) in source repo on upstream review.
@ -236,7 +236,7 @@ services:
current-version: "1.28.2" current-version: "1.28.2"
upstream-source: https://forge.eblu.me/eblume/blumeops/releases upstream-source: https://forge.eblu.me/eblume/blumeops/releases
notes: >- notes: >-
Quartz-built tarball downloaded by ansible/roles/docs into ~/docs/content Quartz-built tarball downloaded by ansible/roles/docs into ~/blumeops/docs/content
on indri; served directly by Caddy (kind=static, try_html). Migrated from on indri; served directly by Caddy (kind=static, try_html). Migrated from
minikube 2026-04-29. current-version still tracks the legacy quartz/nginx minikube 2026-04-29. current-version still tracks the legacy quartz/nginx
base; will switch to the docs release tag (e.g. v1.16.0) once the dead base; will switch to the docs release tag (e.g. v1.16.0) once the dead