Add per-workload capture of host-bind data volumes as downloadable tar.gz archives: a new internal/volsnap engine (enumerate host-bind volumes via the computeMounts merge, archive with archive/tar+gzip skipping symlinks/special files, per-workload retention + startup orphan cleanup), a volume_snapshots table + store CRUD, admin-gated API (list/snapshotable/create/download/delete), and a Snapshots panel on /apps/[id] that shows coverage and which volumes are skipped (and why). Scope: image-source apps, host-bind scopes (absolute/stage/project); Docker named volumes, tmpfs, and instance scope are surfaced as not-yet-supported. Restore is a separate later phase. Download/FilePath are containment-checked; create returns a typed no-data error (400) vs generic 500. Covered by archiver unit tests + full API e2e.
This commit is contained in:
@@ -37,6 +37,7 @@ import (
|
||||
"github.com/alexei/tinyforge/internal/stale"
|
||||
"github.com/alexei/tinyforge/internal/stats"
|
||||
"github.com/alexei/tinyforge/internal/store"
|
||||
"github.com/alexei/tinyforge/internal/volsnap"
|
||||
"github.com/alexei/tinyforge/internal/webhook"
|
||||
"github.com/alexei/tinyforge/internal/workload/plugin"
|
||||
|
||||
@@ -323,6 +324,19 @@ func main() {
|
||||
}
|
||||
dep.SetPreDeployBackuper(backupEngine)
|
||||
|
||||
// Initialize volume-snapshot engine (per-workload data-volume archives).
|
||||
snapshotEngine, err := volsnap.New(db, dataDir)
|
||||
if err != nil {
|
||||
slog.Error("create snapshot engine", "error", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
// Reclaim snapshot files orphaned by workload deletes (rows CASCADE, files don't).
|
||||
if cleaned, err := snapshotEngine.CleanOrphans(); err != nil {
|
||||
slog.Warn("snapshots: clean orphans on startup", "error", err)
|
||||
} else if cleaned > 0 {
|
||||
slog.Info("snapshots: cleaned orphan files on startup", "count", cleaned)
|
||||
}
|
||||
|
||||
// Clean orphaned backup files and prune on startup.
|
||||
if cleaned, err := backupEngine.CleanOrphans(); err != nil {
|
||||
slog.Warn("backup: clean orphans on startup", "error", err)
|
||||
@@ -404,6 +418,7 @@ func main() {
|
||||
apiServer.SetStaleScanner(staleScanner)
|
||||
apiServer.SetLogScanReloader(logScanMgr)
|
||||
apiServer.SetBackupEngine(backupEngine)
|
||||
apiServer.SetSnapshotEngine(snapshotEngine)
|
||||
apiServer.SetDBPath(dbPath)
|
||||
apiServer.SetBackupSettingsChangedCallback(scheduleAutobackup)
|
||||
apiServer.SetDNSProvider(dnsProvider)
|
||||
|
||||
Reference in New Issue
Block a user