Files
Backup/CLAUDE.md
T
Administrator 916ab42bcc notebookvb
2026-05-23 09:38:53 +02:00

248 lines
8.7 KiB
Markdown

# Backup Project
## 📋 Co je tento projekt
Zálohovací skripty pro domácí serverové infrastruktuře — dva Unraid servery (Tower, Tower1).
Skripty běží jako **Unraid User Scripts** spouštěné automaticky každý den ve **4:40 ráno**.
---
## 🗂️ Struktura projektu
```
Backup/
├── MongoDBBackup/
│ ├── mongodbbackup_with_gzip.sh ← záloha DB (mongodump --archive --gzip)
│ ├── mongodbrestore_from_backup.sh ← restore ze zálohy (mongorestore)
│ └── verify_backup_integrity.sh ← ověření po restore (mongosh)
│
├── PostGRESQLTower/
│ ├── postgresqlbackup_with_gzip.sh ← záloha PG18 (pg_dumpall → gzip)
│ ├── postgresqlimmichbackup_with_gzip.sh ← záloha PG Immich (pg_dumpall → gzip)
│ ├── postgresqlrestore_from_backup.sh ← restore PG18 (gunzip → psql)
│ └── verify_backup_integrity.sh ← ověření po restore (psql)
│
├── GiteaBackup/
│ └── gitea_backup.sh ← záloha appdata (docker stop → tar.gz → start)
│
├── KanboardBackup/
│ └── kanboard_backup.sh ← záloha appdata (docker stop → tar.gz → start)
│
└── MicrobinBackup/
└── microbin_backup.sh ← záloha appdata (docker stop → tar.gz → start)
```
---
## ⚙️ Jak fungují zálohy — dva vzory
### Vzor A — databázový dump (MongoDB, PostgreSQL)
Záloha běží **za chodu** kontejneru — dump streamuje přes stdout přímo na disk hostitele,
bez volume mountu a bez dočasné kopie uvnitř kontejneru.
```
docker exec kontejner nástroj-pro-dump → (pipe) → soubor na hostiteli
```
- **MongoDB:** `mongodump --archive --gzip` → `admin.archive.gz`, `edc.archive.gz`
- **PostgreSQL 18:** `pg_dumpall | gzip` → `all_databases.sql.gz`
- **PostgreSQL Immich:** `pg_dumpall | gzip` → `immich_all.sql.gz`
### Vzor B — appdata archiv (Gitea, Kanboard, Microbin)
Záloha probíhá **při zastaveném kontejneru** — soubory nesmí být zapisovány v průběhu `tar`.
```
docker stop → tar -czf appdata/kontejner → docker start
```
Kontejner se nastartuje **vždy**, i při chybě archivu — minimální downtime.
---
## 🔄 Rotace záloh
| ZĂĄloha | Metoda | ZachovĂĄvĂĄ |
|--------|--------|-----------|
| MongoDB | dvoustupňová (stáří + count) | 3 dny / 3 zálohy |
| PostgreSQL 18 | dvoustupňová (stáří + count) | 7 dní / 7 záloh |
| PostgreSQL Immich | dvoustupňová (stáří + count) | 7 dní / 7 záloh |
| Gitea | podle stáří | 7 dní |
| Kanboard | podle stáří | 7 dní |
| Microbin | podle stáří | 7 dní |
Dvoustupňová rotace: nejprve smaž dle stáří, pak ořízni na max. count.
To garantuje minimum záloh i při přerušeném schedule.
---
## 🚨 Restore — důležité poznámky
- **PostgreSQL Immich**: vyžaduje při restore **stejný Docker image** (`tensorchord/pgvecto-rs:pg16-v0.2.0`)
kvĹŻli pgvecto-rs extension. StandardnĂ­ postgres:16 nebude fungovat.
- **Kanboard**: appdata + MySQL zĂĄloha zvlĂĄĹĄĹĽ (MySQL skript zĂĄlohuje DB `kanboard`).
- **MongoDB restore**: používá `--drop` — smaže kolekce před obnovením. Vědomá akce.
- **PostgreSQL restore**: chybovĂŠ hlĂĄĹĄky "role already exists" jsou normĂĄlnĂ­ (dump je idempotentnĂ­).
---
## 🛠️ Nasazení skriptu na Tower
```python
import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('192.168.1.76', username='root', password='7309208104',
look_for_keys=False, allow_agent=False)
sftp = client.open_sftp()
sftp.put('lokalnĂ­_skript.sh', '/boot/config/plugins/user.scripts/scripts/NĂĄzevSkriptu/script')
client.exec_command('chmod +x /boot/config/plugins/user.scripts/scripts/NĂĄzevSkriptu/script')
```
Schedule se nastavuje v `/boot/config/plugins/user.scripts/schedule.json`.
---
# Backup Project - Infrastructure Info
## 🖥️ Servery
| Server | Hostname | IP | OS |
|--------|----------|----|----|
| Tower | tower / tower.lan | 192.168.1.76 | Unraid |
| Tower1 | tower1 | 192.168.1.50 | Unraid |
---
## 🔐 SSH přístup
**Credentials:**
| Server | User | Password |
|--------|------|----------|
| Tower | `root` | `7309208104` |
| Tower1 | `root` | `Vlado7309208104++` |
**Připojení:**
```bash
ssh root@192.168.1.76 # Tower
ssh root@192.168.1.50 # Tower1
```
**Důležité:** Tower a Tower1 mají vzájemně nahrané SSH klíče - Tower1 se může připojit na Tower bez hesla a naopak.
**Připojení z Pythonu (Windows):** Použít `look_for_keys=False, allow_agent=False` — jinak selže kvůli "Too many authentication failures":
```python
client.connect("192.168.1.76", username="root", password="7309208104",
look_for_keys=False, allow_agent=False)
```
---
## 🐳 Docker kontejnery
| Server | Kontejner | Port | Popis |
|--------|-----------|------|-------|
| Tower | `MongoDB` | 27017 | MongoDB 8.2.9 |
| Tower1 | `MongoDB` | 27017 | MongoDB 8.2.9 |
| Tower | `MySQL` | 3306 | MySQL |
| Tower | `postgresql18` | 5432 | PostgreSQL 18 (hlavnĂ­) |
| Tower | `PostgreSQL_Immich` | 5433→5432 | PostgreSQL 16 + pgvecto-rs (Immich) |
| Tower | `immich` | 8888→8080 | Immich (foto server) |
---
## 📁 Důležité cesty
### Tower
| Co | Cesta |
|----|-------|
| MongoDB zĂĄlohy | `/mnt/user/Backup/Critical/MongoDBBackup/` |
| MySQL zĂĄlohy | `/mnt/user/MySQLBackup/` |
| PostgreSQL zĂĄlohy | `/mnt/user/Backup/Critical/PostgreSQLBackup/` |
| PostgreSQL Immich zĂĄlohy | `/mnt/user/Backup/Critical/PostgreSQLImmichBackup/` |
| PostgreSQL 18 data | `/mnt/user/appdata/postgresql18` |
| PostgreSQL Immich data | `/mnt/user/appdata/PostgreSQL_Immich` |
| Kanboard zĂĄlohy | `/mnt/user/Backup/Critical/KanboardBackup/` |
| Microbin zĂĄlohy | `/mnt/user/Backup/Critical/MicrobinBackup/` |
| User Scripts | `/boot/config/plugins/user.scripts/scripts/` |
| Test share | `/mnt/user/#test/` |
### Windows (lokĂĄlnĂ­)
| Co | Cesta |
|----|-------|
| MongoDB zĂĄlohy | `\\tower\Backup\Critical\MongoDBBackup\` |
| MySQL zĂĄlohy | `\\tower\MySQLBackup\` |
| PostgreSQL zĂĄlohy | `\\tower\Backup\Critical\PostgreSQLBackup\` |
| PostgreSQL Immich zĂĄlohy | `\\tower\Backup\Critical\PostgreSQLImmichBackup\` |
| Kanboard zĂĄlohy | `\\tower\Backup\Critical\KanboardBackup\` |
| Microbin zĂĄlohy | `\\tower\Backup\Critical\MicrobinBackup\` |
| Test share | `\\tower1\#test\` |
---
## 🗄️ MongoDB
- **Verze:** 8.2.9
- **Auth:** Žádná (otevřené)
- **DatabĂĄze k zĂĄlohovĂĄnĂ­:** `admin`, `edc` (+ dalĹĄĂ­ dle skriptu)
- **Připojení z Pythonu:**
```python
from pymongo import MongoClient
client = MongoClient('mongodb://192.168.1.76:27017') # Tower
client = MongoClient('mongodb://192.168.1.50:27017') # Tower1
```
---
## 🗄️ MySQL
- **User:** `root`
- **Password:** `Vlado9674+`
- **DatabĂĄze:** `fio`, `torrents`, `OrdinaceDropBoxBackup`, `medevio`, `kanboard`, `medicus`, `studie`, `puzzle`
---
## 📜 User Scripts na Tower (Unraid)
| NĂĄzev | Popis | Schedule |
|-------|-------|----------|
| `3_MYSQL_BACKUP_WITH_GZIP` | MySQL backup vĹĄech DB | Daily |
| `MongoDBBackupWithGzip` | MongoDB backup (`--archive --gzip`) | Daily |
| `PostgreSQLBackup` | PostgreSQL 18 backup (`pg_dumpall` → gzip) | Daily |
| `PostgreSQLImmichBackup` | PostgreSQL Immich backup (`pg_dumpall` → gzip) | Daily |
| `GiteaBackup` | Gitea backup (`docker stop` → `tar.gz` appdata → `docker start`) | Daily |
| `KanboardBackup` | Kanboard backup (`docker stop` → `tar.gz` appdata → `docker start`) | Daily |
| `MicrobinBackup` | Microbin backup (`docker stop` → `tar.gz` appdata → `docker start`) | Daily |
**Schedule `daily` = spuštění ve 4:40 ráno** (přes `/etc/cron.daily`, crontab: `40 4 * * *`)
**Schedule config:** `/boot/config/plugins/user.scripts/schedule.json` — zde Unraid ukládá frequency pro každý User Script. Kontejner Gitea se na Tower jmenuje `Gitea` (s velkým G).
## 📜 User Scripts na Tower1 (Unraid)
| NĂĄzev | Popis |
|-------|-------|
| `MONGODB_RESTORE` | Restore edc DB z Tower přes SSH stream |
---
## 🗄️ PostgreSQL
### Instance 1 — postgresql18 (hlavní)
- **Verze:** 18
- **Port:** 5432
- **User:** `vladimir.buzalka`
- **Password:** `Vlado7309208104++`
- **Auth:** Heslo (PGPASSWORD env var)
- **Záloha:** `pg_dumpall` → `/mnt/user/Backup/Critical/PostgreSQLBackup/tower/`
- **Dump size:** ~3.3 GB, čas ~3 min
### Instance 2 — PostgreSQL_Immich (Immich foto server)
- **Verze:** 16 + pgvecto-rs extension (image: `tensorchord/pgvecto-rs:pg16-v0.2.0`)
- **Port:** 5433 (host) → 5432 (container)
- **User:** `postgres`
- **Password:** `postgres`
- **DB:** `immich`
- **Záloha:** `pg_dumpall` → `/mnt/user/Backup/Critical/PostgreSQLImmichBackup/tower/`
- **Dump size:** ~52 MB, čas ~18 sec
- **Restore pozor:** VyĹžaduje stejnĂ˝ image s pgvecto-rs extension!