Backups & Wiederherstellung
Legen Sie regelmäßige Backups an (SQLite-Schnappschuss) und bewahren Sie sie sicher, ideal verschlüsselt und extern, auf. Testen Sie die Wiederherstellung, damit im Ernstfall alles klappt.
Warum Backups wichtig sind
Backups schützen vor:
- 🔥 Hardware-Ausfall: Server-Festplatte defekt
- 🐛 Software-Bugs: Datenbankkorruption
- 👤 Menschliche Fehler: Versehentliches Löschen
- 🔒 Ransomware: Verschlüsselung durch Angriff
- ⚡ Naturereignisse: Rechenzentrumsausfall
Ohne Backup
Datenverlust = Alle Nutzer, Credits, Konfigurationen, Usage-Historie verloren!
Was wird gesichert?
SQLite-Datenbank
Die Hauptdatenbank enthält:
- ✅ Nutzer & API-Keys
- ✅ Projekte & Budgets
- ✅ Provider & Routen
- ✅ Pricing-Konfiguration
- ✅ Usage-Logs (Metadaten)
- ✅ Credit-Historie
- ✅ Allowance-Einstellungen
- ✅ Common Pool Stände
Datei-Standort (typisch):
/opt/bud-e/school-bud-e-middleware/data/admin_bude.dbKleine Datei
Die Datenbank ist meist sehr klein (wenige MB bis ~100 MB), da keine Gesprächsinhalte gespeichert werden.
Backup erstellen
Methode 1: Admin-Dashboard (empfohlen)
- Öffnen Sie das Admin-Dashboard
- Navigieren Sie zu Maintenance
- Klicken Sie auf Download Backup
- SQLite-Datei wird heruntergeladen
Dateiname-Format:
admin_bude_backup_2025-10-11_14-30-15.dbMethode 2: Manueller Download
Per SSH auf dem Server:
# Als backup-User oder root
cd /opt/bud-e/school-bud-e-middleware/data/
# Datenbank kopieren (während Server läuft)
sqlite3 admin_bude.db ".backup backup_$(date +%Y%m%d_%H%M%S).db"
# Herunterladen (von Ihrem lokalen PC)
scp ubuntu@ihr-server:/opt/bud-e/school-bud-e-middleware/data/backup_*.db ~/backups/Methode 3: Automatisiertes Backup-Script
Erstellen Sie ein Cron-Script für tägliche Backups:
#!/bin/bash
# Datei: /opt/bud-e/backup.sh
BACKUP_DIR="/opt/bud-e/backups"
DB_PATH="/opt/bud-e/school-bud-e-middleware/data/admin_bude.db"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/admin_bude_$DATE.db"
# Verzeichnis erstellen falls nicht vorhanden
mkdir -p "$BACKUP_DIR"
# Backup erstellen
sqlite3 "$DB_PATH" ".backup '$BACKUP_FILE'"
# Komprimieren
gzip "$BACKUP_FILE"
# Alte Backups löschen (behalte letzte 30 Tage)
find "$BACKUP_DIR" -name "admin_bude_*.db.gz" -mtime +30 -delete
echo "Backup erstellt: ${BACKUP_FILE}.gz"Ausführbar machen:
chmod +x /opt/bud-e/backup.shCrontab einrichten (täglich um 3 Uhr):
sudo crontab -eFügen Sie hinzu:
0 3 * * * /opt/bud-e/backup.sh >> /var/log/admin-bude-backup.log 2>&1Backup-Speicherung
Lokal (kurzfristig)
Vorteile:
- Schnell verfügbar
- Keine Internet-Abhängigkeit
Nachteile:
- Bei Server-Ausfall verloren
- Keine Schutz vor Ransomware
Empfehlung: Nur als temporärer Zwischenspeicher (max. 7 Tage)
Extern (langfristig)
Option 1: Cloud-Storage
AWS S3:
# Installation aws-cli
sudo apt install awscli
# Backup hochladen
aws s3 cp backup_20251011.db.gz s3://ihr-bucket/backups/
# Mit Verschlüsselung
aws s3 cp backup_20251011.db.gz s3://ihr-bucket/backups/ \
--server-side-encryption AES256Google Cloud Storage:
# Installation gcloud
# (siehe: https://cloud.google.com/sdk/docs/install)
# Backup hochladen
gsutil cp backup_20251011.db.gz gs://ihr-bucket/backups/Backblaze B2 (kostengünstig):
# Installation b2 CLI
pip install b2
# Konfiguration
b2 authorize-account
# Upload
b2 upload-file ihr-bucket backup_20251011.db.gz backups/backup_20251011.db.gzOption 2: SFTP/FTP
Auf separatem Server:
# SFTP Upload
scp backup_20251011.db.gz backup@backup-server:/backups/admin-bude/Option 3: Lokale externe Festplatte
Für kleinere Setups:
# USB-Festplatte mounten
sudo mount /dev/sdb1 /mnt/backup
# Backup kopieren
cp backup_20251011.db.gz /mnt/backup/admin-bude/
# Unmount
sudo umount /mnt/backupBackup-Verschlüsselung
Mit GPG verschlüsseln:
# Schlüssel generieren (einmalig)
gpg --full-generate-key
# Backup verschlüsseln
gpg --encrypt --recipient admin@schule.de backup_20251011.db.gz
# Ergebnis: backup_20251011.db.gz.gpgEntschlüsseln:
gpg --decrypt backup_20251011.db.gz.gpg > backup_20251011.db.gzBackup-Strategie
3-2-1-Regel
Die bewährte Backup-Regel:
- 3 Kopien der Daten
- 2 verschiedene Speichermedien
- 1 Kopie extern (off-site)
Beispiel:
Kopie 1: Produktiv-Server (/opt/bud-e/data/)
Kopie 2: Lokales Backup-Verzeichnis (/opt/bud-e/backups/)
Kopie 3: Cloud-Storage (AWS S3 / Google Cloud Storage)Aufbewahrungsfristen
Empfehlung:
| Typ | Aufbewahrung | Zweck |
|---|---|---|
| Täglich | 7 Tage | Schnelle Wiederherstellung bei akuten Problemen |
| Wöchentlich | 4 Wochen | Monatliche Kontrolle |
| Monatlich | 12 Monate | Jahresabschluss, Audits |
| Jährlich | 3-7 Jahre | Rechtliche Anforderungen |
Backup-Rotation:
backups/
├── daily/
│ ├── 2025-10-11.db.gz
│ ├── 2025-10-10.db.gz
│ ├── ... (7 Tage)
│ └── 2025-10-05.db.gz
├── weekly/
│ ├── 2025-W41.db.gz
│ ├── ... (4 Wochen)
│ └── 2025-W38.db.gz
├── monthly/
│ ├── 2025-10.db.gz
│ ├── ... (12 Monate)
│ └── 2024-11.db.gz
└── yearly/
├── 2025.db.gz
└── 2024.db.gzWiederherstellung
Vorbereitung
Warnung
Wiederherstellung überschreibt die aktuelle Datenbank! Erstellen Sie vorher ein Backup des aktuellen Zustands.
Methode 1: Admin-Dashboard
- Öffnen Sie das Admin-Dashboard
- Navigieren Sie zu Maintenance
- Klicken Sie auf Restore Backup
- Wählen Sie die Backup-Datei
- Bestätigen Sie die Wiederherstellung
- Server wird automatisch neu gestartet
Methode 2: Manuelle Wiederherstellung
Schritt 1: Server stoppen
sudo systemctl stop admin-bude.serviceSchritt 2: Aktuellen Stand sichern
cd /opt/bud-e/school-bud-e-middleware/data/
cp admin_bude.db admin_bude.db.before-restore-$(date +%Y%m%d)Schritt 3: Backup hochladen
# Lokal → Server
scp backup_20251011.db.gz ubuntu@ihr-server:/tmp/
# Auf Server entpacken
ssh ubuntu@ihr-server
cd /tmp
gunzip backup_20251011.db.gzSchritt 4: Backup wiederherstellen
sudo cp /tmp/backup_20251011.db /opt/bud-e/school-bud-e-middleware/data/admin_bude.db
sudo chown ubuntu:ubuntu /opt/bud-e/school-bud-e-middleware/data/admin_bude.dbSchritt 5: Datenbank-Integrität prüfen
sqlite3 /opt/bud-e/school-bud-e-middleware/data/admin_bude.db "PRAGMA integrity_check;"
# Erwartete Ausgabe: okSchritt 6: Server starten
sudo systemctl start admin-bude.service
sudo systemctl status admin-bude.serviceSchritt 7: Funktionalität testen
# Im Browser: http://ihr-server:8000/admin
# - Login testen
# - Nutzer-Liste prüfen
# - Test-Anfrage sendenWiederherstellung-Checkliste
- ✅ Backup-Datei vorhanden und gültig
- ✅ Server gestoppt
- ✅ Aktueller Stand gesichert
- ✅ Backup-Datei hochgeladen
- ✅ Datenbank ersetzt
- ✅ Berechtigungen korrekt
- ✅ Integrität geprüft
- ✅ Server gestartet
- ✅ Admin-Login erfolgreich
- ✅ Test-Anfrage erfolgreich
Test-Wiederherstellung
Regelmäßig testen!
Backups sind nutzlos, wenn die Wiederherstellung nicht funktioniert. Testen Sie mindestens quartalsweise!
Test-Szenario
Separaten Test-Server aufsetzen
- Kleine VM (z.B. CX11 bei Hetzner)
- Identische Software-Version
Backup wiederherstellen
- Backup hochladen
- Restore durchführen
Funktionalität prüfen
- Admin-Login
- Nutzer-Liste vollständig?
- Provider-Konfiguration vorhanden?
- Test-Anfrage senden
Dokumentieren
markdown# Restore-Test 2025-10-11 Backup: backup_20251010.db.gz Server: test-server.example.com Status: ✅ Erfolgreich Dauer: 15 Minuten Probleme: Keine
Monitoring & Alarme
Backup-Monitoring
Prüfen Sie:
- Letztes Backup-Datum
- Backup-Dateigröße (Plausibilität)
- Verfügbarkeit externer Backups
- Speicherplatz auf Backup-Storage
Alarme einrichten:
⚠️ Warnung: Letztes Backup > 24 Stunden alt
🚨 Kritisch: Letztes Backup > 48 Stunden alt
🚨 Kritisch: Backup-Speicher > 90% vollAutomatisierte Prüfung
Backup-Verify-Script:
#!/bin/bash
# backup-verify.sh
BACKUP_FILE="$1"
# Größe prüfen
SIZE=$(stat -f%z "$BACKUP_FILE" 2>/dev/null || stat -c%s "$BACKUP_FILE")
if [ "$SIZE" -lt 10000 ]; then
echo "❌ Backup zu klein: $SIZE Bytes"
exit 1
fi
# SQLite-Integrität prüfen
sqlite3 "$BACKUP_FILE" "PRAGMA integrity_check;" | grep -q "ok"
if [ $? -eq 0 ]; then
echo "✅ Backup gültig"
exit 0
else
echo "❌ Backup korrupt"
exit 1
fiVerwenden:
chmod +x backup-verify.sh
./backup-verify.sh backup_20251011.dbDisaster Recovery Plan
Szenarien
Szenario 1: Server-Festplatte defekt
Recovery:
- Neue Festplatte einbauen / neue VM erstellen
- Betriebssystem neu installieren (Ubuntu)
- Admin Bud-E neu installieren (siehe Installation)
- Letztes Backup wiederherstellen
- Server konfigurieren & starten
RTO (Recovery Time Objective): 2-4 Stunden RPO (Recovery Point Objective): 1 Tag (bei täglichen Backups)
Szenario 2: Datenbank-Korruption
Recovery:
- Server stoppen
- Korrupte DB sichern (für Analyse)
- Letztes Backup wiederherstellen
- Integrität prüfen
- Server starten
RTO: 30 Minuten RPO: 1 Tag
Szenario 3: Versehentliches Löschen
Recovery:
- Identifizieren, was gelöscht wurde
- Passendes Backup finden (vor Löschung)
- Selektive Wiederherstellung (nur betroffene Daten)
- Oder: Vollständige Wiederherstellung
RTO: 1-2 Stunden RPO: Abhängig von Löschzeitpunkt
Szenario 4: Ransomware
Recovery:
- Server sofort vom Netz trennen
- Malware entfernen / Server neu aufsetzen
- Backup von vor der Infektion wiederherstellen
- Alle Passwörter ändern
- Sicherheitslücken schließen
RTO: 4-8 Stunden RPO: Variabel (Infektionszeitpunkt abhängig)
Best Practices
1. Automatisierung
- ✅ Tägliche automatische Backups
- ✅ Automatischer Upload zu externem Storage
- ✅ Automatische Verifikation
- ✅ Automatische Rotation (alte Backups löschen)
2. Verschlüsselung
- ✅ Backups verschlüsseln (GPG, AES-256)
- ✅ Schlüssel sicher aufbewahren (nicht auf demselben Server!)
- ✅ Test-Entschlüsselung regelmäßig durchführen
3. Dokumentation
- ✅ Backup-Prozess dokumentieren
- ✅ Restore-Anleitung erstellen
- ✅ Ansprechpartner definieren
- ✅ Disaster-Recovery-Plan
4. Zugriffskontrolle
- ✅ Backup-Verzeichnis schützen (chmod 700)
- ✅ Nur Admins haben Zugriff
- ✅ Audit-Log für Backup-Zugriffe
5. Regelmäßige Tests
- ✅ Quartalsweise Test-Wiederherstellung
- ✅ Dokumentation der Tests
- ✅ Lessons Learned nach jedem Test
Nächste Schritte
- Maintenance - Regelmäßige Wartungsaufgaben
- Privacy - Datenschutz für Backups
- FAQ - Häufige Backup-Fragen