My unified nix flake for all configuration management.
  • Nix 82.4%
  • Shell 8.3%
  • Python 3.5%
  • TypeScript 2.9%
  • CSS 1.7%
  • Other 1.1%
Find a file
Daniel Flanagan d7e15b21c8
All checks were successful
/ check-format (push) Successful in 10s
/ build (push) Has been skipped
feat(beefcake): move cold persist state off the SSD onto zstorage
battleship rpool (222G SSD, backing the guest zvols) hit 100% and paused the
guest on 2026-07-21. Audit of the guest 30.6G /persist showed the pressure is
NOT data worth keeping on SSD:

  var/cache/restic-backups-*  15.0G  systemd CacheDirectory, rebuildable
  root/.cache                  5.1G  cache
  var/lib/jellyfin             3.8G  regenerable metadata/artwork
  var/log                      1.7G  journal + caddy
  forgejo (repos+db+indexers)  1.3G  <- the actually-hot set

Move the restic caches and jellyfin metadata (~19G) to /storage, which is
virtiofs onto zstorage (2.4T free). They still survive reboots -- the original
comment persisted the restic caches deliberately so post-reboot runs do not
re-fetch indexes from the remote sftp repos, and that property is preserved.

forgejo deliberately STAYS on the SSD: virtiofs is ~430x slower for git (see
forgejo.nix) and PR #756 fixed 2-7s repo pages precisely by getting git off it.
Moving /persist wholesale to zstorage would have re-broken that while leaving
the caches on SSD -- exactly backwards.

Implemented as explicit fileSystems binds with depends = [ "/storage" ] rather
than a second environment.persistence root: impermanence emits its bind units
with DefaultDependencies=false and NO ordering against /storage, so they could
bind before the virtiofs mount exists and services would silently write to the
EPHEMERAL root and lose data at the next reboot. Verified the generated fstab
carries x-systemd.requires-mounts-for=/storage on all four binds.

Deferred deliberately: /root/.cache (5.1G) nests inside the wholesale-persisted
/root, and /var/log (1.7G) is better handled by capping journald SystemMaxUse.

NOT A PLAIN DEPLOY -- the data must be migrated first, see the PR body.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015dwmWkDcFN7CnZ5TmLK9nY
2026-07-21 13:13:36 -05:00
.forgejo/workflows ci: gate the build skip on the default branch, not hardcoded "main" 2026-06-26 16:05:31 -05:00
.helix Format 2025-02-14 13:31:18 -06:00
dotfiles docs(agents): reconcile agent instructions; scope global vs repo 2026-07-17 10:06:55 -05:00
issues fix(nix): scope nix.gc to the beefcake guest, not the whole fleet 2026-07-21 12:33:07 -05:00
lib fix(nix): scope nix.gc to the beefcake guest, not the whole fleet 2026-07-21 12:33:07 -05:00
packages feat(beefcake): move cold persist state off the SSD onto zstorage 2026-07-21 13:13:36 -05:00
prototypes/beefcake-impermanence style: nix fmt beefcake-lite.nix 2026-07-19 00:43:09 -05:00
secrets fix(fennec): complete syncthing provisioning (missed in #790) 2026-07-21 10:19:07 -05:00
.envrc feat: fix nix-direnv since removal of home-manager 2026-07-07 09:37:20 -05:00
.gitignore proto(beefcake): hands-on Model B demo — thin host VM + blue/green slots with real services 2026-07-06 12:32:37 -05:00
.sops.yaml feat(fennec): pre-provision host identity (ssh host key, sops, syncthing) 2026-07-19 01:13:21 -05:00
AGENTS.md docs(agents): blue/green auto-cutover is the routine path; migration-bearing = manual tier 2026-07-19 00:48:20 -05:00
CLAUDE.md refactor: make CLAUDE.md a symlink to AGENTS.md 2026-03-23 17:14:34 -05:00
flake.lock feat(beefcake): Phase-3 kickoff — libvirt+NixVirt substrate decision + input 2026-07-10 11:23:49 -05:00
flake.nix feat(beefcake): Phase-3 kickoff — libvirt+NixVirt substrate decision + input 2026-07-10 11:23:49 -05:00
In-Memory fix: grant daniel oauth2 admin access for Kanidm 2026-03-20 15:31:23 -05:00
readme.md refactor(modules): relocate lib/modules/home out of the misleading "home" name 2026-07-17 10:01:13 -05:00
run-claude-sandbox.sh feat: add n8n 2025-11-20 21:15:27 -06:00