commit abc11f69e9a93834472959770b13da7511d22a10 Author: Florian Edlmayer Date: Thu Dec 4 12:35:21 2025 +0000 Fertiges Backup und Restore Skript diff --git a/backup-script.sh b/backup-script.sh new file mode 100755 index 0000000..17db71f --- /dev/null +++ b/backup-script.sh @@ -0,0 +1,63 @@ +#!/usr/bin/bash + +set -euo pipefail + +# Speicherort der Backups +BACKUP_ROOT="/var/backups" + +# 30 Backups sollen behalten werden +RETAIN=30 + +# Postgres-Verbindung +PGHOST="localhost" +PGPORT="5432" +PGUSER="florian" +PGDATABASE="oqtane" + +OQTANE_DIR="/home/konstantin/oqtane.framework/publish" + +# Timestamp für den Ordnernamen +TS="$(date -u +'%Y%m%dT%H%M%SZ')" +DEST_DIR="${BACKUP_ROOT}/oqtane_${TS}" + +########## Vorbereitung ########## +mkdir -p "$DEST_DIR" + +echo "[$(date -Iseconds)] Starte Backup, Ziel: $DEST_DIR" + +########## 1) Postgres-Backup ########## +# Voraussetzung: Passwortzugang über ~/.pgpass für den Benutzer, +# unter dem dieses Skript läuft. + +# Dump nur der DB oqtane (Custom-Format) +pg_dump -h "localhost" -p "5432" -U "florian" -d "oqtane" -Fc \ + -f "${DEST_DIR}/db_${PGDATABASE}.dump" + + +echo "[$(date -Iseconds)] Postgres-Backup fertig." + +########## 2) Komplettes System-Backup ########## +# Achtung: sollte als root laufen, damit alle Dateien gelesen werden können. + +tar -cvpzf "${DEST_DIR}/oqtane_files.tar.gz" \ + --absolute-names "$OQTANE_DIR" + +echo "[$(date -Iseconds)] Oqtane-Ordner gesichert." + +########## 3) Rotation: nur die letzten $RETAIN Backups behalten ########## +shopt -s nullglob +backups=( "$BACKUP_ROOT"/* ) + +# Nach Ordnernamen (Timestamp) absteigend sortieren = neueste zuerst +IFS=$'\n' backups=( $(printf '%s\n' "${backups[@]}" | sort -r) ) +unset IFS + +if (( ${#backups[@]} > RETAIN )); then + echo "[$(date -Iseconds)] Zu viele Backups: ${#backups[@]} > $RETAIN. Lösche alte…" + for old in "${backups[@]:RETAIN}"; do + echo " Lösche $old" + rm -rf -- "$old" + done +fi + +echo "[$(date -Iseconds)] Backup-Job abgeschlossen." diff --git a/restore-script.sh b/restore-script.sh new file mode 100755 index 0000000..a8d25eb --- /dev/null +++ b/restore-script.sh @@ -0,0 +1,84 @@ +#!/usr/bin/env bash +set -euo pipefail + +########## KONFIG ########## +BACKUP_ROOT="/var/backups/fullserver" + +PGHOST="localhost" +PGPORT="5432" +PGUSER="florian" +PGDATABASE="oqtane" + +# Wohin die Dateien von oqtane.server gehören +OQTANE_DIR="/home/konstantin/oqtane.framework/oqtane.server" + +########## BACKUP-ORDNER AUSWÄHLEN ########## +# Aufruf: ./restore-backup.sh [oqtane_TIMESTAMP] +# Ohne Argument -> neuestes Backup verwenden + +if [[ $# -ge 1 ]]; then + BACKUP_SUBDIR="$1" +else + BACKUP_SUBDIR="$(ls -1 "${BACKUP_ROOT}" | sort | tail -n 1)" +fi + +BACKUP_DIR="${BACKUP_ROOT}/${BACKUP_SUBDIR}" + +if [[ ! -d "$BACKUP_DIR" ]]; then + echo "Backup-Verzeichnis nicht gefunden: $BACKUP_DIR" + exit 1 +fi + +DUMP_FILE="${BACKUP_DIR}/db_${PGDATABASE}.dump" +FILES_ARCHIVE="${BACKUP_DIR}/oqtane_files.tar.gz" + +if [[ ! -f "$DUMP_FILE" ]]; then + echo "Dump-Datei nicht gefunden: $DUMP_FILE" + exit 1 +fi + +echo "Verwende Backup: $BACKUP_DIR" +echo + +########## WARNUNG ########## +echo "ACHTUNG:" +echo " - Die Datenbank '${PGDATABASE}' wird GELÖSCHT und aus dem Backup neu erstellt." +echo " - Der Ordner '${OQTANE_DIR}' wird mit den Dateien aus dem Backup überschrieben (Status aus dem Archiv)." +echo +read -rp "Fortfahren? (ja/nein): " answer +if [[ "$answer" != "ja" ]]; then + echo "Abgebrochen." + exit 0 +fi + +########## 1) DATENBANK WIEDERHERSTELLEN ########## +echo "[DB] Versuche, bestehende Datenbank zu droppen (falls vorhanden)…" +dropdb -h "$PGHOST" -p "$PGPORT" -U "$PGUSER" "$PGDATABASE" 2>/dev/null || echo "[DB] Datenbank existierte nicht, ok." + +echo "[DB] Neue leere Datenbank anlegen…" +createdb -h "$PGHOST" -p "$PGPORT" -U "$PGUSER" "$PGDATABASE" + +echo "[DB] Backup-Dump einspielen…" +pg_restore -h "$PGHOST" -p "$PGPORT" -U "$PGUSER" \ + -d "$PGDATABASE" -c "$DUMP_FILE" + +echo "[DB] Datenbank-Restore abgeschlossen." +echo + +########## 2) DATEIEN VON OQTANE.SERVER WIEDERHERSTELLEN ########## +if [[ -f "$FILES_ARCHIVE" ]]; then + echo "[FILES] Sicherung des aktuellen Oqtane-Ordners…" + if [[ -d "$OQTANE_DIR" ]]; then + mv "$OQTANE_DIR" "${OQTANE_DIR}.old.$(date +%s)" + fi + + echo "[FILES] Entpacke ${FILES_ARCHIVE}…" + tar -xvpzf "$FILES_ARCHIVE" + + echo "[FILES] Dateien-Restore abgeschlossen." +else + echo "[FILES] Archiv ${FILES_ARCHIVE} nicht gefunden, überspringe Dateirestore." +fi + +echo +echo "Restore vollständig abgeschlossen."