diff --git a/backups/wetterstation_20260502_2144.dump b/backups/wetterstation_20260502_2144.dump new file mode 100644 index 0000000..147a28c Binary files /dev/null and b/backups/wetterstation_20260502_2144.dump differ diff --git a/do_dbBackup.sh b/do_dbBackup.sh new file mode 100755 index 0000000..08ce120 --- /dev/null +++ b/do_dbBackup.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# backup-db.sh +set -euo pipefail +source /Users/rxf/Projekte/wetterstation/.env + +BACKUP_DIR="/Users/rxf/Projekte/wetterstation/backups" +mkdir -p "$BACKUP_DIR" +FILENAME="wetterstation_$(date +%Y%m%d_%H%M).dump" + +docker exec wetterstation_db pg_dump -U "$DB_USER" -d "$DB_NAME" -F c -f /tmp/backup.dump +docker cp wetterstation_db:/tmp/backup.dump "$BACKUP_DIR/$FILENAME" +docker exec wetterstation_db rm /tmp/backup.dump + +# Alte Backups löschen (älter als 30 Tage) +find "$BACKUP_DIR" -name "*.dump" -mtime +30 -delete + +echo "Backup gespeichert: $BACKUP_DIR/$FILENAME" diff --git a/restore-db.sh b/restore-db.sh new file mode 100755 index 0000000..ec21abf --- /dev/null +++ b/restore-db.sh @@ -0,0 +1,107 @@ +#!/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 + + mapfile -t DUMPS < <(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")"