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 (Anwendung v0.6.x und früher): Erstes Datenbankschema mit Tabellen für machines und backups
  • Schema v2.0 (Anwendung v0.7.x): Hinzufügen fehlender Spalten und Tabelle für Konfigurationen
  • Schema v3.0 (Anwendung v0.7.x): Umbenennung der machines-Tabelle in servers, Hinzufügen der Spalte server_url
  • Schema v3.1 (Anwendung v0.8.x): Verbesserung der Sicherungsdatenfelder, Hinzufügen der Spalte server_password
  • Schema v4.0 (Anwendung v0.9.x / v1.0.x): Hinzufügen der Benutzerzugriffskontrolle (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 Serverkennung
nameTEXT NOT NULLServername aus Duplicati
server_urlTEXTDuplicati-Server-URL
aliasTEXTBenutzerdefinierter Anzeigename
noteTEXTBenutzerdefinierte Notizen/Beschreibung
server_passwordTEXTServerpasswort für die Authentifizierung
created_atDATETIMEErstellungszeitstempel des Servers

Sicherungen-Tabelle

Speichert Sicherungsvorgangsdaten, die von Duplicati-Servern empfangen werden.

Schlüsselfelder

FeldTypBeschreibung
idTEXT PRIMARY KEYEindeutige Sicherungskennung
server_idTEXT NOT NULLVerweis auf Servertabelle
backup_nameTEXT NOT NULLName des Sicherungsauftrags
backup_idTEXT NOT NULLSicherungs-ID von Duplicati
dateDATETIME NOT NULLAusführungszeitpunkt der Sicherung
statusTEXT NOT NULLSicherungsstatus (Erfolg, Warnung, Fehler, Schwerwiegend)
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 mit Protokollnachrichten
warnings_arrayTEXTJSON-Array mit Warnmeldungen
errors_arrayTEXTJSON-Array mit Fehlermeldungen
available_backupsTEXTJSON-Array mit verfügbaren Sicherungsversionen

Dateioperations-Felder

FeldTypBeschreibung
examined_filesINTEGERBei der Sicherung untersuchte Dateien
opened_filesINTEGERZum Sichern 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_foldersINTEGERDem Backup 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 Fehlern
added_symlinksINTEGERHinzugefügte symbolische Verknüpfungen
modified_symlinksINTEGERGeänderte symbolische Verknüpfungen
deleted_symlinksINTEGERGelöschte symbolische Verknüpfungen

Dateigröße-Felder

FeldTypBeschreibung
size_of_examined_filesINTEGERGröße der während der Sicherung untersuchten Dateien
size_of_opened_filesINTEGERGröße der zum Sichern geöffneten Dateien
size_of_added_filesINTEGERGröße der neuen Dateien, die der Sicherung hinzugefügt wurden
size_of_modified_filesINTEGERGröße der in der Sicherung geänderten Dateien

Felder des Betriebsstatus

FeldTypBeschreibung
parsed_resultTEXT NOT NULLGeparstes Operationsergebnis
main_operationTEXT NOT NULLHauptoperationstyp
interruptedBOOLEANGibt an, ob die Sicherung unterbrochen wurde
partial_backupBOOLEANGibt an, ob die Sicherung teilweise war
dryrunBOOLEANGibt an, ob die Sicherung ein Trockenlauf 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_downloadedINTEGERVom Zielort heruntergeladene Bytes
known_file_sizeINTEGERBekannte Dateigröße am Zielort
last_backup_dateDATETIMEDatum der letzten Sicherung am Zielort
backup_list_countINTEGERAnzahl der Sicherungsversionen
reported_quota_errorBOOLEANQuota-Fehler gemeldet
reported_quota_warningBOOLEANQuota-Warnung gemeldet
backend_main_operationTEXTHauptoperation des Backends
backend_parsed_resultTEXTGeparstes Ergebnis des Backends
backend_interruptedBOOLEANBackend-Operation unterbrochen
backend_versionTEXTBackend-Version
backend_begin_timeDATETIMEStartzeit der Backend-Operation
backend_durationTEXTDauer der Backend-Operation
backend_warnings_actual_lengthINTEGERAnzahl der Backend-Warnungen
backend_errors_actual_lengthINTEGERAnzahl der Backend-Fehler

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 verspätete Sicherungen
  • notification_templates: Vorlagen für Benachrichtigungsnachrichten
  • audit_retention_days: Dauer der Audit-Protokoll-Beibehaltung (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 für die Anmeldung
password_hashTEXT NOT NULLMit Bcrypt gehashtes Passwort
is_adminBOOLEAN NOT NULLGibt an, ob der Benutzer Administratorrechte hat
must_change_passwordBOOLEANGibt an, ob 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_untilDATETIMESperrfrist des Kontos (falls gesperrt)

Sitzungstabelle

Speichert Benutzersitzungsdaten für Authentifizierung und Sicherheit.

Felder

FeldTypBeschreibung
idTEXT PRIMARY KEYSitzungskennung
user_idTEXTVerweis auf die Benutzertabelle (kann für nicht authentifizierte Sitzungen null sein)
created_atDATETIMEZeitstempel der Sitzungserstellung
last_accessedDATETIMEZeitstempel des letzten Zugriffs
expires_atDATETIME NOT NULLZeitstempel des Sitzungsablaufs
ip_addressTEXTIP-Adresse des Sitzungsherkunftsorts
user_agentTEXTUser-Agent-Zeichenfolge
csrf_tokenTEXTCSRF-Token für die Sitzung
csrf_expires_atDATETIMEAblauf des CSRF-Tokens

Audit-Log-Tabelle

Speichert ein Audit-Trail von Benutzeraktionen und Systemereignissen.

Felder

FeldTypBeschreibung
idINTEGER PRIMARY KEY AUTOINCREMENTEindeutige Kennung des Audit-Log-Eintrags
timestampDATETIMEZeitstempel des Ereignisses
user_idTEXTVerweis auf Benutzertabelle (kann null sein)
usernameTEXTBenutzername zum Zeitpunkt der Aktion
actionTEXT NOT NULLDurchgeführte Aktion
categoryTEXT NOT NULLKategorie der Aktion (z. B. 'authentication', 'settings', 'backup')
target_typeTEXTTyp des Ziels (z. B. 'server', 'backup', 'user')
target_idTEXTKennung des Ziels
detailsTEXTZusätzliche Details (JSON)
ip_addressTEXTIP-Adresse des Anfragenden
user_agentTEXTUser-Agent-Zeichenfolge
statusTEXT NOT NULLStatus der Aktion ('success', 'failure', 'error')
error_messageTEXTFehlermeldung, falls die Aktion fehlgeschlagen ist

Sitzungsverwaltung

Datenbankgestützter Speicherplatz für Sitzungen

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

  • Primärer Speicher: Datenbankbasierte Sitzungstabelle
  • Fallback: In-Memory-Speicherung (Legacy-Unterstützung oder Fehlerfälle)
  • Sitzungs-ID: Kryptografisch sicherer Zufallsstring
  • Ablauf: Konfigurierbare Sitzungszeitüberschreitung
  • CSRF-Schutz: Schutz vor Cross-Site-Request-Forgery
  • Automatische Bereinigung: 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:

  • Primärschlüssel: Alle Tabellen verfügen über Primärschlüsselindizes
  • Fremdschlüssel: Server-Referenzen in der Backups-Tabelle, Benutzer-Referenzen in den Tabellen sessions und audit_log
  • Abfrageoptimierung: Indizes für häufig abgefragte Felder
  • Datumsindizes: Indizes für Datumsfelder zur Unterstützung zeitbasierter Abfragen
  • Benutzerindizes: Index für Benutzernamen zur schnellen Benutzersuche
  • Sitzungsindizes: Indizes für Ablaufdatum und user_id zur Sitzungsverwaltung
  • Audit-Indizes: Indizes für Zeitstempel, user_id, Aktion, Kategorie und Status für Audit-Abfragen

Beziehungen

  • Server → Sicherungen: Eins-zu-viele-Beziehung
  • Benutzer → Sitzungen: Eins-zu-viele-Beziehung (Sitzungen können ohne Benutzer existieren)
  • Benutzer → Audit-Log: Eins-zu-viele-Beziehung (Audit-Einträge können ohne Benutzer existieren)
  • Sicherungen → Nachrichten: Eingebettete JSON-Arrays
  • Konfigurationen: Schlüssel-Wert-Speicher

Datentypen

  • TEXT: Zeichenkettendaten, JSON-Arrays
  • INTEGER: Numerische Daten, Dateianzahlen, Größenangaben
  • REAL: Gleitkommazahlen, Dauerangaben
  • 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.