#!/bin/bash # restore-db.sh – Wetterstation PostgreSQL-Datenbank wiederherstellen # Verwendung: # ./restore-db.sh # interaktiv – wählt aus vorhandenen Backups # ./restore-db.sh backups/wetterstation_20260502_0300.dump # direkt mit Datei set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ENV_FILE="$SCRIPT_DIR/.env" BACKUP_DIR="$SCRIPT_DIR/backups" CONTAINER="wetterstation_db" # ── .env laden ────────────────────────────────────────────────────────────── if [[ ! -f "$ENV_FILE" ]]; then echo "FEHLER: .env nicht gefunden: $ENV_FILE" exit 1 fi source "$ENV_FILE" echo "==========================================" echo " Wetterstation – DB-Restore" echo "==========================================" echo " Datenbank : $DB_NAME" echo " Benutzer : $DB_USER" echo " Container : $CONTAINER" echo "" # ── Backup-Datei bestimmen ──────────────────────────────────────────────── if [[ $# -ge 1 ]]; then DUMP_FILE="$1" else # Interaktiv: alle *.dump-Dateien im Backup-Verzeichnis auflisten if [[ ! -d "$BACKUP_DIR" ]]; then echo "FEHLER: Backup-Verzeichnis nicht gefunden: $BACKUP_DIR" exit 1 fi DUMPS=() while IFS= read -r line; do DUMPS+=("$line") done < <(find "$BACKUP_DIR" -name "*.dump" | sort -r) if [[ ${#DUMPS[@]} -eq 0 ]]; then echo "FEHLER: Keine Backup-Dateien in $BACKUP_DIR gefunden." exit 1 fi echo "Verfügbare Backups (neuestes zuerst):" for i in "${!DUMPS[@]}"; do SIZE=$(du -sh "${DUMPS[$i]}" | cut -f1) echo " [$((i+1))] $(basename "${DUMPS[$i]}") ($SIZE)" done echo "" read -rp "Welches Backup wiederherstellen? [1-${#DUMPS[@]}]: " CHOICE if ! [[ "$CHOICE" =~ ^[0-9]+$ ]] || (( CHOICE < 1 || CHOICE > ${#DUMPS[@]} )); then echo "Ungültige Auswahl. Abbruch." exit 1 fi DUMP_FILE="${DUMPS[$((CHOICE-1))]}" fi if [[ ! -f "$DUMP_FILE" ]]; then echo "FEHLER: Datei nicht gefunden: $DUMP_FILE" exit 1 fi DUMP_SIZE=$(du -sh "$DUMP_FILE" | cut -f1) echo "Gewähltes Backup : $(basename "$DUMP_FILE") ($DUMP_SIZE)" echo "" # ── Sicherheitsabfrage ──────────────────────────────────────────────────── echo "WARNUNG: Der Restore überschreibt alle vorhandenen Daten in '$DB_NAME'!" read -rp "Wirklich fortfahren? (ja/n): " CONFIRM if [[ "$CONFIRM" != "ja" ]]; then echo "Abgebrochen." exit 0 fi # ── Container prüfen ───────────────────────────────────────────────────── if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then echo "FEHLER: Container '$CONTAINER' läuft nicht." echo "Starte ihn mit: docker compose up -d postgres" exit 1 fi # ── Restore durchführen ────────────────────────────────────────────────── echo "" echo "Kopiere Dump in Container..." docker cp "$DUMP_FILE" "${CONTAINER}:/tmp/restore.dump" echo "Stelle Datenbank wieder her..." docker exec "$CONTAINER" pg_restore \ -U "$DB_USER" \ -d "$DB_NAME" \ --clean \ --if-exists \ --no-owner \ --no-privileges \ -F c \ /tmp/restore.dump echo "Räume auf..." docker exec "$CONTAINER" rm /tmp/restore.dump echo "" echo "✓ Restore abgeschlossen: $(basename "$DUMP_FILE")"