Weiter zum Hauptinhalt

Datenbankschema

Dieses Dokument beschreibt das von duplistatus verwendete SQLite-Datenbankschema zum Speichern von Sicherungsoperationsdaten.

Datenbankstandort​

Die Datenbank wird im Anwendungsdatenverzeichnis gespeichert:

  • Standardstandort: /app/data/backups.db
  • Docker Volume: duplistatus_data:/app/data
  • Dateiname: backups.db

Datenbank-Migrationssystem​

duplistatus verwendet ein automatisches Migrationssystem zur Behandlung von Änderungen am Datenbankschema zwischen Versionen.

Migrationsversionshistorie​

Folgende sind historische Migrationsversionen, die die Datenbank in ihren aktuellen Zustand gebracht haben:

  • Schema v1.0 (Anwendung v0.6.x und früher): Initiales Datenbankschema mit Maschinen- und Sicherungstabellen
  • Schema v2.0 (Anwendung v0.7.x): Fehlende Spalten und Konfigurationstabelle hinzugefügt
  • Schema v3.0 (Anwendung v0.7.x): Maschinentabelle in Server umbenannt, server_url-Spalte hinzugefügt
  • Schema v3.1 (Anwendung v0.8.x): Sicherungsdatenfelder verbessert, server_password-Spalte hinzugefügt
  • Schema v4.0 (Anwendung v0.9.x / v1.0.x): Benutzerzugriffskontrolle hinzugefügt (Benutzer-, Sitzungs-, Audit_log-Tabellen)
  • Schema v4.1 (Anwendung v1.5.x): api_keys und Standardkonfigurationsschlüssel für optionale API-Schlüsselauthentifizierung, IP-Zulassungslisten und Upload-Limits hinzugefügt
  • Schema v4.2 (Anwendung v1.5.x): daily_summary_deliveries-Hauptbuch und Standard-daily_summary-Konfiguration für optionale tägliche Zusammenfassungsbenachrichtigungen hinzugefügt

Die aktuelle Anwendungsversion (v1.5.x) verwendet Schema v4.2 als neueste Datenbankschemaversion.

Migrationsprozess​

  1. Automatische Sicherung: Erstellt Sicherung vor der Migration
  2. Schema-Aktualisierung: Aktualisiert Datenbankstruktur
  3. Datenmigration: Erhält vorhandene Daten
  4. Überprüfung: Bestätigt erfolgreiche Migration

Tabellen​

Server-Tabelle​

Speichert Informationen über zu überwachende Duplicati-Server.

Felder​

FeldTypBeschreibung
idTEXT PRIMARY KEYEindeutiger Server-Identifier
nameTEXT NOT NULLServername von Duplicati
server_urlTEXTDuplicati-Server-URL
aliasTEXTBenutzerdefinierter Anzeigename
noteTEXTBenutzerdefinierte Notizen/Beschreibung
server_passwordTEXTServer-Passwort für Authentifizierung
created_atDATETIMEZeitstempel der Server-Erstellung

Sicherungen Tabelle​

Speichert Sicherungsoperationsdaten, die von Duplicati-Servern empfangen wurden.

Wichtige Felder​

FeldTypBeschreibung
idTEXT PRIMARY KEYEindeutiger Sicherungsbezeichner
server_idTEXT NOT NULLVerweis auf Server-Tabelle
backup_nameTEXT NOT NULLName des Sicherungsauftrags
backup_idTEXT NOT NULLSicherungs-ID von Duplicati
dateDATETIME NOT NULLZeitpunkt der Sicherungsausführung
statusTEXT NOT NULLSicherungsstatus (Erfolgreich, Warnung, Fehler, Fatal)
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

Nachrichtenarrays (JSON-Speicher)​

FeldTypBeschreibung
messages_arrayTEXTJSON-Array von Protokollnachrichten
warnings_arrayTEXTJSON-Array von Warnmeldungen
errors_arrayTEXTJSON-Array von Fehlermeldungen
available_backupsTEXTJSON-Array von verfügbaren Sicherungsversionen

Dateioperationsfelder​

