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:
# 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):
docker exec -i MongoDB mongorestore --archive --gzip --drop < /mnt/user/#test/edc.archive.gz
Metoda 2: SSH stream Tower → Tower1 (ověřeno, funguje)
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
-
mongodump
--outdo kontejneru nefunguje - kontejner zapisuje do svého filesystému, host soubory nevidí. Řešení:--archive --gzipstreamuje přes stdout. -
--dumpDbUsersAndRolesselže na MongoDB bez auth - odstraněno. -
tar cesta - mongodump vytváří
DUMP_DIR/DB_NAME/kolekce.bson, ne přímoDUMP_DIR/kolekce.bson. -
Restore je pomalý - indexace compound a unique indexů trvá. Normální chování, není to chyba.
-
SSH stream - funguje ale při pomalé indexaci může paramiko timeout. Bezpečnější je lokální soubor přes share.