#!/bin/bash set -x # ========================================================== # CONFIGURATION # ========================================================== CONTAINER_NAME="MongoDB" MONGO_HOST="localhost" MONGO_PORT="27017" # Cesta k záloze kterou chceš obnovit # Např: /mnt/user/Backup/Critical/MongoDBBackup/tower BACKUP_BASE_PATH="$1" # ========================================================== # VALIDATION # ========================================================== if [ -z "$BACKUP_BASE_PATH" ]; then echo "Usage: $0 " echo "Example: $0 /mnt/user/Backup/Critical/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" 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)" echo "Backup size: $(du -h "$BACKUP_FILE" | cut -f1)" # ====================================================== # RESTORE TO MONGODB (streamuje přes stdin z hosta) # Restores: indexy, metadata, validators, all collections # ====================================================== echo "Restoring $DB_NAME to MongoDB..." docker exec -i "$CONTAINER_NAME" mongorestore \ --host="$MONGO_HOST" \ --port="$MONGO_PORT" \ --archive \ --gzip \ --drop \ --numParallelCollections=4 \ < "$BACKUP_FILE" \ 2> "$ERR_FILE" RESTORE_EXIT=$? # ====================================================== # VALIDATION # ====================================================== if [ $RESTORE_EXIT -eq 0 ]; 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 done echo "------------------------------------------" echo "All restore tasks completed at $(date)" echo "Started at: $START_TS" set +x