#!/bin/bash # Deploy DB zum VServer # Usage: ./scripts/deploy-db.sh [--dry-run] set -e LOCAL_DB="data/tracker_remote.db" REMOTE_DB="/opt/antragstracker/data/tracker.db" REMOTE_HOST="vserver" DRY_RUN=false if [ "$1" = "--dry-run" ]; then DRY_RUN=true echo "🔍 DRY RUN — keine Änderungen" echo "" fi cd "$(dirname "$0")/.." echo "=== DB Deploy ===" echo "Lokale DB: $(du -sh $LOCAL_DB | cut -f1)" # 0. Schema-Validierung echo "0. Schema prüfen..." EXPECTED_TABLES="vorlagen beratungen ketten ketten_glieder ki_bewertungen parteien antragsteller gremien orte referenzen" MISSING="" for tbl in $EXPECTED_TABLES; do EXISTS=$(sqlite3 "$LOCAL_DB" "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='$tbl'" 2>/dev/null) if [ "$EXISTS" != "1" ]; then MISSING="$MISSING $tbl" fi done if [ -n "$MISSING" ]; then echo "❌ FEHLER: Fehlende Tabellen:$MISSING" exit 1 fi echo " ✓ Alle ${#EXPECTED_TABLES[@]} Tabellen vorhanden" # Stats echo "" echo " Vorlagen: $(sqlite3 "$LOCAL_DB" 'SELECT COUNT(*) FROM vorlagen')" echo " Ketten: $(sqlite3 "$LOCAL_DB" 'SELECT COUNT(*) FROM ketten')" echo " KI-Bew.: $(sqlite3 "$LOCAL_DB" 'SELECT COUNT(*) FROM ki_bewertungen')" echo " Matches: $(sqlite3 "$LOCAL_DB" "SELECT COUNT(*) FROM ki_bewertungen WHERE typ='umsetzung_match'")" echo " Orte: $(sqlite3 "$LOCAL_DB" 'SELECT COUNT(*) FROM orte WHERE lat IS NOT NULL')" echo "" # Flush WAL journal echo " Flushing WAL..." sqlite3 "$LOCAL_DB" "PRAGMA wal_checkpoint(TRUNCATE)" 2>/dev/null echo "" if $DRY_RUN; then echo "🔍 Würde hochladen: $(du -sh $LOCAL_DB | cut -f1) nach $REMOTE_HOST:$REMOTE_DB" echo "🔍 Prod-DB Größe: $(ssh $REMOTE_HOST "du -sh $REMOTE_DB 2>/dev/null | cut -f1" || echo "N/A")" echo "" echo "DRY RUN fertig. Ohne --dry-run ausführen zum Deployen." exit 0 fi # 1. Backup auf VServer BACKUP_NAME="${REMOTE_DB}.bak-$(date +%Y%m%d-%H%M)" echo "1. Backup Prod-DB..." ssh $REMOTE_HOST "cp $REMOTE_DB $BACKUP_NAME" echo " → $BACKUP_NAME" # 2. Upload echo "2. Upload..." scp "$LOCAL_DB" "$REMOTE_HOST:$REMOTE_DB" # 3. Restart echo "3. Restart Backend..." ssh $REMOTE_HOST 'cd /opt/antragstracker && docker compose restart antragstracker' 2>&1 | grep -v "level=warning" echo "" echo "✅ Deploy fertig" echo "Backup: $BACKUP_NAME" echo "Rollback: ssh $REMOTE_HOST 'cp $BACKUP_NAME $REMOTE_DB && cd /opt/antragstracker && docker compose restart antragstracker'"