diff --git a/.gitignore b/.gitignore index d4a8b9b..346bc41 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ node_modules/ .DS_Store *.log docker-compose.yaml +backups/ diff --git a/README.md b/README.md index 47a4642..3d72601 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,27 @@ Optionale Variablen: BACKUP_DIR=/pfad/zum/backup KEEP_DAYS=90 ./scripts/backup-db.sh ``` +### 6. Datenbank Restore + +```bash +./scripts/restore-db.sh backups/resource_manager-YYYYMMDD-HHMMSS.sql.gz +``` + +Vor dem Restore wird automatisch ein neues Sicherheitsbackup erstellt. +Der Restore muss durch Eingabe des Datenbanknamens bestaetigt werden. + +Ohne Rueckfrage, z. B. fuer Automatisierung: + +```bash +FORCE=1 ./scripts/restore-db.sh backups/resource_manager-YYYYMMDD-HHMMSS.sql.gz +``` + +Sicherheitsbackup vor dem Restore ueberspringen: + +```bash +SKIP_PRE_RESTORE_BACKUP=1 ./scripts/restore-db.sh backups/resource_manager-YYYYMMDD-HHMMSS.sql.gz +``` + 🗄️ Datenbank Schema resources diff --git a/scripts/restore-db.sh b/scripts/restore-db.sh new file mode 100755 index 0000000..a4aaa6d --- /dev/null +++ b/scripts/restore-db.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +DB_SERVICE="${DB_SERVICE:-db}" +DB_NAME="${DB_NAME:-resource_manager}" +DB_USER="${DB_USER:-resman}" +DB_PASSWORD="${DB_PASSWORD:-resmanpass}" +FORCE="${FORCE:-0}" +SKIP_PRE_RESTORE_BACKUP="${SKIP_PRE_RESTORE_BACKUP:-0}" + +if [[ $# -ne 1 ]]; then + echo "Usage: $0 " + exit 1 +fi + +RESTORE_FILE="$1" + +if [[ ! -f "$RESTORE_FILE" ]]; then + echo "Backup file not found: $RESTORE_FILE" + exit 1 +fi + +cd "$ROOT_DIR" + +if [[ "$FORCE" != "1" ]]; then + echo "This will restore '$RESTORE_FILE' into database '$DB_NAME'." + echo "Existing data may be overwritten." + read -r -p "Type '$DB_NAME' to continue: " CONFIRMATION + + if [[ "$CONFIRMATION" != "$DB_NAME" ]]; then + echo "Restore cancelled." + exit 1 + fi +fi + +if [[ "$SKIP_PRE_RESTORE_BACKUP" != "1" ]]; then + echo "Creating safety backup before restore..." + "$ROOT_DIR/scripts/backup-db.sh" +fi + +echo "Restoring database '$DB_NAME' from: $RESTORE_FILE" + +if [[ "$RESTORE_FILE" == *.gz ]]; then + gunzip -c "$RESTORE_FILE" | docker compose exec -T "$DB_SERVICE" \ + mariadb \ + --user="$DB_USER" \ + --password="$DB_PASSWORD" \ + "$DB_NAME" +else + docker compose exec -T "$DB_SERVICE" \ + mariadb \ + --user="$DB_USER" \ + --password="$DB_PASSWORD" \ + "$DB_NAME" \ + < "$RESTORE_FILE" +fi + +echo "Restore finished."