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>
44 lines
1.8 KiB
Bash
44 lines
1.8 KiB
Bash
#!/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\""
|