Refactor Docker backups into modular pipeline

This commit is contained in:
Codex authored and howard committed 2026-09-20 21:34:26 +12:00
1 parent 3ba4b7f738
commit 261e88f5dc
12 files changed
+480 -848

No files matched your search

+62
View File
@@ -0,0 +1,62 @@
#!/usr/bin/env bash
set -Eeuo pipefail
SCRIPT_ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd -P)"
ENV_FILE="${DOCKERBACKUP_ENV:-$SCRIPT_ROOT/.env}"
SOURCE_BASE_DIR="/dockervolumes"
BACKUP_ROOT="/dockerbackups"
CONTAINERS_FILE="$SCRIPT_ROOT/containers.txt"
BACKUP_HOSTNAME="$(hostname -s)"
BACKUP_METHODS="rclone smb"
KEEP_COUNT=5
PULL_IMAGES=1
START_TIMEOUT=90
WAIT_INTERVAL=3
START_RETRIES=1
LOCK_FILE="/run/lock/zorruno-docker-backup.lock"
RCLONE_ENABLED=0
RCLONE_REMOTE=""
RCLONE_EXTRA_ARGS=""
SMB_ENABLED=0
SMB_MOUNT=""
SMB_HOST_SUBDIR=1
SMB_RSYNC_ARGS="-a"
if [[ -f "$ENV_FILE" ]]; then
set -a
# shellcheck disable=SC1090
. "$ENV_FILE"
set +a
fi
# Ease migration from the original prune script's .env names.
if [[ -n "${SOURCE_DIR:-}" && "$BACKUP_ROOT" == "/dockerbackups" ]]; then
BACKUP_ROOT="$SOURCE_DIR"
fi
timestamp() { date '+%F %T'; }
log() { printf '%s [%s] %s\n' "$(timestamp)" "$1" "$2" >&2; }
die() { log ERROR "$1"; exit "${2:-1}"; }
is_true() {
case "${1,,}" in
1|true|yes|on|enabled) return 0 ;;
*) return 1 ;;
esac
}
require_command() {
command -v "$1" >/dev/null 2>&1 || die "Required command not found: $1" 3
}
require_positive_integer() {
[[ "$2" =~ ^[1-9][0-9]*$ ]] || die "$1 must be a positive integer (received: $2)" 2
}
resolve_path() {
if [[ "$1" = /* ]]; then printf '%s\n' "$1"; else printf '%s/%s\n' "$SCRIPT_ROOT" "$1"; fi
}
run_id() { date '+%Y-%m-%d_%H-%M-%S'; }