From 1801f8f7fd1f207a5e28661180e4922ea021dc8a Mon Sep 17 00:00:00 2001 From: Dotty Dotter Date: Wed, 1 Apr 2026 13:02:46 +0200 Subject: [PATCH] =?UTF-8?q?chore:=20restore-db.sh=20f=C3=BCr=20Restic/Hetz?= =?UTF-8?q?ner=20+=20Production-Server=20Restore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ scripts/restore-db.sh | 62 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100755 scripts/restore-db.sh diff --git a/.gitignore b/.gitignore index 24d223f..3c6f0e8 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,5 @@ tracker.db-shm tracker.db-wal tracker.db.broken *.db.broken +data/tracker.db +data/*.bak.* diff --git a/scripts/restore-db.sh b/scripts/restore-db.sh new file mode 100755 index 0000000..1672927 --- /dev/null +++ b/scripts/restore-db.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# Restore tracker.db from Restic backup (Hetzner Storage Box) +# +# Voraussetzungen: +# - restic installiert +# - RESTIC_PASSWORD aus Keychain: security find-generic-password -s restic-macmini -w +# - SSH-Key für Storage Box konfiguriert +# +# Nutzung: +# ./scripts/restore-db.sh # Letzte Version +# ./scripts/restore-db.sh latest # Letzte Version (explizit) +# ./scripts/restore-db.sh 2026-04-01 # Bestimmtes Datum (sucht nächsten Snapshot) + +set -euo pipefail + +REPO="sftp:u438391@u438391.your-storagebox.de:macmini-backup" +DB_PATH_IN_BACKUP="Users/dotty/Nextcloud/dotty/projekte/2026-03-27 Antragstracker Hagen _WIP_/antragstracker/data/tracker.db" +RESTORE_TARGET="./data/tracker.db" + +export RESTIC_PASSWORD=$(security find-generic-password -s restic-macmini -w 2>/dev/null || echo "") +if [ -z "$RESTIC_PASSWORD" ]; then + echo "❌ Restic-Passwort nicht im Keychain gefunden (restic-macmini)" + echo " Manuell: export RESTIC_PASSWORD=" + exit 1 +fi + +SNAPSHOT="${1:-latest}" + +echo "🔄 Restore tracker.db aus Restic (Snapshot: $SNAPSHOT)..." + +# Restore in temporäres Verzeichnis +TMPDIR=$(mktemp -d) +restic -r "$REPO" restore "$SNAPSHOT" \ + --include "$DB_PATH_IN_BACKUP" \ + --target "$TMPDIR" + +RESTORED="$TMPDIR/$DB_PATH_IN_BACKUP" + +if [ ! -f "$RESTORED" ]; then + echo "❌ tracker.db nicht im Snapshot gefunden" + echo " Verfügbare Snapshots:" + restic -r "$REPO" snapshots --latest 5 + rm -rf "$TMPDIR" + exit 1 +fi + +# Backup der aktuellen DB falls vorhanden +if [ -f "$RESTORE_TARGET" ]; then + BACKUP="$RESTORE_TARGET.bak.$(date +%Y%m%d-%H%M%S)" + cp "$RESTORE_TARGET" "$BACKUP" + echo "📦 Aktuelle DB gesichert: $BACKUP" +fi + +mkdir -p "$(dirname "$RESTORE_TARGET")" +mv "$RESTORED" "$RESTORE_TARGET" +rm -rf "$TMPDIR" + +SIZE=$(ls -lh "$RESTORE_TARGET" | awk '{print $5}') +echo "✅ tracker.db restored ($SIZE)" +echo "" +echo "Alternativ direkt vom Production-Server:" +echo " ssh vserver 'docker cp antragstracker-hagen:/app/data/tracker.db /tmp/tracker-export.db && cat /tmp/tracker-export.db' > data/tracker.db"