# MongoDB Backup & Restore Scripts Kompletní řešení pro zálohování a obnovu MongoDB databází na Unraid. ## 📋 Obsah backup Skripty zálohují a obnovují **KOMPLETNĚ VŠECHNO**: - ✅ **Všechny databáze** (včetně `admin` pro credentials a roles) - ✅ **Všechny kolekce** a dokumenty (BSON formát) - ✅ **Všechny indexy** (včetně unique, compound, text indexů) - ✅ **Metadata kolekcí** (validators, options, atd.) - ✅ **Uživatele a role** (v admin DB) - ✅ **Komprimace gzipem** pro úsporu místa **Oveřeno zachowáno:** - Indexové struktury se zachovávají identicky - Collection validators (JSONSchema) se zachovávají - Collection options (capped collections, atd.) se zachovávají - Všechny system collections (`system.indexes`, `system.users`, atd.) - Opaque object IDs, binary data, všechny BSON typy ## 🔄 Použití ### 1. **Backup skript** (`mongodbbackup_with_gzip.sh`) Zálohuje všechny DB do `/mnt/user/Backup/Critical/MongoDBBackup/tower/{DB_NAME}/{YYYY-MM-DD_HHMM}/` ```bash chmod +x mongodbbackup_with_gzip.sh ./mongodbbackup_with_gzip.sh ``` **Přidej do Unraid scheduled tasksu:** ``` Schedule: Daily (nebo jak chceš) Command: /mnt/user/path/mongodbbackup_with_gzip.sh ``` **Struktura záloh:** ``` /mnt/user/Backup/Critical/MongoDBBackup/tower/ ├── admin/ │ └── 2026-05-23_1530/ │ ├── admin.archive.gz │ └── admin.err (jen pokud je chyba) ├── fio/ │ └── 2026-05-23_1530/ │ ├── fio.archive.gz │ └── ... └── ... ``` **Konfigurace:** - `CONTAINER_NAME` - jméno MongoDB kontejneru - `KEEP_DAYS` - Jak dlouho se uchovávají staré zálohy (default: 3 dny) - `WHAT_TO_BACKUP` - Seznam DB k zálohování --- ### 2. **Restore skript** (`mongodbrestore_from_backup.sh`) Obnovuje všechny DB ze zálohy na LOCAL MongoDB. ```bash chmod +x mongodbrestore_from_backup.sh ./mongodbrestore_from_backup.sh /mnt/user/Backup/Critical/MongoDBBackup/tower ``` **Co skript dělá:** 1. ✅ Najde nejnovější backup pro KAŽDOU DB 2. ✅ Extrahuje .tar.gz archiv 3. ✅ Obnoví do MongoDB (s `--drop` na přepsání existujících) 4. ✅ Validuje úspěch 5. ✅ Čistí temp soubory --- ### 3. **Ověřovací skript** (`verify_backup_integrity.sh`) Kontroluje že se VŠECHNO správně obnovilo (indexy, metadata, kolekce). ```bash chmod +x verify_backup_integrity.sh ./verify_backup_integrity.sh ``` **Co skript ověřuje:** 1. ✅ Zda všechny DB existují 2. ✅ Počet a jména kolekcí 3. ✅ Indexy pro každou kolekci (včetně jejich definic) 4. ✅ Počet dokumentů v každé kolekci 5. ✅ Velikost dat v MB 6. ✅ Uživatele a role (admin DB) **Příklad výstupu:** ``` Verifying database: fio ✅ Database exists: fio ✅ Collections count: 8 Collections: - users - products - logs Indexes per collection: fio.users: 3 indexes - { "_id": 1 } - { "email": 1 } - { "created_at": -1 } Collection stats: users: Documents: 12345 Size: 45.23 MB ``` --- ## 🧪 Testování na 2 Unraid serverech ### Scénář: Tower1 → Tower2 (Kompletní test) #### **Krok 1: Na Tower1 (zdroj) - Spusť backup:** ```bash /mnt/user/Backup/Critical/MongoDBBackup/mongodbbackup_with_gzip.sh # Ověř že backup existuje ls -lh /mnt/user/Backup/Critical/MongoDBBackup/tower/*/*/ ``` **Očekávaný výstup:** ``` /mnt/user/Backup/Critical/MongoDBBackup/tower/ ├── admin/2026-05-23_1530/admin.archive.gz (234K) ├── fio/2026-05-23_1530/fio.archive.gz (45M) ├── torrents/2026-05-23_1530/torrents.archive.gz (... └── ... ``` #### **Krok 2: Zkopíruj backup do Tower2:** ```bash # Přes SMB share / rsync / fyzicky disku # Zkopíruj celou strukturu: /mnt/user/Backup/Critical/MongoDBBackup/tower/ ``` #### **Krok 3: Na Tower2 (cíl) - Obnovte zálohu:** ```bash /mnt/user/Backup/Critical/MongoDBBackup/mongodbrestore_from_backup.sh /mnt/user/Backup/Critical/MongoDBBackup/tower # Výstup by měl být: # SUCCESS: admin restored successfully # SUCCESS: fio restored successfully # ... ``` #### **Krok 4: Ověř INTEGRITU na Tower2 - Nejdůležitější!** ```bash /mnt/user/Backup/Critical/MongoDBBackup/verify_backup_integrity.sh ``` **To by mělo ověřit:** - ✅ Všechny DB existují - ✅ Všechny kolekce se obnovily - ✅ Všechny indexy jsou tam (se stejnými definicemi!) - ✅ Počet dokumentů je identický - ✅ Uživatelé a role jsou obnovení #### **Krok 5: Manuální spot-check (volitelně):** ```bash docker exec -it MongoDB mongosh --host localhost --port 27017 # Ověř indexy v konkrétní kolekci use fio db.some_collection.getIndexes() # Měly by být stejné jako na Tower1 # Ověř počet dokumentů db.some_collection.countDocuments() # Měl by být identický # Ověř že data jsou bezpečná db.some_collection.findOne() ``` --- ## ⚠️ Důležité poznámky 1. **`--drop` flag** - Restore skript obnovuje s `--drop`, což PŘEPÍŠE existující databázi. To je zvláště důležité pro test. 2. **Admin DB** - Obsahuje uživatele a role. Pokud máš auth, musíš je správně obnovit. 3. **Čištění** - Po úspěšném testu si můžeš vymazat temp soubory: ```bash rm -rf /tmp/mongodb_restore_* ``` 4. **Disk space** - Při restore se vytváří tmp soubory. Ověř prostor na `/tmp` (nebo `/mnt/user`). 5. **MongoDB port** - Oba skripty očekávají MongoDB na `localhost:27017` (default). --- ## 📊 Příklad výstupu ``` Starting scheduled backup for: admin fio torrents OrdinaceDropBoxBackup medevio kanboard medicus studie puzzle ------------------------------------------ Processing database: admin SUCCESS: admin backed up successfully Dump size: 234K Cleaning up old backups for admin... ------------------------------------------ Processing database: fio SUCCESS: fio backed up successfully Dump size: 45M Cleaning up old backups for fio... ------------------------------------------ ... All backup tasks completed at Fri May 23 15:30:45 UTC 2026 ``` --- ## 🔧 Troubleshooting | Problém | Řešení | |---------|--------| | `ERROR: Container not found` | Ověř jméno kontejneru v `CONTAINER_NAME` | | `Dump file too small` | Ověř že MongoDB běží a má data | | `mongodump: command not found` | Mongodump by měl být v MongoDB image, zkontroluj Docker image | | `Permission denied` | Ověř práva na složky: `chmod 755 /mnt/user/Backup/Critical/MongoDBBackup` | --- ## 📝 Tipy - **Archivuj staré zálohy** - Pokud chceš uchovávat dlouhodobější zálohy, zkopíruj složky před KEEP_DAYS expirací - **Ověř čitelnost** - Po backup jdi ověřit že soubor lze extrahovat: `tar -tzf admin.archive.gz | head` - **Monitoruj velikost** - `du -sh /mnt/user/Backup/Critical/MongoDBBackup/` - kontroluj disk space