diff --git a/scripts/restore.sh b/scripts/restore.sh new file mode 100755 index 0000000..3ba9e6e --- /dev/null +++ b/scripts/restore.sh @@ -0,0 +1,102 @@ +#!/bin/bash +# Steuerkram – Restore-Script +# Spielt ein Backup-Paar (DB + Uploads) ein und führt anschließend alle +# ausstehenden Migrationen aus. +# +# Usage: +# ./scripts/restore.sh # neuestes vollständiges Backup +# ./scripts/restore.sh 20260517_134945 # bestimmten Timestamp + +set -eo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" +BACKUP_DIR="$PROJECT_DIR/backups" +COMPOSE="docker compose -f $PROJECT_DIR/docker-compose.yml --project-directory $PROJECT_DIR" + +# --- Timestamp ermitteln --- +if [ -n "$1" ]; then + TS="$1" +else + # Neuesten Timestamp finden, für den BEIDE Dateien existieren + TS="" + for DB_FILE in $(ls -t "$BACKUP_DIR"/steuerkram_db_????????_??????.sql 2>/dev/null); do + CANDIDATE=$(basename "$DB_FILE" .sql | sed 's/steuerkram_db_//') + UPL_FILE="$BACKUP_DIR/steuerkram_uploads_${CANDIDATE}.tar.gz" + if [ -f "$UPL_FILE" ]; then + TS="$CANDIDATE" + break + fi + done +fi + +DB_FILE="$BACKUP_DIR/steuerkram_db_${TS}.sql" +UPL_FILE="$BACKUP_DIR/steuerkram_uploads_${TS}.tar.gz" + +# --- Dateien prüfen --- +if [ -z "$TS" ]; then + echo "FEHLER: Kein vollständiges Backup-Paar (DB + Uploads) gefunden." >&2 + exit 1 +fi +if [ ! -f "$DB_FILE" ]; then + echo "FEHLER: DB-Backup nicht gefunden: $DB_FILE" >&2 + exit 1 +fi +if [ ! -f "$UPL_FILE" ]; then + echo "FEHLER: Uploads-Backup nicht gefunden: $UPL_FILE" >&2 + exit 1 +fi + +echo "========================================" +echo " Steuerkram Restore – $TS" +echo "========================================" +echo " DB: $DB_FILE" +echo " Uploads: $UPL_FILE" +echo "" + +# --- Sicherheitsabfrage --- +read -r -p "Vorhandene Datenbank und Uploads werden ÜBERSCHRIEBEN. Fortfahren? [j/N] " CONFIRM +if [[ ! "$CONFIRM" =~ ^[jJyY]$ ]]; then + echo "Abgebrochen." + exit 0 +fi + +# --- Container-Status prüfen --- +if ! $COMPOSE ps --status running db | grep -q "db"; then + echo "FEHLER: DB-Container läuft nicht. Bitte erst 'docker compose up -d' ausführen." >&2 + exit 1 +fi +if ! $COMPOSE ps --status running web | grep -q "web"; then + echo "FEHLER: Web-Container läuft nicht." >&2 + exit 1 +fi + +# --- 1. Datenbank einspielen --- +echo "" +echo "[1/3] Datenbank importieren..." +$COMPOSE exec -T db mariadb -u root -prootpass steuerkram < "$DB_FILE" +echo " OK" + +# --- 2. Uploads einspielen --- +echo "[2/3] Uploads entpacken..." +$COMPOSE exec -T web sh -c " + cat > /tmp/uploads_restore.tar.gz + tar -xzf /tmp/uploads_restore.tar.gz -C /var/www/html/public/static/ + rm /tmp/uploads_restore.tar.gz +" < "$UPL_FILE" +echo " OK" + +# --- 3. Migrationen --- +echo "[3/3] Migrationen prüfen und einspielen..." +MIGRATE_OUT=$($COMPOSE exec -T web php scripts/migrate.php 2>&1) +echo "$MIGRATE_OUT" | sed 's/^/ /' +if echo "$MIGRATE_OUT" | grep -q "FEHLER"; then + echo "" + echo "WARNUNG: Mindestens eine Migration ist fehlgeschlagen!" >&2 + exit 1 +fi + +echo "" +echo "========================================" +echo " Restore abgeschlossen." +echo "========================================" diff --git a/src/Views/belege/list.php b/src/Views/belege/list.php index 2270713..4c02a5c 100644 --- a/src/Views/belege/list.php +++ b/src/Views/belege/list.php @@ -139,10 +139,7 @@