Private
Public Access
78 lines
2.3 KiB
Bash
Executable File
78 lines
2.3 KiB
Bash
Executable File
#!/bin/sh
|
|
set -eu
|
|
|
|
PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
|
|
cd "$PROJECT_DIR"
|
|
|
|
if [ "$#" -ne 1 ]; then
|
|
echo "Usage: $0 <backup-file>"
|
|
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."
|