diff --git a/minecraft-server/restore-backup.sh b/minecraft-server/restore-backup.sh new file mode 100644 index 0000000..2f56b9e --- /dev/null +++ b/minecraft-server/restore-backup.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash + +set -eo pipefail + +RCLONE_CONFIG="rclone.conf" +RCLONE_TARGET="minecraft:" +WORLDS_DIR="spigot/worlds" +WORLDS_DIR_BACKUP="$WORLDS_DIR.backup" +ARCHIVE_PREFIX="etc/mcserver/worlds" +SERVICE_NAME="spigot" + +archive=$(rclone --config "$RCLONE_CONFIG" lsf "$RCLONE_TARGET" | sort --reverse | fzf --cycle) + +if [[ -z $archive ]]; then + echo "error: no archive file has been selected!" >&2 + exit 1 +fi + +target_dir=$(mktemp --directory) +target_archive="$target_dir/$archive" + +echo "Downloading archive $archive to $target_archive ..." +rclone --config "$RCLONE_CONFIG" copy "$RCLONE_TARGET$archive" "$target_dir" --progress + +if [[ -d $WORLDS_DIR_BACKUP ]]; then + echo "Deleting old worlds dir backup ($WORLDS_DIR_BACKUP) ..." + rm -rf "$WORLDS_DIR_BACKUP" +fi + +echo "Un-zipping archive to $target_dir ..." +unzip "$target_archive" -d "$target_dir" 1>/dev/null + +echo "Stopping server ..." +docker compose stop "$SERVICE_NAME" + +echo "Backing up worlds dir ($WORLDS_DIR -> $WORLDS_DIR_BACKUP) ..." +mv "$WORLDS_DIR" "$WORLDS_DIR_BACKUP" + +echo "Restoring world ($target_dir/$ARCHIVE_PREFIX -> $WORLDS_DIR) ..." +mv "$target_dir/$ARCHIVE_PREFIX" "$WORLDS_DIR" + +echo "Re-starting server ..." +docker compose start "$SERVICE_NAME" + +echo "Cleaning up ..." +rm -rf "$target_dir"