Backup und restore für die DB dazu gebaut
This commit is contained in:
Binary file not shown.
Executable
+17
@@ -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
@@ -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")"
|
||||||
Reference in New Issue
Block a user