From e7ba6ee19ccb8daea119f99fe5136c9c10236acd Mon Sep 17 00:00:00 2001 From: Dotty Dotter Date: Sun, 10 May 2026 12:49:15 +0200 Subject: [PATCH] scripts: backup-db.sh akzeptiert Container-Name + Auto-Detect-Pfad MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vorher waren Container-Name + BACKUP_DIR hardcoded auf prod-Werte (gwoe-antragspruefer / /opt/gwoe-antragspruefer/backups). Auf dem dev-Server hat das Skript via git pull deshalb in den prod-Pfad geschrieben und gegen den prod-Container geredet — dev hatte effektiv keinen eigenen Dump. Fix: - Container-Name als optionales $1-Argument (Default: gwoe-antragspruefer) - BACKUP_DIR aus Skript-Pfad abgeleitet (parent-of-scripts/.../backups) - Cron auf dev muss mit Argument 'gwoe-antragspruefer-dev' aufrufen --- scripts/backup-db.sh | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/scripts/backup-db.sh b/scripts/backup-db.sh index b05d50a..6b60b5b 100755 --- a/scripts/backup-db.sh +++ b/scripts/backup-db.sh @@ -1,19 +1,37 @@ #!/bin/bash # Daily backup via Pythons sqlite3.backup() — atomar, async-DB-safe, # kein sqlite3-CLI im Container vorausgesetzt. +# +# Usage: +# ./scripts/backup-db.sh # Default: prod +# ./scripts/backup-db.sh gwoe-antragspruefer-dev # dev +# +# Auto-Detect: BACKUP_DIR wird aus dem Skript-Pfad abgeleitet +# (parent-of-scripts/.../backups), damit die gleiche Datei via +# `git pull` auf prod und dev funktioniert ohne pfad-spezifisches Hardcoding. set -euo pipefail + +CONTAINER="${1:-gwoe-antragspruefer}" +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_DIR="$(dirname "$SCRIPT_DIR")" +BACKUP_DIR="${BACKUP_DIR:-$PROJECT_DIR/backups}" TS=$(date +%Y%m%d-%H%M%S) -BACKUP_DIR=/opt/gwoe-antragspruefer/backups -mkdir -p $BACKUP_DIR -docker exec gwoe-antragspruefer python -c " + +mkdir -p "$BACKUP_DIR" + +docker exec "$CONTAINER" python -c " import sqlite3 src = sqlite3.connect(\"/app/data/gwoe-antraege.db\") dst = sqlite3.connect(\"/tmp/db-backup.db\") src.backup(dst); dst.close(); src.close() " 2>&1 -docker cp gwoe-antragspruefer:/tmp/db-backup.db $BACKUP_DIR/gwoe-antraege-$TS.db -docker exec gwoe-antragspruefer rm /tmp/db-backup.db -gzip -9 $BACKUP_DIR/gwoe-antraege-$TS.db -find $BACKUP_DIR -name "gwoe-antraege-*.db.gz" -mtime +30 \ + +docker cp "$CONTAINER:/tmp/db-backup.db" "$BACKUP_DIR/gwoe-antraege-$TS.db" +docker exec "$CONTAINER" rm /tmp/db-backup.db +gzip -9 "$BACKUP_DIR/gwoe-antraege-$TS.db" + +# Rotation: 30 Tage, plus Monatsanker (Tag 01) langfristig +find "$BACKUP_DIR" -name "gwoe-antraege-*.db.gz" -mtime +30 \ ! -name "gwoe-antraege-*01-*.db.gz" -delete 2>/dev/null || true + echo "$(date -Iseconds) backup ok: $BACKUP_DIR/gwoe-antraege-$TS.db.gz"