Files
dockhand-upstream/src/lib/server/backups/reap-core.ts
T
2026-07-25 08:41:01 +02:00

32 lines
1.3 KiB
TypeScript

/**
* Pure predicate for reaping orphaned backup/restore helper containers left by a
* crashed process. NO DB / docker import, so it is unit-testable directly.
*
* Ownership is fail-closed on purpose: on a shared Docker daemon another Dockhand
* install's in-flight helper matches our name prefix too. We only reap a container
* whose `dockhand.instance` label equals OUR instance id — a missing or foreign
* label means we can't prove we own it, so we leave it alone rather than kill a
* co-located install's live helper.
*/
/** Name prefixes the backup/restore engine gives its throwaway helper containers. */
export const BACKUP_HELPER_PREFIXES = ['dockhand-backup', 'dockhand-restore'] as const;
/** The label key stamped on every helper container carrying its owner's instance id. */
export const INSTANCE_LABEL = 'dockhand.instance';
/**
* True iff a container is one of THIS installation's orphaned backup/restore
* helpers: its name has a helper prefix AND its instance label matches. A missing
* or foreign label fails closed (returns false).
*/
export function isOwnedBackupHelper(
name: string | undefined,
labels: Record<string, string> | undefined,
myInstance: string,
): boolean {
if (!name) return false;
if (!BACKUP_HELPER_PREFIXES.some((p) => name.startsWith(p))) return false;
return labels?.[INSTANCE_LABEL] === myInstance;
}