176 lines
5.5 KiB
Markdown
176 lines
5.5 KiB
Markdown
# 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.
|