237 lines
6.7 KiB
Markdown
237 lines
6.7 KiB
Markdown
# 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
|