#!/bin/bash # # Minecraft Server Restore Script # Deployed by Ansible - managed file # # Usage: ./restore.sh [path_to_backup_file] # If no argument given, restores the most recent backup. # # WARNING: This will OVERWRITE the current world data! # set -euo pipefail # Configuration DATA_DIR="{{ paths.data_dir }}" BACKUP_DIR="{{ paths.backup_dir }}" # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color log() { echo -e "$(date '+%Y-%m-%d %H:%M:%S') $*" } error() { log "${RED}[ERROR]${NC} $*" exit 1 } warn() { log "${YELLOW}[WARN]${NC} $*" } ok() { log "${GREEN}[OK]${NC} $*" } # Determine which backup to restore if [ $# -eq 1 ]; then # Explicit file provided RESTORE_FILE="$1" if [ ! -f "$RESTORE_FILE" ]; then # Try to find it in the backup dir RESTORE_FILE="${BACKUP_DIR}/$1" if [ ! -f "$RESTORE_FILE" ]; then error "Backup file not found: $1 (looked in $BACKUP_DIR)" fi fi else # Find most recent backup RESTORE_FILE=$(ls -t "${BACKUP_DIR}/"{{ minecraft.server_name }}_*.tar* 2>/dev/null | head -n1) if [ -z "$RESTORE_FILE" ]; then error "No backups found in $BACKUP_DIR" fi fi log "Selected backup: $RESTORE_FILE" # Double-check safety warn "This will overwrite the current Minecraft world data in $DATA_DIR" read -p "Are you sure you want to continue? (yes/no): " CONFIRM if [ "$CONFIRM" != "yes" ]; then log "Aborting restore." exit 1 fi # Stop the Minecraft server if running if podman ps --format '{% raw %}{{.Names}}{% endraw %}' | grep -q '{{ podman_container_name }}'; then warn "Stopping Minecraft server container..." systemctl stop {{ minecraft.server_name }} sleep 3 warn "Server stopped." fi # Create a temporary backup of current state (safety net) TIMESTAMP="$(date +%Y%m%d_%H%M%S)" SAFETY_BACKUP="${BACKUP_DIR}/pre_restore_${TIMESTAMP}.tar.gz" log "Creating safety backup of current state: $SAFETY_BACKUP" tar -czf "$SAFETY_BACKUP" -C "$(dirname $DATA_DIR)" "$(basename $DATA_DIR)" # Extract the restore file log "Restoring from: $RESTORE_FILE" case "$RESTORE_FILE" in *.tar.gz|*.tgz) tar -xzf "$RESTORE_FILE" -C "$(dirname $DATA_DIR)" ;; *.tar) tar -xf "$RESTORE_FILE" -C "$(dirname $DATA_DIR)" ;; *) error "Unsupported archive format: $RESTORE_FILE" ;; esac ok "Restore completed successfully!" # Restart the server log "Restarting Minecraft server..." systemctl start {{ minecraft.server_name }} sleep 5 ok "Server restarted. Verify it's running: systemctl status {{ minecraft.server_name }}" log "A safety backup of the pre-restore state was saved to: $SAFETY_BACKUP"