Zum Inhalt

Backup und Restore

Backup und Restore

Die Plattform bietet ein automatisches Backup-System als Kubernetes CronJob. Standardmäßig ist es deaktiviert und muss explizit aktiviert werden.


Backup aktivieren

  • Helm Value: backup.enabled: true (über Customer Portal → Updates)
  • Oder bei Installation: backup.enabled=true in den Helm Values

Automatisches Backup

  • Zeitplan: Täglich um 02:00 Uhr
  • Aufbewahrung: 7 Backups (ältere werden automatisch gelöscht)
  • Speicher: 20 Gi PVC unter /backups/

Was wird gesichert?

Daten Methode Ausgabe
PostgreSQL (alle DBs) pg_dumpall --clean --if-exists postgres-all.sql
MongoDB mongodump --gzip mongodb/-Verzeichnis
Qdrant (Vektordaten) REST Snapshot API qdrant-{collection}-{snapshot}.snapshot

Hochgeladene Dateien sind nicht Teil des Backups

Der Upload-Zwischenspeicher der RAG API hält eine Datei nur zwischen dem Hochladen und ihrer Verarbeitung — danach wird sie gelöscht. Gesichert werden muss er deshalb nicht: Die verwertbaren Inhalte liegen nach der Verarbeitung in Qdrant und sind dort im Backup enthalten.

Die Originaldateien selbst bewahrt die Plattform nicht dauerhaft auf. Wer sie behalten möchte, hält sie in der Quelle vor, aus der sie stammen.

Konfigurationsdaten nicht im Backup

Konfigurationsdaten (Secrets, ConfigMaps) werden NICHT durch das Backup gesichert. Diese sind im Helm Chart und den Values definiert.

Backup manuell auslösen

# CronJob manuell triggern
kubectl create job --from=cronjob/inovetra-backup manual-backup-$(date +%Y%m%d) -n inovetra-platform

# Status prüfen
kubectl get jobs -n inovetra-platform | grep backup

# Logs des Backup-Jobs
kubectl logs job/manual-backup-$(date +%Y%m%d) -n inovetra-platform

Restore-Prozedur

Datenverlust möglich

Ein Restore überschreibt die aktuellen Daten. Vorher Backup des aktuellen Stands erstellen!

PostgreSQL Restore

# Temporären Pod mit Backup-PVC starten, um Backup-Dateien zu identifizieren
kubectl run backup-inspect --rm -it --image=postgres:18-alpine \
  --overrides='{"spec":{"containers":[{"name":"backup-inspect","image":"postgres:18-alpine","command":["sh"],"volumeMounts":[{"name":"backup","mountPath":"/backups"}]}],"volumes":[{"name":"backup","persistentVolumeClaim":{"claimName":"inovetra-backup"}}]}}' \
  -n inovetra-platform -- ls -la /backups/

# Restore über temporären Pod ausführen
kubectl run pg-restore --rm -it --image=postgres:18-alpine \
  --overrides='{"spec":{"containers":[{"name":"pg-restore","image":"postgres:18-alpine","command":["sh"],"volumeMounts":[{"name":"backup","mountPath":"/backups"}]}],"volumes":[{"name":"backup","persistentVolumeClaim":{"claimName":"inovetra-backup"}}]}}' \
  -n inovetra-platform -- \
  psql -h inovetra-postgres -U inovetra-postgres -f /backups/<datum>/postgres-all.sql

MongoDB Restore

# Temporären Pod mit Backup-PVC starten und Restore durchführen
kubectl run mongo-restore --rm -it --image=mongo:7.0 \
  --overrides='{"spec":{"containers":[{"name":"mongo-restore","image":"mongo:7.0","command":["sh"],"volumeMounts":[{"name":"backup","mountPath":"/backups"}]}],"volumes":[{"name":"backup","persistentVolumeClaim":{"claimName":"inovetra-backup"}}]}}' \
  -n inovetra-platform -- \
  mongorestore --host inovetra-mongodb --gzip --drop /backups/<datum>/mongodb/

Qdrant Restore

# Port-Forwarding zu Qdrant
kubectl port-forward svc/inovetra-vectordb 6333:6333 -n inovetra-platform

# Snapshot-Datei aus Backup-PVC kopieren
kubectl cp inovetra-platform/<backup-pod>:/backups/<datum>/qdrant-documents-<snapshot>.snapshot ./snapshot.snapshot

# Snapshot hochladen und wiederherstellen (via REST API)
curl -X POST "http://localhost:6333/collections/documents/snapshots/upload" \
  -H "Content-Type: multipart/form-data" \
  -F "snapshot=@./snapshot.snapshot"

Restore testen

Empfehlung: Quartalsweise einen Restore-Test in einer Testumgebung durchführen.

Prüfpunkte nach Restore:

  1. Alle Pods starten erfolgreich
  2. Login im Customer Portal funktioniert
  3. Chat-Verlauf in LibreChat vorhanden
  4. RAG-Dokumente abrufbar
  5. Connector-Konfigurationen intakt

Siehe auch