Zum Hauptinhalt springen

Datenbankschema

Dieses Dokument beschreibt das SQLite-Datenbankschema, das von duplistatus zur Speicherung von Sicherungsvorgangsdaten verwendet wird.

Datenbankstandort

Die Datenbank wird im Anwendungsdatenverzeichnis gespeichert:

  • Standard-Speicherort: /app/data/backups.db
  • Docker-Volume: duplistatus_data:/app/data
  • Dateiname: backups.db

Datenbankmigrationssystem

duplistatus verwendet ein automatisiertes Migrationssystem, um Datenbankschemaänderungen zwischen Versionen zu verwalten.

Migrationsversionsverlauf

Die folgenden sind historische Migrationsversionenen, die die Datenbank in ihren aktuellen Zustand gebracht haben:

  • Schema v1.0 (Application v0.6.x und früher): Initiales Datenbankschema mit Tabellen für Server und Sicherungen
  • Schema v2.0 (Application v0.7.x): Fehlende Spalten und Konfigurationstabelle hinzugefügt
  • Schema v3.0 (Application v0.7.x): Tabelle „machines" in „servers" umbenannt, Spalte „server_url" hinzugefügt
  • Schema v3.1 (Application v0.8.x): Sicherungsdatenfelder erweitert, Spalte „server_password" hinzugefügt
  • Schema v4.0 (Application v0.9.x / v1.0.x): Benutzerzugriffskontrolle hinzugefügt (Tabellen „users", „sessions", „audit_log")

Die aktuelle Anwendungsversion (v1.3.x) verwendet Schema v4.0 als neueste Datenbankschema-Version.

Migrationsprozess

  1. Automatische Sicherung: Erstellt eine Sicherung vor der Migration
  2. Schema-Update: Aktualisiert die Datenbankstruktur
  3. Datenmigration: Bewahrt vorhandene Daten
  4. Überprüfung: Bestätigt die erfolgreiche Migration

Tabellen

Server-Tabelle

Speichert Informationen über überwachte Duplicati-Server.

Felder

FeldTypBeschreibung
idTEXT PRIMARY KEYEindeutige Server-Kennung
nameTEXT NOT NULLServername aus Duplicati
server_urlTEXTDuplicati-Server-URL
aliasTEXTBenutzerdefinierten Anzeigename
noteTEXTBenutzerdefinierte Notizen/Beschreibung
server_passwordTEXTServer-Passwort zur Authentifizierung
created_atDATETIMEServer-Erstellungs-Zeitstempel

Sicherungen-Tabelle

Speichert Sicherungsvorgangsdaten, die von Duplicati-Servern empfangen werden.

Schlüsselfelder

FeldTypBeschreibung
idTEXT PRIMARY KEYEindeutige Sicherungs-ID
server_idTEXT NOT NULLReferenz zur Server-Tabelle
backup_nameTEXT NOT NULLName des Sicherungsauftrags
backup_idTEXT NOT NULLSicherungs-ID von Duplicati
dateDATETIME NOT NULLAusführungszeit der Sicherung
statusTEXT NOT NULLSicherungsstatus (Erfolg, Warnung, Fehler, Kritisch)
duration_secondsINTEGER NOT NULLDauer in Sekunden
sizeINTEGERGröße der Quelldateien
uploaded_sizeINTEGERGröße der hochgeladenen Daten
examined_filesINTEGERAnzahl der untersuchten Dateien
warningsINTEGERAnzahl der Warnungen
errorsINTEGERAnzahl der Fehler
created_atDATETIMEZeitstempel der Datensatzerstellung

Message Arrays (JSON Speicherplatz)

FeldTypBeschreibung
messages_arrayTEXTJSON-Array von Nachrichten
warnings_arrayTEXTJSON-Array von Warnungsnachrichten
errors_arrayTEXTJSON-Array von Fehlernachrichten
available_backupsTEXTJSON-Array von verfügbaren Sicherungsversionen

Dateioperations-Felder

FeldTypBeschreibung
examined_filesINTEGERWährend der Sicherung geprüfte Dateien
opened_filesINTEGERZur Sicherung geöffnete Dateien
added_filesINTEGERNeue Dateien zur Sicherung hinzugefügt
modified_filesINTEGERIn der Sicherung geänderte Dateien
deleted_filesINTEGERAus der Sicherung gelöschte Dateien
deleted_foldersINTEGERAus der Sicherung gelöschte Ordner
added_foldersINTEGERZur Sicherung hinzugefügte Ordner
modified_foldersINTEGERIn der Sicherung geänderte Ordner
not_processed_filesINTEGERNicht verarbeitete Dateien
too_large_filesINTEGERZu große Dateien zur Verarbeitung
files_with_errorINTEGERDateien mit Fehler
added_symlinksINTEGERHinzugefügte symbolische Links
modified_symlinksINTEGERGeänderte symbolische Links
deleted_symlinksINTEGERGelöschte symbolische Links

Dateigröße-Felder

FieldTypeBeschreibung
size_of_examined_filesINTEGERGröße von Dateien, die während der Sicherung überprüft wurden
size_of_opened_filesINTEGERGröße von Dateien, die zur Sicherung geöffnet wurden
size_of_added_filesINTEGERGröße neuer Dateien, die zur Sicherung hinzugefügt wurden
size_of_modified_filesINTEGERGröße von Dateien, die in der Sicherung geändert wurden

Felder des Betriebsstatus

FeldTypBeschreibung
parsed_resultTEXT NOT NULLAnalysiertes Operationsergebnis
main_operationTEXT NOT NULLHauptoperationstyp
interruptedBOOLEANOb die Sicherung unterbrochen wurde
partial_backupBOOLEANOb die Sicherung teilweise war
dryrunBOOLEANOb die Sicherung ein Testlauf war
versionTEXTVerwendete Duplicati-Version
begin_timeDATETIME NOT NULLStartzeit der Sicherung
end_timeDATETIME NOT NULLEndzeit der Sicherung
warnings_actual_lengthINTEGERTatsächliche Anzahl der Warnungen
errors_actual_lengthINTEGERTatsächliche Anzahl der Fehler
messages_actual_lengthINTEGERTatsächliche Anzahl der Nachrichten

Backend-Statistiken-Felder

FeldTypBeschreibung
bytes_downloadedINTEGERVon Ziel heruntergeladene Bytes
known_file_sizeINTEGERBekannte Dateigröße am Ziel
last_backup_dateDATETIMEDatum der letzten Sicherung am Ziel
backup_list_countINTEGERAnzahl von Sicherungsversionen
reported_quota_errorBOOLEANKontingentfehler gemeldet
reported_quota_warningBOOLEANKontingentwarnung gemeldet
backend_main_operationTEXTBackend-Hauptoperation
backend_parsed_resultTEXTBackend-Analyseergebnis
backend_interruptedBOOLEANBackend-Operation unterbrochen
backend_versionTEXTBackend-Version
backend_begin_timeDATETIMEStartzeit der Backend-Operation
backend_durationTEXTDauer der Backend-Operation
backend_warnings_actual_lengthINTEGERAnzahl von Backend-Warnungen
backend_errors_actual_lengthINTEGERAnzahl von Backend-Fehlern

Konfigurationstabelle

Speichert Anwendungskonfigurationseinstellungen.

Felder

FeldTypBeschreibung
keyTEXT PRIMARY KEY NOT NULLKonfigurationsschlüssel
valueTEXTKonfigurationswert (JSON)

Allgemeine Konfigurationsschlüssel

  • email_config: E-Mail-Benachrichtigungseinstellungen
  • ntfy_config: NTFY-Benachrichtigungseinstellungen
  • overdue_tolerance: Toleranzeinstellungen für überfällige Sicherungen
  • notification_templates: Vorlagen für Benachrichtigungsmeldungen
  • audit_retention_days: Aufbewahrungszeitraum für Audit-Logs (Standard: 90 Tage)

Datenbankversionstabelle

Verfolgt die Datenbankschema-Version für Migrationszwecke.

Felder

FeldTypBeschreibung
versionTEXT PRIMARY KEYDatenbankversion
applied_atDATETIMEWann die Migration angewendet wurde

Benutzer-Tabelle

Speichert Benutzerkonteninformationen für Authentifizierung und Zugriffskontrolle.

Felder

FeldTypBeschreibung
idTEXT PRIMARY KEYEindeutige Benutzerkennung
usernameTEXT UNIQUE NOT NULLBenutzername zum Anmelden
password_hashTEXT NOT NULLBcrypt-verschlüsseltes Passwort
is_adminBOOLEAN NOT NULLOb der Benutzer Admin-Berechtigungen hat
must_change_passwordBOOLEANOb eine Passwortänderung erforderlich ist
created_atDATETIMEZeitstempel der Kontoerstellung
updated_atDATETIMEZeitstempel der letzten Aktualisierung
last_login_atDATETIMEZeitstempel der letzten erfolgreichen Anmeldung
last_login_ipTEXTIP-Adresse der letzten Anmeldung
failed_login_attemptsINTEGERAnzahl fehlgeschlagener Anmeldeversuche
locked_untilDATETIMESperrablauf des Kontos (falls gesperrt)

Sitzungstabelle

Speichert Benutzersitzungsdaten für Authentifizierung und Sicherheit.

Felder

FeldTypBeschreibung
idTEXT PRIMARY KEYSitzungskennung
user_idTEXTVerweis auf Benutzertabelle (nullable für nicht authentifizierte Sitzungen)
created_atDATETIMESitzungserstellungs-Zeitstempel
last_accessedDATETIMELetzte Zugriffs-Zeitstempel
expires_atDATETIME NOT NULLSitzungsablauf-Zeitstempel
ip_addressTEXTIP-Adresse des Sitzungsursprungs
user_agentTEXTUser-Agent-String
csrf_tokenTEXTCSRF-Token für die Sitzung
csrf_expires_atDATETIMECSRF-Token-Ablauf

Audit-Log-Tabelle

Speichert ein Audit-Trail von Benutzeraktionen und Systemereignissen.

Felder

FeldTypBeschreibung
idINTEGER PRIMARY KEY AUTOINCREMENTEindeutige Audit-Log-Eintrags-ID
timestampDATETIMEEreigniszeitstempel
user_idTEXTReferenz zur Benutzertabelle (optional)
usernameTEXTBenutzername zum Zeitpunkt der Aktion
actionTEXT NOT NULLDurchgeführte Aktion
categoryTEXT NOT NULLKategorie der Aktion (z. B. 'authentication', 'settings', 'backup')
target_typeTEXTZieltyp (z. B. 'server', 'backup', 'user')
target_idTEXTKennung des Ziels
detailsTEXTZusätzliche Details (JSON)
ip_addressTEXTIP-Adresse des Anforderers
user_agentTEXTUser-Agent-String
statusTEXT NOT NULLStatus der Aktion ('success', 'failure', 'error')
error_messageTEXTFehlermeldung bei fehlgeschlagener Aktion

Sitzungsverwaltung

Datenbankgestützter Speicherplatz für Sitzungen

Sitzungen werden in der Datenbank mit In-Memory-Fallback gespeichert:

  • Primary Storage: Datenbankgestützte Sitzungstabelle
  • Fallback: In-Memory-Speicherplatz (Legacy-Unterstützung oder Fehlerfälle)
  • Session ID: Kryptographisch sichere Zufallszeichenkette
  • Expiration: Konfigurierbare Sitzungs-Zeitüberschreitung
  • CSRF Protection: Cross-Site-Request-Forgery-Schutz
  • Automatic Cleanup: Abgelaufene Sitzungen werden automatisch entfernt

Session-API-Endpunkte

  • POST /api/session: Neue Sitzung erstellen
  • GET /api/session: Vorhandene Sitzung validieren
  • DELETE /api/session: Sitzung beenden
  • GET /api/csrf: CSRF-Token abrufen

Indizes

Die Datenbank enthält mehrere Indizes für optimale Abfrageleistung:

  • Primary Keys: Alle Tabellen haben Primary-Key-Indizes
  • Foreign Keys: Server-Referenzen in der Sicherungen-Tabelle, Benutzer-Referenzen in Sessions und audit_log
  • Query Optimisation: Indizes auf häufig abgefragten Feldern
  • Date Indexes: Indizes auf Datumfeldern für zeitbasierte Abfragen
  • User Indexes: Benutzername-Index für schnelle Benutzersuchvorgänge
  • Session Indexes: Ablauf- und user_id-Indizes für die Sitzungsverwaltung
  • Audit Indexes: Zeitstempel-, user_id-, Aktion-, Kategorie- und Status-Indizes für Audit-Abfragen

Beziehungen

  • Server → Sicherungen: 1:n-Beziehung
  • Benutzer → Sessions: 1:n-Beziehung (Sessions können ohne Benutzer existieren)
  • Benutzer → Audit-Log: 1:n-Beziehung (Audit-Einträge können ohne Benutzer existieren)
  • Sicherungen → Nachrichten: Eingebettete JSON-Arrays
  • Konfigurationen: Schlüssel-Wert-Speicherung

Datentypen

  • TEXT: Zeichenkettendaten, JSON-Arrays
  • INTEGER: Numerische Daten, Dateizählungen, Größen
  • REAL: Gleitkommazahlen, Dauern
  • DATETIME: Zeitstempeldaten
  • BOOLEAN: Wahr/Falsch-Werte

Sicherungsstatus-Werte

  • Erfolg: Sicherung erfolgreich abgeschlossen
  • Warnung: Sicherung abgeschlossen mit Warnungen
  • Fehler: Sicherung abgeschlossen mit Fehlern
  • Kritisch: Sicherung fehlgeschlagen kritisch

Häufig gestellte Anfragen

Neueste Sicherung für einen Server abrufen

SELECT * FROM backups 
WHERE server_id = ?
ORDER BY date DESC
LIMIT 1;

Alle Sicherungen für einen Server abrufen

SELECT * FROM backups 
WHERE server_id = ?
ORDER BY date DESC;

Server-Zusammenfassung abrufen

SELECT 
s.name,
s.alias,
COUNT(b.id) as backup_count,
MAX(b.date) as last_backup,
b.status as last_status
FROM servers s
LEFT JOIN backups b ON s.id = b.server_id
GROUP BY s.id;

Gesamtzusammenfassung abrufen

SELECT 
COUNT(DISTINCT s.id) as total_servers,
COUNT(b.id) as total_backups_runs,
COUNT(DISTINCT s.id || ':' || b.backup_name) as total_backups,
COALESCE(SUM(b.uploaded_size), 0) as total_uploaded_size,
(
SELECT COALESCE(SUM(b2.known_file_size), 0)
FROM backups b2
INNER JOIN (
SELECT server_id, MAX(date) as max_date
FROM backups
GROUP BY server_id
) latest ON b2.server_id = latest.server_id AND b2.date = latest.max_date
) as total_storage_used,
(
SELECT COALESCE(SUM(b2.size_of_examined_files), 0)
FROM backups b2
INNER JOIN (
SELECT server_id, MAX(date) as max_date
FROM backups
GROUP BY server_id
) latest ON b2.server_id = latest.server_id AND b2.date = latest.max_date
) as total_backuped_size
FROM servers s
LEFT JOIN backups b ON b.server_id = s.id;

Datenbankbereinigung

-- Delete old backups (older than 30 days)
DELETE FROM backups
WHERE date < datetime('now', '-30 days');

-- Delete servers with no backups
DELETE FROM servers
WHERE id NOT IN (SELECT DISTINCT server_id FROM backups);

JSON-zu-Datenbank-Zuordnung

API-Anforderungstext zu Datenbankspalten-Zuordnung

Wenn Duplicati Sicherungsdaten über HTTP POST sendet, wird die JSON-Struktur auf Datenbankspalten abgebildet:

{
"Data": {
"ExaminedFiles": 15399, // → examined_files
"OpenedFiles": 1861, // → opened_files
"AddedFiles": 1861, // → added_files
"SizeOfExaminedFiles": 11086692615, // → size_of_examined_files
"SizeOfOpenedFiles": 13450481, // → size_of_opened_files
"SizeOfAddedFiles": 13450481, // → size_of_added_files
"SizeOfModifiedFiles": 0, // → size_of_modified_files
"ParsedResult": "Success", // → status
"BeginTime": "2025-04-21T23:45:46.9712217Z", // → begin_time and date
"Duration": "00:00:51.3856057", // → duration_seconds (calculated)
"WarningsActualLength": 0, // → warnings_actual_length
"ErrorsActualLength": 0 // → errors_actual_length
},
"Extra": {
"machine-id": "66f5ffc7ff474a73a3c9cba4ac7bfb65", // → server_id
"machine-name": "WSJ-SER5", // → server name
"backup-name": "WSJ-SER5 Local files", // → backup_name
"backup-id": "DB-2" // → backup_id
}
}

Hinweis: Das Feld size in der Sicherungstabelle speichert SizeOfExaminedFiles und uploaded_size speichert die tatsächliche hochgeladene/übertragene Größe aus dem Sicherungsvorgang.