# PostgreSQL Backup - Tower Dva samostatné PostgreSQL Docker kontejnery na Tower (192.168.1.76). --- ## Instance 1 — postgresql18 (hlavní) | Parametr | Hodnota | |----------|---------| | Docker kontejner | `postgresql18` | | Image | `postgres:18` | | Port | `5432` (host) → `5432` (container) | | User | `vladimir.buzalka` | | Password | `Vlado7309208104++` | | Data path (Unraid) | `/mnt/user/appdata/postgresql18` | | Obsah | Hlavní aplikační databáze | | Záloha | `/mnt/user/Backup/Critical/PostgreSQLBackup/tower/YYYY-MM-DD_HHMM/all_databases.sql.gz` | | Retence | 7 dní / posledních 7 záloh | | User Script (Unraid) | `PostgreSQLBackup` | | Skript | `postgresqlbackup_with_gzip.sh` | | První test | 2026-05-23 06:59:51 → 07:03:12 (cca 3 min), dump **3.3 GB** | --- ## Instance 2 — PostgreSQL_Immich (Immich) | Parametr | Hodnota | |----------|---------| | Docker kontejner | `PostgreSQL_Immich` | | Image | `tensorchord/pgvecto-rs:pg16-v0.2.0` (PG 16 + pgvecto-rs extension) | | Port | `5433` (host) → `5432` (container) | | User | `postgres` | | Password | `postgres` | | DB | `immich` | | Data path (Unraid) | `/mnt/user/appdata/PostgreSQL_Immich` | | Obsah | Metadata Immich (fotky, alba, uživatelé) — bez samotných fotek | | Záloha | `/mnt/user/Backup/Critical/PostgreSQLImmichBackup/tower/YYYY-MM-DD_HHMM/immich_all.sql.gz` | | Retence | 7 dní / posledních 7 záloh | | User Script (Unraid) | `PostgreSQLImmichBackup` | | Skript | `postgresqlimmichbackup_with_gzip.sh` | | První test | 2026-05-23 07:25:31 → 07:25:49 (18 sekund), dump **52 MB** | > **Poznámka:** `pgvecto-rs` je specializovaná extension pro vektorové vyhledávání (používá Immich pro AI similarity search). Dump obsahuje i extension definice, takže restore vyžaduje stejný image (`tensorchord/pgvecto-rs`), ne čistý `postgres`. --- ## Skripty | Soubor | Popis | |--------|-------| | `postgresqlbackup_with_gzip.sh` | Backup postgresql18 (pg_dumpall → gzip) | | `postgresqlimmichbackup_with_gzip.sh` | Backup PostgreSQL_Immich (pg_dumpall → gzip) | | `postgresqlrestore_from_backup.sh` | Restore postgresql18 z nejnovější / zadané zálohy | | `verify_backup_integrity.sh` | Ověření DB, tabulek, indexů, rolí po restore | ### Backup (spuštění ručně na Tower) ```bash bash /boot/config/plugins/user.scripts/scripts/PostgreSQLBackup/script bash /boot/config/plugins/user.scripts/scripts/PostgreSQLImmichBackup/script ``` ### Restore postgresql18 (nejnovější záloha) ```bash bash postgresqlrestore_from_backup.sh ``` ### Restore postgresql18 (konkrétní záloha) ```bash bash postgresqlrestore_from_backup.sh /mnt/user/Backup/Critical/PostgreSQLBackup/tower/2026-05-23_0659 ``` > **POZOR:** Dump je vytvořen s `--clean --if-exists` → restore dropne a znovu vytvoří všechny objekty. Existující data budou přepsána. ### Verify po restore ```bash bash verify_backup_integrity.sh ``` --- ## Metoda zálohy - **pg_dumpall** — jeden soubor obsahující všechny DB, role, tablespaces, grants, extensions - Streamuje přes `stdout | gzip` přímo na disk → žádný dočasný soubor uvnitř kontejneru - Restore: `gunzip -c file.sql.gz | psql` - Validace: EXIT_CODE z `${PIPESTATUS[0]}` + kontrola velikosti souboru + prázdný .err soubor --- ## Struktura záloh na disku ``` /mnt/user/Backup/Critical/ ├── PostgreSQLBackup/ │ └── tower/ │ └── 2026-05-23_0659/ │ └── all_databases.sql.gz (3.3 GB) └── PostgreSQLImmichBackup/ └── tower/ └── 2026-05-23_0725/ └── immich_all.sql.gz (52 MB) ``` ### Windows přístup ``` \\tower\Backup\Critical\PostgreSQLBackup\ \\tower\Backup\Critical\PostgreSQLImmichBackup\ ``` --- ## Unraid User Scripts (Tower) Skripty jsou nasazeny v: ``` /boot/config/plugins/user.scripts/scripts/PostgreSQLBackup/ /boot/config/plugins/user.scripts/scripts/PostgreSQLImmichBackup/ ``` Nastavit schedule: **Settings → User Scripts → Daily** --- ## SSH přístup na Tower (z Windows/Python) Heslo pro SSH se liší od ostatních hesel! ```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) ``` > Standardní `ssh root@192.168.1.76` z Windows selže kvůli "Too many authentication failures" (nabízí klíče před heslem). Použít `look_for_keys=False, allow_agent=False`.