FeldTypBeschreibung
examined_filesINTEGERWährend der Sicherung untersuchte Dateien
opened_filesINTEGERFür die Sicherung geöffnete Dateien
added_filesINTEGERDer Sicherung hinzugefügte neue Dateien
modified_filesINTEGERIn der Sicherung geänderte Dateien
deleted_filesINTEGERAus der Sicherung gelöschte Dateien
deleted_foldersINTEGERAus der Sicherung gelöschte Ordner
added_foldersINTEGERDer 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 Fehlern
added_symlinksINTEGERHinzugefügte symbolische Links
modified_symlinksINTEGERGeänderte symbolische Links
deleted_symlinksINTEGERGelöschte symbolische Links

Dateigröße-Felder​

FeldTypBeschreibung
size_of_examined_filesINTEGERGröße der Dateien, die während der Sicherung untersucht wurden
size_of_opened_filesINTEGERGröße der Dateien, die für die Sicherung geöffnet wurden
size_of_added_filesINTEGERGröße der neuen Dateien, die zur Sicherung hinzugefügt wurden
size_of_modified_filesINTEGERGröße der Dateien, die in der Sicherung geändert wurden

Betriebsstatus-Felder​

FeldTypBeschreibung
parsed_resultTEXT NOT NULLGeparstes Operationsresultat
main_operationTEXT NOT NULLHauptoperationstyp
interruptedBOOLEANOb die Sicherung unterbrochen wurde
partial_backupBOOLEANOb die Sicherung teilweise war
dryrunBOOLEANOb 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 Warnungen
errors_actual_lengthINTEGERTatsächliche Anzahl Fehler
messages_actual_lengthINTEGERTatsächliche Anzahl Nachrichten

Backend-Statistik-Felder​

FeldTypBeschreibung
bytes_downloadedINTEGERVom Ziel heruntergeladene Bytes
known_file_sizeINTEGERBekannte Dateigröße am Ziel
last_backup_dateDATETIMEDatum des letzten Backups am Zielort
backup_list_countINTEGERAnzahl der Backup-Versionen
reported_quota_errorBOOLEANQuota-Fehler gemeldet
reported_quota_warningBOOLEANQuota-Warnung gemeldet
backend_main_operationTEXTHauptvorgang des Backends
backend_parsed_resultTEXTGeparstes Ergebnis des Backends
backend_interruptedBOOLEANBackend-Vorgang unterbrochen
backend_versionTEXTBackend-Version
backend_begin_timeDATETIMEStartzeit des Backend-Vorgangs
backend_durationTEXTDauer des Backend-Vorgangs
backend_warnings_actual_lengthINTEGERAnzahl Backend-Warnungen
backend_errors_actual_lengthINTEGERAnzahl Backend-Fehler

Konfigurationstabelle​

Speichert die Anwendungskonfigurationseinstellungen.

Felder​

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

Häufige Konfigurationsschlüssel​

  • email_config: E-Mail-Benachrichtigungseinstellungen
  • ntfy_config: NTFY-Benachrichtigungseinstellungen
  • overdue_tolerance: Einstellungen zur Toleranz überfälliger Backups
  • notification_templates: Vorlagen für Benachrichtigungsnachrichten
  • daily_summary: Tägliche Zusammenfassung Modus, Zeitplan, Zeitzone, optionale öffentliche Dashboard-URL und optionaler SMTP-Empfänger-Override (smtpRecipient; leer verwendet E-Mail-Einstellungen)
  • cron_service: Cron-Aufgaben-Zeitpläne, einschließlich daily-summary-dispatch (minute hour * * * von daily_summary.utcTime)
  • audit_retention_days: Aufbewahrungszeitraum für Prüfprotokolle (Standard: 90 Tage)

Datenbankversions-Tabelle​

Verfolgt die Schema-Version der Datenbank für Migrationszwecke.

Felder​

FeldTypBeschreibung
versionTEXT PRIMARY KEYDatenbankversion
applied_atDATETIMEWann die Migration angewendet wurde

Benutzertabelle​

Speichert Benutzerkontoinformationen für Authentifizierung und Zugriffskontrolle.

Felder​

