diff --git a/.claude/settings.local.json b/.claude/settings.local.json index c9af5c9..4122427 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -8,7 +8,8 @@ "Bash(git remote *)", "Bash(git add *)", "Bash(git commit *)", - "Bash(git push *)" + "Bash(git push *)", + "PowerShell(Test-NetConnection -ComputerName 192.168.1.50 -Port 27017 -InformationLevel Detailed)" ] } } diff --git a/MongTower/mongodbbackup_with_gzip.sh b/MongTower/mongodbbackup_with_gzip.sh index 96a3cdf..b7e465c 100644 --- a/MongTower/mongodbbackup_with_gzip.sh +++ b/MongTower/mongodbbackup_with_gzip.sh @@ -12,6 +12,7 @@ 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") @@ -30,31 +31,24 @@ for DB_NAME in "${WHAT_TO_BACKUP[@]}"; do FINAL_PATH="$BASE_PATH/$UNRAID_NAME/$DB_NAME/$DATE" mkdir -p "$FINAL_PATH" - DUMP_DIR="$FINAL_PATH/$DB_NAME" DUMP_FILE="$FINAL_PATH/$DB_NAME.archive.gz" ERR_FILE="$FINAL_PATH/$DB_NAME.err" # ====================================================== - # DUMP + GZIP + # 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" \ - --out="$DUMP_DIR" \ + --archive \ + --gzip \ --numParallelCollections=4 \ - 2> "$ERR_FILE" + > "$DUMP_FILE" 2> "$ERR_FILE" EXIT_CODE=$? - # Compress the dump directory - if [ $EXIT_CODE -eq 0 ]; then - (cd "$FINAL_PATH" && tar -czf "$DB_NAME.archive.gz" "$DB_NAME" 2>> "$ERR_FILE") - EXIT_CODE=$? - rm -rf "$DUMP_DIR" - fi - # ====================================================== # VALIDATION # ====================================================== @@ -73,12 +67,19 @@ for DB_NAME in "${WHAT_TO_BACKUP[@]}"; do # ====================================================== # 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 "------------------------------------------" diff --git a/MongTower/mongodbrestore_from_backup.sh b/MongTower/mongodbrestore_from_backup.sh index cb7e150..177ec3b 100644 --- a/MongTower/mongodbrestore_from_backup.sh +++ b/MongTower/mongodbrestore_from_backup.sh @@ -9,7 +9,7 @@ MONGO_HOST="localhost" MONGO_PORT="27017" # Cesta k záloze kterou chceš obnovit -# Např: /mnt/user/MongoDBBackup/tower/admin/2026-05-23_1530 +# Např: /mnt/user/Backup/Critical/MongoDBBackup/tower BACKUP_BASE_PATH="$1" # ========================================================== @@ -17,7 +17,7 @@ BACKUP_BASE_PATH="$1" # ========================================================== if [ -z "$BACKUP_BASE_PATH" ]; then echo "Usage: $0 " - echo "Example: $0 /mnt/user/MongoDBBackup/tower" + echo "Example: $0 /mnt/user/Backup/Critical/MongoDBBackup/tower" exit 1 fi @@ -54,7 +54,6 @@ for DB_DIR in "$BACKUP_BASE_PATH"/*; do 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 @@ -64,34 +63,21 @@ for DB_DIR in "$BACKUP_BASE_PATH"/*; do 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)" # ====================================================== - # 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 + # RESTORE TO MONGODB (streamuje přes stdin z hosta) # Restores: indexy, metadata, validators, all collections # ====================================================== echo "Restoring $DB_NAME to MongoDB..." - docker exec "$CONTAINER_NAME" mongorestore \ + docker exec -i "$CONTAINER_NAME" mongorestore \ --host="$MONGO_HOST" \ --port="$MONGO_PORT" \ - --db="$DB_NAME" \ + --archive \ + --gzip \ --drop \ --numParallelCollections=4 \ - "$EXTRACT_DIR" \ + < "$BACKUP_FILE" \ 2> "$ERR_FILE" RESTORE_EXIT=$? @@ -99,7 +85,7 @@ for DB_DIR in "$BACKUP_BASE_PATH"/*; do # ====================================================== # VALIDATION # ====================================================== - if [ $RESTORE_EXIT -eq 0 ] && [ ! -s "$ERR_FILE" ]; then + if [ $RESTORE_EXIT -eq 0 ]; then echo "SUCCESS: $DB_NAME restored successfully" rm -f "$ERR_FILE" else @@ -109,9 +95,6 @@ for DB_DIR in "$BACKUP_BASE_PATH"/*; do [ -s "$ERR_FILE" ] && cat "$ERR_FILE" || echo " (no stderr output)" fi - # Cleanup extract directory - rm -rf "$EXTRACT_DIR" - done echo "------------------------------------------"