Files
Administrator 13065aab94 notebookvb
2026-05-23 06:54:13 +02:00

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.