6.7 KiB
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ě
adminpro 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}/
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 kontejneruKEEP_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.
chmod +x mongodbrestore_from_backup.sh
./mongodbrestore_from_backup.sh /mnt/user/Backup/Critical/MongoDBBackup/tower
Co skript dělá:
- ✅ Najde nejnovější backup pro KAŽDOU DB
- ✅ Extrahuje .tar.gz archiv
- ✅ Obnoví do MongoDB (s
--dropna přepsání existujících) - ✅ Validuje úspěch
- ✅ Čistí temp soubory
3. Ověřovací skript (verify_backup_integrity.sh)
Kontroluje že se VŠECHNO správně obnovilo (indexy, metadata, kolekce).
chmod +x verify_backup_integrity.sh
./verify_backup_integrity.sh
Co skript ověřuje:
- ✅ Zda všechny DB existují
- ✅ Počet a jména kolekcí
- ✅ Indexy pro každou kolekci (včetně jejich definic)
- ✅ Počet dokumentů v každé kolekci
- ✅ Velikost dat v MB
- ✅ 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:
/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:
# 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:
/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ší!
/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ě):
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
-
--dropflag - Restore skript obnovuje s--drop, což PŘEPÍŠE existující databázi. To je zvláště důležité pro test. -
Admin DB - Obsahuje uživatele a role. Pokud máš auth, musíš je správně obnovit.
-
Čištění - Po úspěšném testu si můžeš vymazat temp soubory:
rm -rf /tmp/mongodb_restore_* -
Disk space - Při restore se vytváří tmp soubory. Ověř prostor na
/tmp(nebo/mnt/user). -
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