From 21e8df1e3ad7cc0c3ec99e0027767e58811f27ce Mon Sep 17 00:00:00 2001 From: kisfenyo Date: Tue, 14 Jul 2026 18:51:36 +0200 Subject: [PATCH] backup classification: backup: blocks for the 13 bind-bearing apps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the referential-coupling backup: block to every app that binds ${HDD_PATH}/${USERDATA_PATH} (immich, paperless-ngx, nextcloud, calibre-web, audiobookshelf, komga, navidrome, radarr, sonarr, emby, jellyfin, plex, romm). Each lists its userdata:/hdd: binds with class mandatory|optional|excluded (operator-ruled + spike SQ2). Requires controller v0.132.0 (deployed) which parses+validates these blocks. INERT — no backup tier changes behavior yet (Task 3/4 consume it). All 13 verified against the shipped parser: parse-clean, every bind resolves explicit. audiobookshelf media/audiobooks = optional (PENDING Viktor veto to excluded). Ref: felhom.eu/documentation/audits/SPIKE-backup-classification-2026-07-14.md --- CHANGELOG.md | 19 +++++++++++++++++++ templates/audiobookshelf/.felhom.yml | 10 ++++++++++ templates/calibre-web/.felhom.yml | 8 ++++++++ templates/emby/.felhom.yml | 6 ++++++ templates/immich/.felhom.yml | 9 +++++++++ templates/jellyfin/.felhom.yml | 6 ++++++ templates/komga/.felhom.yml | 6 ++++++ templates/navidrome/.felhom.yml | 6 ++++++ templates/nextcloud/.felhom.yml | 6 ++++++ templates/paperless-ngx/.felhom.yml | 11 +++++++++++ templates/plex/.felhom.yml | 6 ++++++ templates/radarr/.felhom.yml | 8 ++++++++ templates/romm/.felhom.yml | 9 +++++++++ templates/sonarr/.felhom.yml | 8 ++++++++ 14 files changed, 118 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b05c8a..accf44e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,24 @@ # Changelog +## 2026-07-14 — backup classification `backup:` blocks for the 13 bind-bearing apps (controller v0.132.0) + +Adds the referential-coupling `backup:` classification block to every catalog app that binds +`${HDD_PATH}`/`${USERDATA_PATH}` (13 apps: immich, paperless-ngx, nextcloud, calibre-web, +audiobookshelf, komga, navidrome, radarr, sonarr, emby, jellyfin, plex, romm). Each block lists its +`userdata:`/`hdd:` binds with a `class ∈ {mandatory, optional, excluded}` (COUPLED / +DECOUPLED-precious / DECOUPLED-bulk); classes are operator-ruled (Viktor, 2026-07-14) + spike SQ2. + +Requires **controller v0.132.0**, which parses + validates these blocks (Task 2 of the +backup-classification-redesign arc, `felhom.eu/documentation/audits/SPIKE-backup-classification-2026-07-14.md`). +The classification is **INERT** — no backup tier changes behavior yet; Task 3 (tier policy engine) +and Task 4 (manual `.fab` UI) consume it. All 13 blocks were verified against the shipped controller +parser: parse-clean, every bind resolves `explicit` to its ruled class (zero validation errors). + +Notes: audiobookshelf `media/audiobooks` = **optional** (consistency with komga/romm curated media; +the spike proposed excluded — PENDING a Viktor veto). radarr/sonarr `downloads` = excluded (transient +cross-app queue). emby/jellyfin/plex `media` = excluded (`:ro` readers; state in volumes). The 42 +volume-only apps get no block (classification moot — state rides in the recovery unit's volume dumps). + ## 2026-07-12 — image pinning sweep: `:latest` eliminated from all templates (5 pins) + standing gate A catalog sweep found 5/53 templates with unpinned images. Beyond version discipline, `:latest` diff --git a/templates/audiobookshelf/.felhom.yml b/templates/audiobookshelf/.felhom.yml index a9942d2..2faa533 100644 --- a/templates/audiobookshelf/.felhom.yml +++ b/templates/audiobookshelf/.felhom.yml @@ -16,6 +16,16 @@ resources: pi_compatible: true needs_hdd: true +# --- Backup classification (referential coupling; see felhom.eu documentation/audits/SPIKE-backup-classification-2026-07-14.md) --- +backup: + userdata: + - path: media/audiobooks + class: optional # PENDING-VETO: spike chose excluded; ruled optional for consistency + # with komga/romm (curated, often personally ripped — precious). + # If Viktor rules excluded, flip THIS LINE ONLY before committing. + - path: media/podcasts + class: excluded # re-downloadable by definition + # --- Deploy fields (first deployment only) --- deploy_fields: - env_var: DOMAIN diff --git a/templates/calibre-web/.felhom.yml b/templates/calibre-web/.felhom.yml index 568c72d..bd20943 100644 --- a/templates/calibre-web/.felhom.yml +++ b/templates/calibre-web/.felhom.yml @@ -16,6 +16,14 @@ resources: pi_compatible: false needs_hdd: true +# --- Backup classification (referential coupling; see felhom.eu documentation/audits/SPIKE-backup-classification-2026-07-14.md) --- +backup: + userdata: + - path: media/books + class: mandatory # metadata.db lives INSIDE the tree — DB and books are one unit + - path: import/calibre + class: excluded # ingest inbox, transient + # --- Deploy fields (first deployment only) --- deploy_fields: - env_var: DOMAIN diff --git a/templates/emby/.felhom.yml b/templates/emby/.felhom.yml index b945ec2..b656472 100644 --- a/templates/emby/.felhom.yml +++ b/templates/emby/.felhom.yml @@ -16,6 +16,12 @@ resources: pi_compatible: false needs_hdd: true +# --- Backup classification (referential coupling; see felhom.eu documentation/audits/SPIKE-backup-classification-2026-07-14.md) --- +backup: + userdata: + - path: media + class: excluded # pure reader of the shared tree (:ro); state lives in volumes + # --- Deploy fields (first deployment only) --- deploy_fields: - env_var: DOMAIN diff --git a/templates/immich/.felhom.yml b/templates/immich/.felhom.yml index bb5d27f..2ac0b19 100644 --- a/templates/immich/.felhom.yml +++ b/templates/immich/.felhom.yml @@ -21,6 +21,15 @@ resources: pi_compatible: false needs_hdd: true +# --- Backup classification (referential coupling; see felhom.eu documentation/audits/SPIKE-backup-classification-2026-07-14.md) --- +backup: + hdd: + - path: appdata/immich + class: mandatory # managed upload library — DB-referenced (SQ3: restore-without = broken) + userdata: + - path: media/photos + class: optional # external library, :ro — precious but re-scanned (explicit overrides ro-default) + # --- Deploy fields --- deploy_fields: - env_var: DOMAIN diff --git a/templates/jellyfin/.felhom.yml b/templates/jellyfin/.felhom.yml index 0aa5822..d93d2c6 100644 --- a/templates/jellyfin/.felhom.yml +++ b/templates/jellyfin/.felhom.yml @@ -16,6 +16,12 @@ resources: pi_compatible: false needs_hdd: true +# --- Backup classification (referential coupling; see felhom.eu documentation/audits/SPIKE-backup-classification-2026-07-14.md) --- +backup: + userdata: + - path: media + class: excluded # pure reader of the shared tree (:ro); state lives in volumes + # --- Deploy fields (first deployment only) --- deploy_fields: - env_var: DOMAIN diff --git a/templates/komga/.felhom.yml b/templates/komga/.felhom.yml index 525848d..0a303d9 100644 --- a/templates/komga/.felhom.yml +++ b/templates/komga/.felhom.yml @@ -16,6 +16,12 @@ resources: pi_compatible: true needs_hdd: true +# --- Backup classification (referential coupling; see felhom.eu documentation/audits/SPIKE-backup-classification-2026-07-14.md) --- +backup: + userdata: + - path: media/comics + class: optional # ruled: precious-decoupled (re-scanned, hand-curated) + # --- Deploy fields (first deployment only) --- deploy_fields: - env_var: DOMAIN diff --git a/templates/navidrome/.felhom.yml b/templates/navidrome/.felhom.yml index 407ccee..1746e46 100644 --- a/templates/navidrome/.felhom.yml +++ b/templates/navidrome/.felhom.yml @@ -16,6 +16,12 @@ resources: pi_compatible: true needs_hdd: true +# --- Backup classification (referential coupling; see felhom.eu documentation/audits/SPIKE-backup-classification-2026-07-14.md) --- +backup: + userdata: + - path: media/music + class: excluded # re-rippable bulk, :ro, shared tree + # --- Deploy fields (first deployment only) --- deploy_fields: - env_var: DOMAIN diff --git a/templates/nextcloud/.felhom.yml b/templates/nextcloud/.felhom.yml index d536a08..f907936 100644 --- a/templates/nextcloud/.felhom.yml +++ b/templates/nextcloud/.felhom.yml @@ -16,6 +16,12 @@ resources: pi_compatible: false needs_hdd: true +# --- Backup classification (referential coupling; see felhom.eu documentation/audits/SPIKE-backup-classification-2026-07-14.md) --- +backup: + hdd: + - path: appdata/nextcloud + class: mandatory # THE user files — oc_filecache/shares reference them + # --- Deploy fields (first deployment only) --- deploy_fields: - env_var: DOMAIN diff --git a/templates/paperless-ngx/.felhom.yml b/templates/paperless-ngx/.felhom.yml index a8ad579..bf5be0b 100644 --- a/templates/paperless-ngx/.felhom.yml +++ b/templates/paperless-ngx/.felhom.yml @@ -32,6 +32,17 @@ resources: pi_compatible: true # Runs on Raspberry Pi 3B+ needs_hdd: true # Needs external storage for user data +# --- Backup classification (referential coupling; see felhom.eu documentation/audits/SPIKE-backup-classification-2026-07-14.md) --- +backup: + hdd: + - path: appdata/paperless/media + class: mandatory # document originals+archive — DB hashes/paths reference them + - path: appdata/paperless/export + class: excluded # transient export target + userdata: + - path: import/paperless + class: excluded # consume inbox — deleted after ingest by contract + # --- Deploy fields --- # Shown to the user during first deployment. # After deployment, values are saved to app.yaml in the stack directory. diff --git a/templates/plex/.felhom.yml b/templates/plex/.felhom.yml index c009c7f..32d04f6 100644 --- a/templates/plex/.felhom.yml +++ b/templates/plex/.felhom.yml @@ -16,6 +16,12 @@ resources: pi_compatible: false needs_hdd: true +# --- Backup classification (referential coupling; see felhom.eu documentation/audits/SPIKE-backup-classification-2026-07-14.md) --- +backup: + userdata: + - path: media + class: excluded # pure reader of the shared tree (:ro); state lives in volumes + # --- Deploy fields (first deployment only) --- deploy_fields: - env_var: DOMAIN diff --git a/templates/radarr/.felhom.yml b/templates/radarr/.felhom.yml index 5071614..09957b2 100644 --- a/templates/radarr/.felhom.yml +++ b/templates/radarr/.felhom.yml @@ -16,6 +16,14 @@ resources: pi_compatible: true needs_hdd: true +# --- Backup classification (referential coupling; see felhom.eu documentation/audits/SPIKE-backup-classification-2026-07-14.md) --- +backup: + userdata: + - path: media/movies + class: excluded # re-downloadable by design + - path: downloads + class: excluded # ruled: transient queue (cross-app shared with sonarr) + # --- Deploy fields (first deployment only) --- deploy_fields: - env_var: DOMAIN diff --git a/templates/romm/.felhom.yml b/templates/romm/.felhom.yml index 36526df..250c82f 100644 --- a/templates/romm/.felhom.yml +++ b/templates/romm/.felhom.yml @@ -16,6 +16,15 @@ resources: pi_compatible: false needs_hdd: true +# --- Backup classification (referential coupling; see felhom.eu documentation/audits/SPIKE-backup-classification-2026-07-14.md) --- +backup: + userdata: + - path: roms + class: optional # ruled: curated ROM sets often not re-acquirable + hdd: + - path: appdata/romm/resources + class: excluded # scraper cache, re-derivable + # --- Deploy fields (first deployment only) --- deploy_fields: - env_var: DOMAIN diff --git a/templates/sonarr/.felhom.yml b/templates/sonarr/.felhom.yml index b6a6306..df4e814 100644 --- a/templates/sonarr/.felhom.yml +++ b/templates/sonarr/.felhom.yml @@ -16,6 +16,14 @@ resources: pi_compatible: true needs_hdd: true +# --- Backup classification (referential coupling; see felhom.eu documentation/audits/SPIKE-backup-classification-2026-07-14.md) --- +backup: + userdata: + - path: media/tv + class: excluded + - path: downloads + class: excluded + # --- Deploy fields (first deployment only) --- deploy_fields: - env_var: DOMAIN