F-S2 + F-S3: compose-derived appdata dir resolution (v0.131.0)
The controller assumed an app's HDD appdata dir is always appdata/<stackName>.
paperless-ngx writes appdata/paperless (stack paperless-ngx), so every consumer
keying by stack name silently missed it via a stat-and-skip. One canonical
resolver appbackup.AppDataDirNames derives the real dir name(s) from the app's
compose ${HDD_PATH} binds; all consumers use it.
- F-S2 (tier-2): RunTier2 mirrors the resolved appdata/<name> (paperless docs
got NO tier-2 copy before). Tier2Info size + RestoreTier2Files live dir use it.
WARN when a declared appdata dir is absent. New tier2Mirror seam.
- F-S3 (migrate, NEW): all six per-app appdata legs (collision/size/copy/verify/
cleanup/skip-set) now loop resolved names. scope="app" migration of paperless
previously copied nothing and left an empty media dir (scope="all" was saved by
the merge walk). WARN on missing declared dir in the copy leg.
- Multi-dir (N>1) refusal: tier-2 backup/info/restore refuse loudly (Hungarian);
migrate supports N. No catalog app hits it today; lifted by Task 3.
- Display: storage page sums resolved dirs.
- Truth repair: the v0.130.0 "tier-2 copies the namespace wholesale" claim is
false; corrected in CHANGELOG + main.go export-adapter comment.
+9 tests; red-proofs RP-1..RP-5 all confirmed. Controller-only, no agent/hub
coupling. Task 1 of the backup-classification-redesign arc.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A45Qop8YY8tS94bz63LFne
This commit is contained in:
@@ -1357,8 +1357,11 @@ func (a *exportAdapter) GetStackHDDMounts(name string) []string {
|
||||
// C6B-F1 (v0.130.0): union ${HDD_PATH} binds + the ${USERDATA_PATH} root. The old
|
||||
// ParseComposeHDDMounts-only call was blind to the standard userdata convention, so
|
||||
// 12/13 needs_hdd catalog apps exported hollow (config-only) bundles. The backup-side
|
||||
// stackAdapter is intentionally NOT changed — the scheduled/tier-2 path copies the
|
||||
// felhom-data namespace wholesale and its mount list is size/inventory display only.
|
||||
// stackAdapter is intentionally NOT changed here — the scheduled/tier-2 path copies the
|
||||
// recovery unit + the app's resolved appdata/<name> dir(s) only (NOT the userdata tree —
|
||||
// F-S1; NOT the namespace wholesale), and derives that dir name from the compose binds
|
||||
// (F-S2, see backup.tier2AppDataName). Spec:
|
||||
// felhom.eu/documentation/audits/SPIKE-backup-classification-2026-07-14.md.
|
||||
return stacks.ExportDataMounts(s.ComposePath, appCfg.Env["HDD_PATH"])
|
||||
}
|
||||
return nil
|
||||
|
||||
Reference in New Issue
Block a user