feat(ops): Sicherungsskripte mit pg_dump fuer Windows und Unix
Die JSON-Sicherung im Adminbereich eignet sich zum Umziehen. Zum Wiederherstellen einer kaputten Instanz braucht es dagegen einen echten Dump - Schema, Daten, Sequenzen, Indizes. backup.ps1 und backup.sh fuehren pg_dump im Container aus, es muss also nichts auf dem Rechner installiert sein. Benutzer und Datenbankname kommen aus der .env, damit sie nicht doppelt gepflegt werden. Der Dump entsteht mit --clean --if-exists und ist damit fuer sich allein einspielbar. restore.* fragt vor dem Ueberschreiben nach und laesst sich ueber -Database beziehungsweise NEBULA_DB_NAME auf eine andere Datenbank umlenken. Damit laesst sich eine Sicherung pruefen, ohne die echte anzufassen - eine Sicherung, die nie zurueckgespielt wurde, ist keine. /backups liegt im .gitignore: die Dateien enthalten alle Daten der Instanz. Geprueft am echten Bestand: Dump 30,9 KB mit allen neun Tabellen, Rueckspielung in eine Pruefdatenbank ergab dieselben Zahlen, das Original blieb unveraendert. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
#!/bin/sh
|
||||
# ─────────────────────────────────────────────────────────────
|
||||
# Byteweise Sicherung der Nebula-Datenbank mit pg_dump.
|
||||
#
|
||||
# Ergaenzt den JSON-Export im Adminbereich um eine vollstaendige
|
||||
# Datenbanksicherung: Schema, Daten, Sequenzen, Indizes.
|
||||
#
|
||||
# Aufruf: ./scripts/backup.sh [Zielverzeichnis]
|
||||
# ─────────────────────────────────────────────────────────────
|
||||
set -eu
|
||||
|
||||
root="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
out_dir="${1:-$root/backups}"
|
||||
container="${NEBULA_DB_CONTAINER:-nebula-db}"
|
||||
|
||||
user="nebula"
|
||||
database="nebula"
|
||||
if [ -f "$root/.env" ]; then
|
||||
# Nur die beiden benoetigten Werte lesen, ohne die Datei auszufuehren.
|
||||
value_of() {
|
||||
sed -n "s/^[[:space:]]*$1[[:space:]]*=[[:space:]]*\"\{0,1\}\([^\"#]*\)\"\{0,1\}[[:space:]]*$/\1/p" \
|
||||
"$root/.env" | tail -n 1
|
||||
}
|
||||
[ -n "$(value_of POSTGRES_USER)" ] && user="$(value_of POSTGRES_USER)"
|
||||
[ -n "$(value_of POSTGRES_DB)" ] && database="$(value_of POSTGRES_DB)"
|
||||
fi
|
||||
|
||||
if ! docker ps --filter "name=$container" --format '{{.Names}}' | grep -qx "$container"; then
|
||||
echo "Container '$container' laeuft nicht. Zuerst 'docker compose up -d db' ausfuehren." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir -p "$out_dir"
|
||||
stamp="$(date +%Y-%m-%d-%H%M%S)"
|
||||
target="$out_dir/nebula-$stamp.sql"
|
||||
|
||||
echo "Sichere Datenbank '$database' aus Container '$container'..."
|
||||
# --clean --if-exists macht die Datei fuer sich allein einspielbar.
|
||||
docker exec "$container" pg_dump -U "$user" -d "$database" --clean --if-exists > "$target"
|
||||
|
||||
size="$(du -h "$target" | cut -f1)"
|
||||
echo "Fertig: $target ($size)"
|
||||
echo "Wiederherstellen mit: ./scripts/restore.sh \"$target\""
|
||||
Reference in New Issue
Block a user