Files
esh-pfi-infrastructure/docs
vh c4b2278e7d feat(esh-pve-nas): stage the PVE root migration off the USB DOM
Everything but the reboot. Two rerunnable elway playbooks; the host is
still running from the ext4 root and its boot path is byte-identical to
the last 140 days, because grub-install is deliberately held back to the
cutover window.

Phase 1 (esh-pve-nas-stage-zfs-root.yaml): carve a 512 MB /boot LV out
of the 768 MB swap LV, populate it, rsync the 4.3 GB ext4 root into
nvme/ROOT/pve-1, write the copy's fstab.

Phase 2 (esh-pve-nas-stage-bootloader.yaml): ZFS initramfs, grub.cfg,
explicit pve-zfs-root and pve-ext4-rollback entries with stable ids,
grubenv pinned to the rollback so cutover's grub-reboot is a one-shot.

Three landmines the plan did not predict, all caught by verify steps
asserting effective state rather than by reading the plan:

- The /boot LV had nowhere to live. VG pve had 4 MB free and mounted
  ext4 cannot shrink; freeing space from root needs a rescue boot, which
  costs the one-reboot property. Space came from swap (768M -> 256M).

- The runbook's `zpool set cachefile=... nvme` would have broken the
  NAS. Populating a cachefile flips the host from import-by-scan to
  import-by-cache, so a one-pool cache leaves ssd and tank unimported --
  and CT 103 esh-nas has twelve bind mounts spanning all three pools.
  Set on all three instead, verified in the resulting cache.

- update-grub silently emitted a pool-less root=ZFS=/ROOT/pve-1, which
  boots to an initramfs prompt. Debian's 10_linux builds ${rpool}${bootfs}
  and rpool comes from grub-probe --target=fs_label, which returns empty
  because GRUB's ZFS reader cannot open a pool with encryption,
  large_dnode and zstd_compress -- the same feature set that forced /boot
  to stay ext4. The probe failure is swallowed by `2>/dev/null || true`.
  Fixed with a /etc/default/grub.d drop-in plus explicit menu entries.

The transferable lesson: the original verify grepped for the correct
root= string appearing somewhere in grub.cfg, which passes while every
menu entry is still broken. Assert the effective value, not the presence
of a substring.
2026-08-17 22:11:14 -07:00
..

docs/

Navigation map for the documentation tree. New session? Read orientation.md first — it's the narrative overview of the fleet, backup architecture, governing principles, and gotchas, and it points at everything else.

Tree

docs/
├── orientation.md            # start here — fleet overview + where-to-look guide
├── runbooks/                 # ops runbooks (recovery, deployment phases)
│   ├── disaster-recovery.md
│   ├── nh3-prune-ritual.md
│   └── pbs-deployment.md
└── pfi/                      # PFI-specific reference (services, models, VMs)
    ├── docker-stack.md
    ├── model-list.md
    ├── proxmox-vms.md
    ├── recommended-model-settings.md
    ├── vm-102-matrix-appservice.md
    └── vm-102-matrix-synapse.md

What goes where

  • runbooks/ — step-by-step ops procedures. Anything you'd reach for during an incident or while standing up new infrastructure. Examples: disaster recovery (blast-radius tiers + restoration steps), PBS deployment (9-phase rollout). New runbook → new file here.
  • pfi/ — PFI-specific reference material that's too narrow for the top-level CLAUDE.md but doesn't change incident response. AI model inventory, recommended inference settings, Matrix bridge config, Proxmox VM map. New stable reference → new file here.
  • Top-level (docs/orientation.md, docs/README.md) — narrative guides about the workspace itself, not about specific infra.

Cross-references

  • Fleet topology + servers table: top-level CLAUDE.md.
  • Open work + recent milestones: top-level STATUS.md.
  • Durable cross-session facts: ~/.claude/projects/-home-lkraven-development-eshpfi-management/memory/.

Conventions

  • Markdown, GitHub-flavored. CommonMark renders fine in most viewers.
  • File names are lowercase-kebab-case, descriptive. No dates in filenames — git history covers that.
  • One topic per file. If a file grows past ~500 lines, look for a natural split before adding more.
  • No checked-in binaries or checksums. Build/release artifacts belong in a build pipeline or tools/, not docs/.