Fertiges Backup und Restore Skript

This commit is contained in:
2025-12-04 12:35:21 +00:00
commit abc11f69e9
2 changed files with 147 additions and 0 deletions

63
backup-script.sh Executable file
View File

@@ -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."

84
restore-script.sh Executable file
View File

@@ -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."