Backup und restore für die DB dazu gebaut

This commit is contained in:
2026-05-02 22:06:07 +02:00
parent fc35e9b6e7
commit cc663487e0
3 changed files with 124 additions and 0 deletions
Binary file not shown.
Executable
+17
View File
@@ -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"
Executable
+107
View File
@@ -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")"