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!