feat: drive migration & Tier 2 restic deprecation (v0.18.0)

Phase 1: Deprecate restic as Tier 2 method (rsync only), auto-migrate on startup
Phase 2: Enhanced per-app migration with backup awareness, DB dump copy, auto-cleanup
Phase 3: Full drive migration with decommissioned state, rollback support, wizard UI
Phase 4: Hub report includes decommissioned drive state

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-19 21:49:14 +01:00
parent bdbe170a54
commit 99bf3ca7a8
22 changed files with 1725 additions and 402 deletions
+8
View File
@@ -133,6 +133,11 @@ func (w *StorageWatchdog) Check(ctx context.Context) error {
}
state.lastProbeTime = time.Now()
// Skip decommissioned drives entirely — no apps reference them
if sp.Decommissioned {
continue
}
if sp.Disconnected {
w.handleReconnectCheck(ctx, sp)
} else {
@@ -434,6 +439,9 @@ func (w *StorageWatchdog) SafeDisconnect(ctx context.Context, path string) (stop
if sp.Disconnected {
return nil, fmt.Errorf("drive already disconnected")
}
if sp.Decommissioned {
return nil, fmt.Errorf("drive is decommissioned — no apps to stop")
}
label := sp.Label
if label == "" {