#!/bin/sh set -eu PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) cd "$PROJECT_DIR" if [ "$#" -ne 1 ]; then echo "Usage: $0 " echo "Example: $0 backups/mineseeker-rustfs.2026-10-24.120000.tar.gz" exit 1 fi BACKUP_FILE=$1 if [ ! -f "$BACKUP_FILE" ]; then echo "Error: Backup file not found: $BACKUP_FILE" exit 1 fi BACKUP_DIR=$(CDPATH= cd -- "$(dirname -- "$BACKUP_FILE")" && pwd) BACKUP_NAME=$(basename "$BACKUP_FILE") CONTAINER_ID=$(docker compose ps -q rustfs) if [ -z "$CONTAINER_ID" ]; then echo "Error: The MineSeeker RustFS service must be running before restore." exit 1 fi VOLUME_NAME=$(docker inspect "$CONTAINER_ID" --format '{{range .Mounts}}{{if eq .Destination "/data"}}{{.Name}}{{end}}{{end}}') if [ -z "$VOLUME_NAME" ]; then echo "Error: Could not determine the RustFS data volume." exit 1 fi echo "Verifying RustFS archive..." docker run --rm \ --volume "$BACKUP_DIR:/backup:ro" \ busybox tar -tzf "/backup/$BACKUP_NAME" > /dev/null echo "Archive OK." printf 'WARNING: This erases all current MineSeeker RustFS data. Type yes to continue: ' read -r CONFIRM if [ "$CONFIRM" != 'yes' ]; then echo "Aborted." exit 1 fi APP_WAS_RUNNING=0 SCHEDULER_WAS_RUNNING=0 RUSTFS_WAS_RUNNING=1 [ -z "$(docker compose ps -q app)" ] || APP_WAS_RUNNING=1 [ -z "$(docker compose ps -q scheduler)" ] || SCHEDULER_WAS_RUNNING=1 RESTORE_COMPLETE=0 restart_services() { result=$? if [ "$RESTORE_COMPLETE" -eq 1 ]; then [ "$RUSTFS_WAS_RUNNING" -eq 0 ] || docker compose start rustfs || true [ "$APP_WAS_RUNNING" -eq 0 ] || docker compose start app || true [ "$SCHEDULER_WAS_RUNNING" -eq 0 ] || docker compose start scheduler || true elif [ "$result" -ne 0 ]; then echo "Restore did not complete; RustFS and application services remain stopped for safety." >&2 fi return "$result" } trap restart_services EXIT echo "Stopping MineSeeker writers and RustFS before restore..." docker compose stop app scheduler rustfs echo "Restoring RustFS backup: $BACKUP_FILE" docker run --rm \ --volume "$VOLUME_NAME:/data" \ --volume "$BACKUP_DIR:/backup:ro" \ busybox sh -c 'find /data -mindepth 1 -maxdepth 1 -exec rm -rf {} + && tar xzf "/backup/$1" -C /data' sh "$BACKUP_NAME" RESTORE_COMPLETE=1 echo "Restore complete."