#!/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."