# MongoDB Backup & Restore - Tower / Tower1 Kompletní řešení pro zálohování a obnovu MongoDB na Unraid. **Ověřeno v praxi** na dvou Unraid serverech Tower (192.168.1.76) a Tower1 (192.168.1.50). --- ## 🏗️ Infrastruktura | Server | IP | Role | MongoDB kontejner | |--------|-----|------|-------------------| | Tower | 192.168.1.76 | Primární (zdroj záloh) | `MongoDB` | | Tower1 | 192.168.1.50 | Záloha (restore cíl) | `MongoDB` | **SSH:** Tower1 ↔ Tower mají vzájemně nahrané SSH klíče (bez hesla). --- ## 📋 Co backup zachovává - ✅ Všechny kolekce a dokumenty (BSON formát) - ✅ Všechny indexy (unique, compound, sparse, text) - ✅ Metadata kolekcí (validators, options) - ✅ Komprimace gzipem (`--archive --gzip`) > **Poznámka k admin DB:** MongoDB je provozováno bez autentifikace, admin DB obsahuje pouze `system.version` (1 dokument, 360 B). Není nutné ji zálohovat pro obnovení dat. --- ## 📁 Struktura záloh ``` /mnt/user/Backup/Critical/MongoDBBackup/tower/ ├── admin/ │ └── 2026-05-23_0532/ │ └── admin.archive.gz (~360 B) ├── edc/ │ └── 2026-05-23_0532/ │ └── edc.archive.gz (~436 KB) └── ... ``` **Dostupné přes Windows:** `\\tower\Backup\Critical\MongoDBBackup\` --- ## ⚙️ Konfigurace backup skriptu Soubor: `mongodbbackup_with_gzip.sh` | Proměnná | Hodnota | Popis | |----------|---------|-------| | `CONTAINER_NAME` | `MongoDB` | Jméno Docker kontejneru | | `BASE_PATH` | `/mnt/user/Backup/Critical/MongoDBBackup` | Cesta k zálohám | | `KEEP_DAYS` | `3` | Smazat zálohy starší než N dní | | `KEEP_COUNT` | `3` | Ponechat max N posledních záloh | | `WHAT_TO_BACKUP` | `("admin" "edc" ...)` | Seznam DB k zálohování | **Klíčové:** Backup používá `mongodump --archive --gzip` který streamuje přes stdout - nepotřebuje volume mount v kontejneru. --- ## 🔄 Backup Skript je registrován v Unraid User Scripts jako **MONGODB_BACKUP** na Tower. ``` TOOLS → USER SCRIPTS → MONGODB_BACKUP → RUN SCRIPT ``` **Cesta na Unraidu:** ``` /boot/config/plugins/user.scripts/scripts/MONGODB_BACKUP/script ``` **Očekávaný výstup:** ``` Processing database: edc SUCCESS: edc backed up successfully Dump size: 436K Cleaning up old backups for edc... ``` --- ## 🔁 Restore ### Metoda 1: Ze sdíleného share (doporučeno, ověřeno) Záloha je dostupná na Tower1 přes SMB - `/mnt/user/Backup/Critical/MongoDBBackup/`. Pokud není automaticky namountováno, zkopíruj soubor na Tower1 share `#test`: ```bash # Z Windows: Copy-Item "\\tower\Backup\Critical\MongoDBBackup\tower\edc\2026-05-23_0532\edc.archive.gz" "\\tower1\#test\edc.archive.gz" ``` Restore skript na Tower1 (User Scripts → **MONGODB_RESTORE**): ```bash docker exec -i MongoDB mongorestore --archive --gzip --drop < /mnt/user/#test/edc.archive.gz ``` ### Metoda 2: SSH stream Tower → Tower1 (ověřeno, funguje) ```bash ssh -o StrictHostKeyChecking=no root@192.168.1.76 \ 'cat /mnt/user/Backup/Critical/MongoDBBackup/tower/edc/2026-05-23_0532/edc.archive.gz' \ | docker exec -i MongoDB mongorestore --archive --gzip --drop ``` **Cesta skriptu na Tower1:** ``` /boot/config/plugins/user.scripts/scripts/MONGODB_RESTORE/script ``` --- ## ⏱️ Reálné časy (ověřeno) | Databáze | Velikost zálohy | Dokumentů | Čas restore | |----------|----------------|-----------|-------------| | admin | 360 B | 1 | < 1 min | | edc | 436 KB | 4563 | ~7 minut | > **Pozor:** Restore vypadá že "stojí" - ale probíhá indexace. Například `edc.queries_snapshots` (2091 docs, 5 indexů včetně compound unique) trvá několik minut. **Nezavírat okno!** --- ## ✅ Výsledek úspěšného restore (edc) ``` finished restoring edc.MDD3003_DateofVisit (381 documents, 0 failures) finished restoring edc.queries_snapshots (2091 documents, 0 failures) finished restoring edc.queries (2091 documents, 0 failures) restoring indexes for collection edc.queries from metadata - queryId_1 (sparse, unique) - queryStatus_1 - openedDate_1 - site.number_1 - subject.label_1 restoring indexes for collection edc.queries_snapshots from metadata - queryId_1_snapshotDate_1 (compound, unique) - snapshotDate_1 - queryStatus_1 - site.number_1 - subject.label_1 4563 document(s) restored successfully. 0 document(s) failed to restore. Exit: True ``` --- ## 🔧 Troubleshooting | Problém | Příčina | Řešení | |---------|---------|--------| | Restore "stojí" minuty | Indexace probíhá | Počkej, nezavírej okno | | `--dumpDbUsersAndRoles` error | MongoDB bez auth nemá users/roles | Flag odstraněn ze skriptů | | `tar: Cannot stat` | mongodump zapisuje do kontejneru, ne na host | Použít `--archive --gzip` (stdout stream) | | SSH stream visí | SSH drží stdin otevřený | Přidat `-n` flag nebo použít lokální soubor | | `Permission denied` | Práva na složky | `chmod 755 /mnt/user/Backup/Critical/MongoDBBackup` | --- ## 📝 Historie vývoje a naučené lekce 1. **mongodump `--out` do kontejneru nefunguje** - kontejner zapisuje do svého filesystému, host soubory nevidí. Řešení: `--archive --gzip` streamuje přes stdout. 2. **`--dumpDbUsersAndRoles` selže** na MongoDB bez auth - odstraněno. 3. **tar cesta** - mongodump vytváří `DUMP_DIR/DB_NAME/kolekce.bson`, ne přímo `DUMP_DIR/kolekce.bson`. 4. **Restore je pomalý** - indexace compound a unique indexů trvá. Normální chování, není to chyba. 5. **SSH stream** - funguje ale při pomalé indexaci může paramiko timeout. Bezpečnější je lokální soubor přes share.