634a6d31a4
- withGaps()-Hilfsfunktion: fügt null-Punkte bei Datenlücken ein - Betrifft: Temperatur, Luftdruck, Feuchte, Wind, Böen - restore-db.sh: mapfile durch while-read ersetzt (zsh-kompatibel)
111 lines
3.6 KiB
Bash
Executable File
111 lines
3.6 KiB
Bash
Executable File
#!/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")"
|