FeldTypBeschreibung
idTEXT PRIMARY KEYEindeutiger Benutzeridentifikator
usernameTEXT UNIQUE NOT NULLBenutzername für die Anmeldung
password_hashTEXT NOT NULLMit Bcrypt gehashtes Passwort
is_adminBOOLEAN NOT NULLOb Benutzer Admin-Rechte besitzt
must_change_passwordBOOLEANOb Passwortänderung erforderlich ist
created_atDATETIMEZeitstempel der Kontenerstellung
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_untilDATETIMEAblauf der Kontosperrung (falls gesperrt)

Sitzungstabelle​

Speichert Benutzersitzungsdaten für Authentifizierung und Sicherheit.

Felder​

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

Audit-Protokoll-Tabelle​

Speichert den Audit-Verlauf von Benutzeraktionen und Systemereignissen.

Felder​

FeldTypBeschreibung
idINTEGER PRIMARY KEY AUTOINCREMENTEindeutige Kennung des Audit-Protokolleintrags
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. 'Authentifizierung', 'Einstellungen', 'Sicherung')
target_typeTEXTArt des Ziels (z.B. 'Server', 'Sicherung', 'Benutzer')
target_idTEXTIdentifikator des Ziels
detailsTEXTZusätzliche Details (JSON)
ip_addressTEXTIP-Adresse des Anfordernden
user_agentTEXTBenutzer-Agent-Zeichenkette
statusTEXT NOT NULLStatus der Aktion ('Erfolg', 'Fehlgeschlagen', 'Fehler')
error_messageTEXTFehlermeldung, falls die Aktion fehlgeschlagen ist

API-Schlüssel-Tabelle​

Speichert gehashte API-Schlüssel für die externen HTTP-APIs. Das Klartextgeheimnis wird einmalig bei der Erstellung angezeigt und niemals gespeichert.

Felder​

FeldTypBeschreibung
idTEXT PRIMARY KEYEindeutiger Schlüssel-Identifikator
nameTEXT NOT NULLAnzeigename
key_hashTEXT UNIQUESHA-256-Hash des Geheimnisses
key_prefixTEXTErste vier Zeichen des Geheimnisses (für Fingerabdrücke)
key_suffixTEXTLetzte vier Zeichen des Geheimnisses (für Fingerabdrücke)
scopeTEXT NOT NULLupload oder read
descriptionTEXTOptionale Beschreibung
enabledINTEGER1 wenn der Schlüssel aktiv ist
created_atDATETIMEErstellungszeitstempel
created_byTEXTBenutzer-ID des Administrators, der den Schlüssel erstellt hat
expires_atDATETIMEOptionales Ablaufdatum
last_used_atDATETIMELetzte erfolgreiche Verwendung
usage_countINTEGERAnzahl erfolgreicher Verwendungen

Zugehörige Konfigurationsschlüssel in der configurations Tabelle: external_api_require_api_key, ip_trusted_proxies, admin_ip_allowlist, external_api_ip_allowlist, upload_limits.

Tabelle für tägliche Zusammenfassungs-Lieferungen​

Pro-Kanal-Protokoll für den Versand von E-Mails mit täglicher Zusammenfassung. Alte Einträge können einen ntfy Kanal aus früheren Versionen enthalten. Jede geplante Ausführung (oder eindeutiger manueller Versand) hat maximal einen Eintrag pro Kanal. Die gerenderten Nutzlasten werden vor dem Senden gespeichert, damit Wiederholungen denselben Zustand verwenden. Einträge älter als 30 Tage werden entfernt.

Wenn der Prozess nach der Annahme einer Nachricht durch einen Anbieter abstirbt, aber bevor der Erfolg aufgezeichnet wurde, kann dieser Kanal erneut versucht werden (mindestens einmal).

Felder​

