#!/bin/bash set -x # ========================================================== # CONFIGURATION # ========================================================== CONTAINER_NAME="MongoDB" MONGO_HOST="localhost" MONGO_PORT="27017" # Cesta k záloze kterou chceš obnovit # Např: /mnt/user/MongoDBBackup/tower/admin/2026-05-23_1530 BACKUP_BASE_PATH="$1" # ========================================================== # VALIDATION # ========================================================== if [ -z "$BACKUP_BASE_PATH" ]; then echo "Usage: $0 " echo "Example: $0 /mnt/user/MongoDBBackup/tower" exit 1 fi if [ ! -d "$BACKUP_BASE_PATH" ]; then echo "ERROR: Backup path does not exist: $BACKUP_BASE_PATH" exit 1 fi echo "Starting MongoDB restore from: $BACKUP_BASE_PATH" START_TS=$(date '+%Y-%m-%d %H:%M:%S') # ========================================================== # RESTORE PROCESS # ========================================================== # Najdi nejnovější backupy pro každou DB # Struktura: $BACKUP_BASE_PATH/DB_NAME/YYYY-MM-DD_HHMM/DB_NAME.archive.gz for DB_DIR in "$BACKUP_BASE_PATH"/*; do if [ ! -d "$DB_DIR" ]; then continue fi DB_NAME=$(basename "$DB_DIR") echo "------------------------------------------" echo "Processing database: $DB_NAME" # Najdi nejnovější backup pro tuto DB LATEST_BACKUP=$(ls -td "$DB_DIR"/*/ 2>/dev/null | head -1) if [ -z "$LATEST_BACKUP" ]; then echo "WARNING: No backup found for $DB_NAME" continue fi BACKUP_FILE="$LATEST_BACKUP/${DB_NAME}.archive.gz" EXTRACT_DIR="/tmp/mongodb_restore_$$/$DB_NAME" ERR_FILE="$LATEST_BACKUP/${DB_NAME}.restore.err" if [ ! -f "$BACKUP_FILE" ]; then echo "ERROR: Backup archive not found: $BACKUP_FILE" continue fi echo "Found backup: $BACKUP_FILE" echo "Backup date: $(stat -c %y "$BACKUP_FILE" | cut -d' ' -f1-2)" # ====================================================== # EXTRACT BACKUP # ====================================================== mkdir -p "$EXTRACT_DIR" echo "Extracting backup..." tar -xzf "$BACKUP_FILE" -C "$EXTRACT_DIR" 2> "$ERR_FILE" EXTRACT_EXIT=$? if [ $EXTRACT_EXIT -ne 0 ]; then echo "ERROR: Failed to extract backup" cat "$ERR_FILE" rm -rf "$EXTRACT_DIR" continue fi # ====================================================== # RESTORE TO MONGODB # Restores: indexy, metadata, validators, all collections # ====================================================== echo "Restoring $DB_NAME to MongoDB..." docker exec "$CONTAINER_NAME" mongorestore \ --host="$MONGO_HOST" \ --port="$MONGO_PORT" \ --db="$DB_NAME" \ --drop \ --numParallelCollections=4 \ "$EXTRACT_DIR" \ 2> "$ERR_FILE" RESTORE_EXIT=$? # ====================================================== # VALIDATION # ====================================================== if [ $RESTORE_EXIT -eq 0 ] && [ ! -s "$ERR_FILE" ]; then echo "SUCCESS: $DB_NAME restored successfully" rm -f "$ERR_FILE" else echo "ERROR: Restore failed for database: $DB_NAME" echo "Exit code: $RESTORE_EXIT" echo "Error output:" [ -s "$ERR_FILE" ] && cat "$ERR_FILE" || echo " (no stderr output)" fi # Cleanup extract directory rm -rf "$EXTRACT_DIR" done echo "------------------------------------------" echo "All restore tasks completed at $(date)" echo "Started at: $START_TS" set +x