scripts/restore.sh

#!/usr/bin/env bash
# Pull one snapshot back from B2 into a staging directory.
# Usage: restore.sh <YYYY-MM-DD> [--dry-run]
# Never writes back into /srv/data directly; you move it yourself after
# inspecting. See mercemay.top/src/homelab-compose/.
set -euo pipefail

REMOTE="${REMOTE:-b2:homelab-backup}"
STAGE="${STAGE:-/srv/restore}"

if [[ $# -lt 1 ]]; then
	echo "usage: $0 <YYYY-MM-DD> [--dry-run]" >&2
	exit 2
fi

snap="$1"
shift
dry_run=0
while [[ $# -gt 0 ]]; do
	case "$1" in
		--dry-run) dry_run=1 ;;
		*) echo "unknown arg: $1" >&2; exit 2 ;;
	esac
	shift
done

if ! [[ "$snap" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
	echo "bad snapshot id: $snap" >&2
	exit 2
fi

dest="$STAGE/$snap"
mkdir -p "$dest"

echo "pulling $REMOTE/$snap -> $dest"
flags=(--transfers 4 --checkers 8 --progress)
if (( dry_run )); then
	flags+=(--dry-run)
fi

rclone copy "${flags[@]}" "$REMOTE/$snap" "$dest"

if (( dry_run )); then
	echo "dry-run complete; nothing copied"
	exit 0
fi

echo
echo "restored into $dest"
echo "next steps:"
echo "  1. stop the relevant compose service:  docker compose stop <svc>"
echo "  2. rsync from $dest into the live volume you want to roll back"
echo "  3. start it back up:                    docker compose up -d <svc>"
echo
echo "this script intentionally does not overwrite /srv/data."