#!/bin/bash set -x # ========================================================== # CONFIGURATION # ========================================================== CONTAINER_NAME="MongoDB" MONGO_HOST="localhost" MONGO_PORT="27017" UNRAID_NAME="tower" BASE_PATH="/mnt/user/Backup/Critical/MongoDBBackup" KEEP_DAYS=3 KEEP_COUNT=3 # počet posledních záloh k udržení (mimo time-based) # Databases to back up (+ admin DB pro credentials a roles) WHAT_TO_BACKUP=("admin" "edc") # ========================================================== # START # ========================================================== echo "Starting scheduled backup for: ${WHAT_TO_BACKUP[*]}" START_TS=$(date '+%Y-%m-%d %H:%M:%S') for DB_NAME in "${WHAT_TO_BACKUP[@]}"; do echo "------------------------------------------" echo "Processing database: $DB_NAME" DATE=$(date +%Y-%m-%d_%H%M) FINAL_PATH="$BASE_PATH/$UNRAID_NAME/$DB_NAME/$DATE" mkdir -p "$FINAL_PATH" DUMP_FILE="$FINAL_PATH/$DB_NAME.archive.gz" ERR_FILE="$FINAL_PATH/$DB_NAME.err" # ====================================================== # DUMP + GZIP (streamuje přes stdout, nepotřebuje volume mount) # Zachovává: indexy, metadata, validators, all collections # ====================================================== docker exec "$CONTAINER_NAME" mongodump \ --host="$MONGO_HOST" \ --port="$MONGO_PORT" \ --db="$DB_NAME" \ --archive \ --gzip \ --numParallelCollections=4 \ > "$DUMP_FILE" 2> "$ERR_FILE" EXIT_CODE=$? # ====================================================== # VALIDATION # ====================================================== if [ $EXIT_CODE -eq 0 ] && [ -s "$DUMP_FILE" ] && [ ! -s "$ERR_FILE" ]; then echo "SUCCESS: $DB_NAME backed up successfully" echo "Dump size: $(du -h "$DUMP_FILE" | cut -f1)" rm -f "$ERR_FILE" else echo "ERROR: Backup failed for database: $DB_NAME" echo "Exit code: $EXIT_CODE" echo "Dump file:" ls -lh "$DUMP_FILE" 2>/dev/null || echo " (not created)" echo "Error output:" [ -s "$ERR_FILE" ] && cat "$ERR_FILE" || echo " (no stderr output)" fi # ====================================================== # CLEANUP OLD BACKUPS # 1. Smaž zálohy starší než KEEP_DAYS dnů # 2. Z toho co zbyde, ponech jen posledních KEEP_COUNT # ====================================================== echo "Cleaning up old backups for $DB_NAME..." find "$BASE_PATH/$UNRAID_NAME/$DB_NAME" \ -mindepth 1 -maxdepth 1 -type d -mtime +$KEEP_DAYS \ -exec rm -rf {} \; # Nech jen posledních KEEP_COUNT záloh ls -td "$BASE_PATH/$UNRAID_NAME/$DB_NAME"/*/ 2>/dev/null \ | tail -n +$((KEEP_COUNT + 1)) \ | xargs -r rm -rf done echo "------------------------------------------" echo "All backup tasks completed at $(date)" echo "Started at: $START_TS" set +x