#!/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."