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

8.7 KiB

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

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í:

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":

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:
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!