Záloha PostgreSQL přes pg_dump
Cíl: pravidelný, konzistentní dump databáze PostgreSQL běžící v Dockeru, který přežije i zálohu celého serveru za běhu a jde obnovit i do novější verze PostgreSQL.
Předpoklady: přístup do shellu hostitele (SSH), práva spouštět docker, adresář, který se dál zálohuje (USB disk, NAS, záloha Umbrelu).
Proč dump, a ne jen záloha souborů
- Kopie datového adresáře je spolehlivá jen při vypnutém serveru. Záloha za běhu může obsahovat databázi v nekonzistentním stavu. dok. PostgreSQL
pg_dumpdělá konzistentní snapshot za běhu a neblokuje provoz. Jeho výstup jde načíst i do novější verze, takže slouží zároveň jako pojistka před upgradem (17 → 18). dok. PostgreSQL- Syntéza: zálohy celého serveru (např. umbrelOS) nech běžet dál a dump ukládej do adresáře, který tato záloha zahrnuje. Záloha serveru pak přenese i konzistentní dump.
Postup
- Zjisti název kontejneru, uživatele a databázi:
docker ps --format '{{.Names}}' | grep -i postgres docker exec <kontejner> psql -U <uživatel> -l - Ruční dump v custom formátu (komprimovaný, obnova přes
pg_restore). dok. PostgreSQLpg_dumpse spouští uvnitř kontejneru, takže verze klienta odpovídá serveru (Syntéza).docker exec <kontejner> pg_dump -U <uživatel> -Fc <databáze> > /cesta/k/zaloham/<databáze>-$(date +%F).dump - Volitelně role a další globální nastavení.
pg_dumpje nezálohuje. dok. PostgreSQLdocker exec <kontejner> pg_dumpall -U <uživatel> --globals-only > /cesta/k/zaloham/globals-$(date +%F).sql - Skript pro pravidelné spouštění s mazáním starých dumpů (Syntéza), např.
pg-backup.sh:
Soubor#!/bin/sh set -e CONTAINER=<kontejner> DB=<databáze> DBUSER=<uživatel> DIR=/cesta/k/zaloham KEEP_DAYS=14 TMP="$DIR/$DB-$(date +%F_%H%M).dump.part" docker exec "$CONTAINER" pg_dump -U "$DBUSER" -Fc "$DB" > "$TMP" mv "$TMP" "${TMP%.part}" find "$DIR" -name "$DB-*.dump" -mtime +"$KEEP_DAYS" -delete.partse přejmenuje až po úspěšném dumpu, takže nedokončený dump nevypadá jako platná záloha. - Naplánuj ho přes cron, např. denně ve 3:00, před zálohou celého serveru:
0 3 * * * /cesta/k/pg-backup.sh >> /cesta/k/zaloham/pg-backup.log 2>&1
Ověření
- Obsah dumpu (bez obnovy):
docker exec -i <kontejner> pg_restore -l < soubor.dump | head - Zkušební obnova do testovací databáze (Syntéza: záloha, kterou jsi nikdy neobnovil, není ověřená):
Postup sdocker exec <kontejner> createdb -U <uživatel> -T template0 restore_test docker exec -i <kontejner> pg_restore -U <uživatel> -d restore_test < soubor.dump docker exec <kontejner> dropdb -U <uživatel> restore_testcreatedb -T template0apg_restore -dpodle dok. PostgreSQL.
Obnova
- Do nové prázdné databáze:
createdb -T template0 <databáze>a pakpg_restore -d <databáze> soubor.dump(přesdocker exec -ijako výše). dok. PostgreSQL - Při obnově do nové instalace nejdřív načti
globals-*.sql(role) přespsql, pak databázi. - Syntéza: před obnovou do produkční databáze zastav toky v Node-RED, které do ní zapisují.
Troubleshooting
pg_dumpchce heslo: předej ho proměnnou prostředí jen pro daný příkaz (docker exec -e PGPASSWORD=… …), nikdy ho nepiš do wiki ani do repa. Syntéza.- Prázdný nebo malý dump: špatná databáze nebo uživatel, zkontroluj krok 1 a
pg-backup.log. - Restore hlásí chybějící role: nejdřív obnov
globals-*.sql.
Souvislosti
Zdroje
- PostgreSQL: oficiální Docker image + dokumentace 17 (zálohy, upgrade): SQL dump, custom formát,
pg_restore,pg_dumpall --globals-only, záloha souborů jen při vypnutém serveru. - umbrelOS / Umbrel Home (README, app store, produktová stránka): aplikace jako Docker Compose projekty, data v
${APP_DATA_DIR}.
Intellihome