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>
58 lines
2.1 KiB
Bash
58 lines
2.1 KiB
Bash
#!/bin/sh
|
|
# ─────────────────────────────────────────────────────────────
|
|
# Spielt eine mit backup.sh erzeugte Sicherung zurueck.
|
|
#
|
|
# ACHTUNG: Der aktuelle Inhalt der Datenbank wird ersetzt.
|
|
#
|
|
# Aufruf: ./scripts/restore.sh <datei.sql> [--force]
|
|
#
|
|
# Zieldatenbank ueberschreiben mit NEBULA_DB_NAME. Damit laesst sich eine
|
|
# Sicherung pruefen, ohne die echte Datenbank anzufassen:
|
|
#
|
|
# docker exec nebula-db psql -U nebula -d postgres -c "CREATE DATABASE nebula_test"
|
|
# NEBULA_DB_NAME=nebula_test ./scripts/restore.sh backups/... --force
|
|
# ─────────────────────────────────────────────────────────────
|
|
set -eu
|
|
|
|
root="$(cd "$(dirname "$0")/.." && pwd)"
|
|
file="${1:-}"
|
|
force="${2:-}"
|
|
container="${NEBULA_DB_CONTAINER:-nebula-db}"
|
|
|
|
if [ -z "$file" ]; then
|
|
echo "Aufruf: ./scripts/restore.sh <datei.sql> [--force]" >&2
|
|
exit 1
|
|
fi
|
|
if [ ! -f "$file" ]; then
|
|
echo "Datei nicht gefunden: $file" >&2
|
|
exit 1
|
|
fi
|
|
|
|
user="nebula"
|
|
database="nebula"
|
|
if [ -f "$root/.env" ]; then
|
|
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
|
|
database="${NEBULA_DB_NAME:-$database}"
|
|
|
|
if [ "$force" != "--force" ]; then
|
|
printf "Der gesamte Inhalt der Datenbank '%s' wird ersetzt.\nWirklich fortfahren? (ja/nein) " "$database"
|
|
read -r answer
|
|
[ "$answer" = "ja" ] || { echo "Abgebrochen."; exit 0; }
|
|
fi
|
|
|
|
if ! docker ps --filter "name=$container" --format '{{.Names}}' | grep -qx "$container"; then
|
|
echo "Container '$container' laeuft nicht." >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "Spiele '$file' ein..."
|
|
docker exec -i "$container" psql -U "$user" -d "$database" -v ON_ERROR_STOP=1 < "$file"
|
|
|
|
echo "Fertig. Anwendung neu starten, damit sie eine frische Verbindung aufbaut."
|