// Package appbackup holds the self-contained app-data backup primitives: // database dump and Docker-volume archive discovery/execution, plus the // keep-side storage path helpers. It depends only on stable abstractions // (the StackDataProvider interface) and has no dependency on the restic, // cross-drive, or drive-mount code in the backup package. package appbackup import "path/filepath" // FelhomDataDir is the namespace directory on storage drives for all felhom-managed data. const FelhomDataDir = "felhom-data" // NamespaceRoot resolves the felhom-data namespace ROOT for a drive path. All the path helpers // below take this namespace root (the directory that directly contains backups/ and appdata/), // NOT a bare drive path — they do not append felhom-data themselves. // // Model A (slice 10): the host agent binds /felhom-data onto the guest mountpoint, so an // enrolled user-data drive's IN-GUEST mount already IS the namespace root (and its basename need // NOT be "felhom-data" — e.g. /mnt/felhom-usb). For such mounts pass inGuestDrive=true → the path // is returned as-is, so callers no longer double-nest into .../felhom-data/felhom-data/... . // // For a bare drive root that still holds a felhom-data SUBDIR — the SSD-only system-data fallback, // or any legacy host-side layout — pass inGuestDrive=false → the felhom-data segment is appended. func NamespaceRoot(drivePath string, inGuestDrive bool) string { if inGuestDrive { return filepath.Clean(drivePath) } return filepath.Join(drivePath, FelhomDataDir) } // PrimaryBackupPath returns the root primary backup directory under a felhom-data namespace root. func PrimaryBackupPath(nsRoot string) string { return filepath.Join(nsRoot, "backups", "primary") } // AppDBDumpPath returns the DB dump directory for an app under a felhom-data namespace root. func AppDBDumpPath(nsRoot, stackName string) string { return filepath.Join(nsRoot, "backups", "primary", stackName, "db-dumps") } // AppVolumeDumpPath returns the Docker-volume dump-tar directory for an app under a namespace root. func AppVolumeDumpPath(nsRoot, stackName string) string { return filepath.Join(nsRoot, "backups", "primary", stackName, "volume-dumps") } // AppDataDir returns the app data directory under a felhom-data namespace root. func AppDataDir(nsRoot, stackName string) string { return filepath.Join(nsRoot, "appdata", stackName) }