#!/bin/bash # ============================================================================== # MongoDB Verify Backup Integrity — ověření konzistence po restore # ============================================================================== # # CO DĚLÁ: # Připojí se k MongoDB a pro každou databázi zkontroluje: # 1. Existence databáze # 2. Počet a seznam kolekcí # 3. Indexy na každé kolekci # 4. Statistiky (počet dokumentů, velikost) # 5. Pro admin DB: počet systémových uživatelů a rolí # # KDY POUŽÍT: # Po provedení mongodbrestore_from_backup.sh — ověří, že data jsou v pořádku. # Spouštět ručně, není součástí automatizovaného schedule. # # VÝSTUP: # ✅ / ❌ indikátory pro každý krok. # Skript vrátí exit code 1 pokud cokoliv selže. # ============================================================================== set -x # ============================================================================== # KONFIGURACE # ============================================================================== CONTAINER_NAME="MongoDB" MONGO_HOST="localhost" MONGO_PORT="27017" # Databáze ke kontrole — zahrnuje i MySQL databáze zrcadlené do MongoDB, # protože verify kontroluje aktuální stav MongoDB, ne zálohu. WHAT_TO_VERIFY=("admin" "fio" "torrents" "OrdinaceDropBoxBackup" "medevio" "kanboard" "medicus" "studie" "puzzle") echo "Starting backup integrity verification..." echo "==========================================" ALL_OK=true # flag — pokud jakákoliv kontrola selže, nastaví se na false for DB_NAME in "${WHAT_TO_VERIFY[@]}"; do echo "" echo "Verifying database: $DB_NAME" echo "------------------------------------------" # -------------------------------------------------------------------------- # 1. EXISTENCE DATABÁZE # adminCommand('listDatabases') vrátí seznam všech DB. # Filtrujeme podle jména — pokud filter nic nevrátí (length=0), DB neexistuje. # mongosh --quiet potlačí uvítací banner, --eval vykoná JS výraz. # -------------------------------------------------------------------------- DB_EXISTS=$(docker exec "$CONTAINER_NAME" mongosh \ --host="$MONGO_HOST" \ --port="$MONGO_PORT" \ --quiet \ --eval "db.adminCommand('listDatabases').databases.filter(d => d.name === '$DB_NAME').length > 0") if [ "$DB_EXISTS" != "true" ]; then echo "❌ ERROR: Database $DB_NAME does not exist!" ALL_OK=false continue # bez DB nemá smysl kontrolovat dál fi echo "✅ Database exists: $DB_NAME" # -------------------------------------------------------------------------- # 2. POČET KOLEKCÍ # getCollectionNames() vrátí pole názvů všech kolekcí v DB. # .length dá číslo — slouží jako rychlá sanity check (0 by bylo podezřelé). # -------------------------------------------------------------------------- COLLECTION_COUNT=$(docker exec "$CONTAINER_NAME" mongosh \ --host="$MONGO_HOST" \ --port="$MONGO_PORT" \ --quiet \ --eval "use $DB_NAME; db.getCollectionNames().length") echo "✅ Collections count: $COLLECTION_COUNT" # -------------------------------------------------------------------------- # 3. SEZNAM KOLEKCÍ # Vypíše název každé kolekce — pro vizuální kontrolu po restore. # -------------------------------------------------------------------------- echo " Collections:" docker exec "$CONTAINER_NAME" mongosh \ --host="$MONGO_HOST" \ --port="$MONGO_PORT" \ --quiet \ --eval "use $DB_NAME; db.getCollectionNames().forEach(c => print(' - ' + c))" # -------------------------------------------------------------------------- # 4. INDEXY NA KAŽDÉ KOLEKCI # getIndexes() vrátí pole index definic. Každý index má field "key" (JSON). # Výpis indexů ověří, že mongorestore správně obnovil i indexy (ne jen data). # -------------------------------------------------------------------------- echo " Indexes per collection:" docker exec "$CONTAINER_NAME" mongosh \ --host="$MONGO_HOST" \ --port="$MONGO_PORT" \ --quiet \ --eval " use $DB_NAME; db.getCollectionNames().forEach(collName => { const indexes = db[collName].getIndexes(); print(' ' + collName + ': ' + indexes.length + ' indexes'); indexes.forEach(idx => { print(' - ' + JSON.stringify(idx.key)); }); }); " # -------------------------------------------------------------------------- # 5. STATISTIKY KOLEKCÍ (počet dokumentů, velikost) # db[collName].stats() vrátí objekt se statistikami kolekce. # .count = počet dokumentů, .size = velikost v bytech → převádíme na MB. # Nulový count může signalizovat problém (záloha prázdné DB nebo selhání restore). # -------------------------------------------------------------------------- echo " Collection stats:" docker exec "$CONTAINER_NAME" mongosh \ --host="$MONGO_HOST" \ --port="$MONGO_PORT" \ --quiet \ --eval " use $DB_NAME; db.getCollectionNames().forEach(collName => { const stats = db[collName].stats(); print(' ' + collName + ':'); print(' Documents: ' + stats.count); print(' Size: ' + (stats.size / 1024 / 1024).toFixed(2) + ' MB'); }); " # -------------------------------------------------------------------------- # 6. UŽIVATELÉ A ROLE (pouze admin DB) # admin DB obsahuje systémové uživatele a role — i bez auth jsou zálohovány. # Ověřujeme, že restore je správně obnovil. # -------------------------------------------------------------------------- if [ "$DB_NAME" = "admin" ]; then echo " Users and Roles:" USER_COUNT=$(docker exec "$CONTAINER_NAME" mongosh \ --host="$MONGO_HOST" \ --port="$MONGO_PORT" \ --quiet \ --eval "use admin; db.system.users.find().count()") echo " System users: $USER_COUNT" ROLE_COUNT=$(docker exec "$CONTAINER_NAME" mongosh \ --host="$MONGO_HOST" \ --port="$MONGO_PORT" \ --quiet \ --eval "use admin; db.system.roles.find().count()") echo " System roles: $ROLE_COUNT" fi done echo "" echo "==========================================" if [ "$ALL_OK" = true ]; then echo "✅ All verifications passed!" else echo "❌ Some verifications failed!" exit 1 fi set +x