scripts: backup-db.sh akzeptiert Container-Name + Auto-Detect-Pfad

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
This commit is contained in:
Dotty Dotter 2026-05-10 12:49:15 +02:00
parent d7e3c8a944
commit e7ba6ee19c

View File

@ -1,19 +1,37 @@
#!/bin/bash #!/bin/bash
# Daily backup via Pythons sqlite3.backup() — atomar, async-DB-safe, # Daily backup via Pythons sqlite3.backup() — atomar, async-DB-safe,
# kein sqlite3-CLI im Container vorausgesetzt. # 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 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) TS=$(date +%Y%m%d-%H%M%S)
BACKUP_DIR=/opt/gwoe-antragspruefer/backups
mkdir -p $BACKUP_DIR mkdir -p "$BACKUP_DIR"
docker exec gwoe-antragspruefer python -c "
docker exec "$CONTAINER" python -c "
import sqlite3 import sqlite3
src = sqlite3.connect(\"/app/data/gwoe-antraege.db\") src = sqlite3.connect(\"/app/data/gwoe-antraege.db\")
dst = sqlite3.connect(\"/tmp/db-backup.db\") dst = sqlite3.connect(\"/tmp/db-backup.db\")
src.backup(dst); dst.close(); src.close() src.backup(dst); dst.close(); src.close()
" 2>&1 " 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 docker cp "$CONTAINER:/tmp/db-backup.db" "$BACKUP_DIR/gwoe-antraege-$TS.db"
gzip -9 $BACKUP_DIR/gwoe-antraege-$TS.db docker exec "$CONTAINER" rm /tmp/db-backup.db
find $BACKUP_DIR -name "gwoe-antraege-*.db.gz" -mtime +30 \ 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 ! -name "gwoe-antraege-*01-*.db.gz" -delete 2>/dev/null || true
echo "$(date -Iseconds) backup ok: $BACKUP_DIR/gwoe-antraege-$TS.db.gz" echo "$(date -Iseconds) backup ok: $BACKUP_DIR/gwoe-antraege-$TS.db.gz"