94 lines
2.7 KiB
Bash
94 lines
2.7 KiB
Bash
#!/bin/bash
|
||
set -e
|
||
|
||
echo "🧯 Hördle restore script – Rollback auf früheres Datenbank-Backup"
|
||
|
||
# Hilfsfunktion für Fehlerausgabe
|
||
die() {
|
||
echo "❌ $1" >&2
|
||
exit 1
|
||
}
|
||
|
||
# Backup-Verzeichnis
|
||
BACKUP_DIR="./backups"
|
||
|
||
if [ ! -d "$BACKUP_DIR" ]; then
|
||
die "Kein Backup-Verzeichnis gefunden (${BACKUP_DIR}). Es scheint noch kein Deployment-Backup erstellt worden zu sein."
|
||
fi
|
||
|
||
# Argument: gewünschter Backup-Timestamp oder 'latest'
|
||
TARGET="$1"
|
||
|
||
if [ -z "$TARGET" ]; then
|
||
echo "⚙️ Nutzung:"
|
||
echo " ./scripts/restore.sh latest # neuestes Backup zurückspielen"
|
||
echo " ./scripts/restore.sh 20250101_120000 # bestimmtes Backup (Timestamp aus Dateiname)"
|
||
echo ""
|
||
echo "Verfügbare Backups:"
|
||
ls -1 "${BACKUP_DIR}"/*.db 2>/dev/null || echo " (keine .db-Backups gefunden)"
|
||
exit 1
|
||
fi
|
||
|
||
# DB-Pfad wie in deploy.sh bestimmen
|
||
DB_PATH=""
|
||
|
||
if [ -f "docker-compose.yml" ]; then
|
||
DB_PATH=$(grep -oP 'DATABASE_URL=file:\K[^\s]+' docker-compose.yml | head -1)
|
||
fi
|
||
|
||
if [ -z "$DB_PATH" ] && [ -f ".env" ]; then
|
||
DB_PATH=$(grep -oP '^DATABASE_URL=file:\K.+' .env | head -1)
|
||
fi
|
||
|
||
DB_PATH=$(echo "$DB_PATH" | tr -d '"' | tr -d "'")
|
||
|
||
if [ -z "$DB_PATH" ]; then
|
||
die "Konnte den Datenbank-Pfad aus docker-compose.yml oder .env nicht ermitteln."
|
||
fi
|
||
|
||
# Containerpfad zu Hostpfad umbauen (/app/... -> ./...)
|
||
DB_PATH=$(echo "$DB_PATH" | sed 's|/app/|./|')
|
||
|
||
echo "📁 Ziel-Datenbank-Datei: $DB_PATH"
|
||
|
||
# Backup-Datei bestimmen
|
||
if [ "$TARGET" = "latest" ]; then
|
||
BACKUP_FILE=$(ls -t "${BACKUP_DIR}"/*.db 2>/dev/null | head -1 || true)
|
||
[ -z "$BACKUP_FILE" ] && die "Kein Backup gefunden."
|
||
else
|
||
# Versuchen, exakten Dateinamen zu finden
|
||
if [ -f "${BACKUP_DIR}/${TARGET}" ]; then
|
||
BACKUP_FILE="${BACKUP_DIR}/${TARGET}"
|
||
else
|
||
# Versuchen, anhand des Timestamps ein Backup zu finden
|
||
BACKUP_FILE=$(ls "${BACKUP_DIR}"/*"${TARGET}"*.db 2>/dev/null | head -1 || true)
|
||
fi
|
||
|
||
[ -z "$BACKUP_FILE" ] && die "Kein Backup für '${TARGET}' gefunden."
|
||
fi
|
||
|
||
echo "⏪ Verwende Backup-Datei: $BACKUP_FILE"
|
||
|
||
if [ ! -f "$BACKUP_FILE" ]; then
|
||
die "Backup-Datei existiert nicht: $BACKUP_FILE"
|
||
fi
|
||
|
||
read -p "❗ Dies überschreibt die aktuelle Datenbank-Datei. Fortfahren? [y/N] " CONFIRM
|
||
if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
|
||
echo "Abgebrochen."
|
||
exit 0
|
||
fi
|
||
|
||
echo "📦 Kopiere Backup nach: $DB_PATH"
|
||
cp "$BACKUP_FILE" "$DB_PATH"
|
||
|
||
echo "🔄 Starte Docker-Container neu..."
|
||
docker compose restart hoerdle
|
||
|
||
echo "✅ Restore abgeschlossen."
|
||
echo "ℹ️ Hinweis: Der Code-Stand (Git-Commit) ist nicht automatisch zurückgedreht."
|
||
echo " Falls du auch die App-Version zurückrollen möchtest, checke lokal den passenden Commit/Tag aus"
|
||
echo " und führe anschließend wieder ./scripts/deploy.sh aus."
|
||
|
||
|