FeldTypBeschreibung
idTEXT PRIMARY KEYEindeutige Lieferkennung
occurrence_keyTEXT NOT NULLGeplanter Schlüssel scheduled:UTC:{date}:{HH:mm} oder manual:{uuid}
channelTEXT NOT NULLemail oder ntfy
triggerTEXT NOT NULLscheduled, manual oder retry
summary_dateTEXT NOT NULLLokales Kalenderdatum für den Snapshot
time_zoneTEXT NOT NULLGespeicherte IANA-Zeitzone
payload_jsonTEXTGerenderte Betreff-, HTML-, Text- und NTFY-Felder
stateTEXT NOT NULLpending, sending, sent oder failed
attempt_countINTEGERZustellversuche
next_retry_atDATETIMEWann ein fehlgeschlagener Kanal erneut beansprucht werden kann
lease_expires_atDATETIMEAnspruchsfrist; eine abgelaufene Frist kann wiederhergestellt werden
errorTEXTLetzter Fehler, falls vorhanden
created_atDATETIMEZeitstempel der Zeilerstellung
updated_atDATETIMEZeitstempel der letzten Aktualisierung
sent_atDATETIMEErfolgszeitstempel

Ein eindeutiger Index auf (occurrence_key, channel) verhindert doppelte Sendungen desselben Vorkommnisses über denselben Kanal.

Sitzungsverwaltung​

Datenbankgestützter Sitzungsspeicher​

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

  • Primärer Speicher: Datenbankgestützte Sitzungstabelle
  • Alternative: In-Memory-Speicher (Legacy-Unterstützung oder Fehlerfälle)
  • Sitzungs-ID: Kryptografisch sicherer Zufallsstring
  • Ablauf: Konfigurierbarer Sitzungs-Timeout
  • CSRF-Schutz: Schutz vor Cross-Site-Request-Forgery
  • Automatische Bereinigung: Abgelaufene Sitzungen werden automatisch entfernt

Sitzungs-API-Endpunkte​

  • POST /api/session: Neue Sitzung erstellen
  • GET /api/session: Bestehende Sitzung validieren
  • DELETE /api/session: Sitzung löschen
  • GET /api/csrf: CSRF-Token abrufen

Indizes​

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

  • Primärschlüssel: Alle Tabellen haben Primärschlüsselindizes
  • Fremdschlüssel: Server-Referenzen in der Backups-Tabelle, Benutzer-Referenzen in Sitzungen und Audit-Protokoll
  • Abfrageoptimierung: Indizes auf häufig abgefragten Feldern
  • Datumsindizes: Indizes auf Datumsfeldern für zeitbasierte Abfragen
  • Benutzerindizes: Benutzernamenindex für schnelle Benutzerabfragen
  • Sitzungsindizes: Ablauf- und Benutzer-ID-Indizes für Sitzungsverwaltung
  • Audit-Indizes: Zeitstempel-, Benutzer-ID-, Aktions-, Kategorie- und Statusindizes für Audit-Abfragen
  • API-Schlüsselindizes: Eindeutiger Hash plus aktivierter/Bereichs-Abfragen für Authentifizierung

Beziehungen​

  • Server → Backups: Eins-zu-viele-Beziehung
  • Benutzer → Sitzungen: Eins-zu-viele-Beziehung (Sitzungen können ohne Benutzer existieren)
  • Benutzer → Audit-Protokoll: Eins-zu-viele-Beziehung (Audit-Einträge können ohne Benutzer existieren)
  • Benutzer → API-Schlüssel: Eins-zu-viele-Beziehung über created_by (Schlüssel bleiben erhalten, nachdem der Benutzer gelöscht wurde)
  • Backups → Nachrichten: Eingebettete JSON-Arrays
  • Konfigurationen: Schlüssel-Wert-Speicher

Datentypen​

  • TEXT: Zeichenfolgendaten, JSON-Arrays
  • INTEGER: Numerische Daten, Dateianzahlen, Größen
  • REAL: Fließkommazahlen, Dauern
  • DATETIME: Zeitstempeldaten
  • BOOLEAN: Wahr/Falsch-Werte

Sicherungsstatuswerte​

  • Erfolgreich: Sicherung erfolgreich abgeschlossen
  • Warnung: Sicherung mit Warnungen abgeschlossen
  • Fehler: Sicherung mit Fehlern abgeschlossen
  • Fatal: Sicherung ist fatal fehlgeschlagen

Häufige Abfragen​

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;

Datenbank-Bereinigung​

-- 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​

Zuordnung des API-Anforderungstexts zu Datenbankspalten​

Wenn duplicati Sicherungsdaten über HTTP POST sendet, wird die JSON-Struktur den Datenbankspalten zugeordnet:

{
"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
}
}

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