From ce365e3e79aa8a888f18d91b691373938a5b331a Mon Sep 17 00:00:00 2001 From: rxf Date: Sun, 31 May 2026 17:42:07 +0000 Subject: [PATCH] V 1.7.9: backup_db.sh dazu gebaut --- README.md | 9 ++++ backup_db.sh | 144 +++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 3 files changed, 154 insertions(+), 1 deletion(-) create mode 100755 backup_db.sh diff --git a/README.md b/README.md index 8f67046..58fd3b5 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,15 @@ Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/bui - Middleware / Sicherheit: - Die Proxy-Route wird in der App-Auth-Middleware erlaubt, so dass der Proxy die Statistik-Seite auch ohne Benutzer-Session laden kann (Zugangskontrolle erfolgt über die serverseitigen Basic-Auth-Variablen). +- Datenbank-Backup: + - Das neue Skript `backup_db.sh` erzeugt ein tägliches MySQL-Dump-Backup im Verzeichnis `DB_BACKUP/`. + - Standardmäßig werden Backups älter als 7 Tage automatisch gelöscht. + - Beispiel-Cron-Eintrag für täglich 02:00 Uhr: + +```cron +0 2 * * * cd /pfad/zum/repo && DB_ROOT_PASS=deinrootpass DB_NAME=sternwarte ./backup_db.sh --days 7 +``` + Hinweis: Speichere sensible Zugangsdaten nicht in Repositories. Setze die drei `STATISTIK_...` Variablen in deiner Deployment-Umgebung (z. B. Docker secrets, CI/CD environment variables oder auf dem Server). Die Proxy-Implementierung entfernt framing-blockierende Header und schiebt relative Asset-Pfade durch den Proxy, um Kompatibilitätsprobleme mit Browsern zu vermeiden. Test, ob das nun Deployed, wenn auf main gepushed wird. \ No newline at end of file diff --git a/backup_db.sh b/backup_db.sh new file mode 100755 index 0000000..5b510d3 --- /dev/null +++ b/backup_db.sh @@ -0,0 +1,144 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Tägliches MySQL-Backup für das Logbuch-Projekt. +# +# Verwendung: +# ./backup_db.sh +# DB_ROOT_PASS=... DB_NAME=... ./backup_db.sh +# ./backup_db.sh --days 14 --backup-dir /var/backups/logbuch +# +# Installiert keine Abhängigkeiten. Nutzt den laufenden Container mit dem Namen logbuch_mysql. + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BACKUP_DIR_DEFAULT="$SCRIPT_DIR/DB_BACKUP" +CONTAINER_DEFAULT="logbuch_mysql" +KEEP_DAYS_DEFAULT=7 + +ROOT_PASS="${DB_ROOT_PASS:-${MYSQL_ROOT_PASSWORD:-}}" +DB_NAME="${DB_NAME:-${MYSQL_DATABASE:-}}" +BACKUP_DIR="$BACKUP_DIR_DEFAULT" +CONTAINER="$CONTAINER_DEFAULT" +KEEP_DAYS="$KEEP_DAYS_DEFAULT" +REMOTE="" +REMOTE_RETENTION="" + +usage() { + cat <&2 + usage + exit 1 + ;; + esac +done + +if [[ -z "$ROOT_PASS" ]]; then + echo "Fehler: MySQL root Passwort ist nicht gesetzt. Setze DB_ROOT_PASS oder MYSQL_ROOT_PASSWORD." >&2 + exit 1 +fi + +if [[ -z "$DB_NAME" ]]; then + echo "Fehler: Datenbankname ist nicht gesetzt. Setze DB_NAME oder MYSQL_DATABASE." >&2 + exit 1 +fi + +mkdir -p "$BACKUP_DIR" + +TIMESTAMP="$(date +%Y%m%d_%H%M%S)" +BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_$TIMESTAMP.sql.gz" + +echo "Erstelle Backup: $BACKUP_FILE" + +docker exec "$CONTAINER" mysqldump --single-transaction --quick --lock-tables=false \ + --triggers --routines --events --set-gtid-purged=OFF -uroot -p"$ROOT_PASS" "$DB_NAME" | gzip > "$BACKUP_FILE" + +if [[ ! -s "$BACKUP_FILE" ]]; then + echo "Fehler: Backup konnte nicht erstellt werden." >&2 + exit 1 +fi + +echo "Backup erfolgreich erstellt: $BACKUP_FILE" + +# Optional: upload to remote host (format: user@host:/path) +if [[ -n "$REMOTE" ]]; then + echo "Upload nach Remote: $REMOTE" + if [[ -z "$REMOTE_RETENTION" ]]; then + REMOTE_RETENTION="$KEEP_DAYS" + fi + if [[ "$REMOTE" == *":"* ]]; then + REMOTE_HOSTPART="${REMOTE%%:*}" + REMOTE_PATH="${REMOTE#*:}" + if [[ -z "$REMOTE_PATH" ]]; then + REMOTE_PATH="." + fi + # Verzeichnis auf Remote anlegen, dann Datei kopieren + ssh -o BatchMode=yes "$REMOTE_HOSTPART" "mkdir -p \"$REMOTE_PATH\"" + if ! scp -q "$BACKUP_FILE" "${REMOTE_HOSTPART}:${REMOTE_PATH}/"; then + echo "Warnung: Hochladen nach Remote fehlgeschlagen." >&2 + else + echo "Upload erfolgreich." + echo "Auf Remote $REMOTE_HOSTPART: entferne Backups älter als $REMOTE_RETENTION Tage in $REMOTE_PATH" + ssh -o BatchMode=yes "$REMOTE_HOSTPART" "find \"$REMOTE_PATH\" -maxdepth 1 -type f -name '${DB_NAME}_*.sql.gz' -mtime +$REMOTE_RETENTION -print -delete" || true + fi + else + if ! scp -q "$BACKUP_FILE" "$REMOTE"; then + echo "Warnung: Hochladen nach Remote fehlgeschlagen." >&2 + else + echo "Upload erfolgreich." + fi + fi +fi + +echo "Lösche Backups älter als $KEEP_DAYS Tage im Verzeichnis $BACKUP_DIR" +find "$BACKUP_DIR" -maxdepth 1 -type f -name "${DB_NAME}_*.sql.gz" -mtime +"$KEEP_DAYS" -print -delete || true + +echo "Fertig." diff --git a/package.json b/package.json index 47b20b1..28ac91e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "logbuch", - "version": "1.7.8", + "version": "1.7.9", "private": true, "scripts": { "dev": "next dev",