Backup-Operations-Log + EBUSY-Fix beim Restore

Backup-Seite zeigt zwei neue Log-Panels: links Backup-Erstellung,
rechts Backup-Wiederherstellung. Jeder Eintrag mit ✓/✗-Status,
Summary, Timestamp + User. Klick öffnet Modal mit vollständigem
Verlauf – alle console.log/error/warn/info-Zeilen werden während
der Operation in einen Puffer mitgefangen und im fullLog-Feld
persistiert. Auto-Refresh alle 5s.

Persistenz: neue Tabelle BackupLog mit Migration
20260519100000_backup_log (CREATE TABLE IF NOT EXISTS für Re-Deploys
auf DBs mit Vorab-db-push). fullLog auf 1 MB gecappt.

Endpoints (settings:update):
- GET /api/settings/backup-logs?operation=CREATE|RESTORE&limit=50
- GET /api/settings/backup-logs/:id

EBUSY-Fix: Der neue Log-Verlauf hat sofort einen alten Bug
sichtbar gemacht. backup.service.restoreBackup rief
deleteDirectory(UPLOADS_DIR) auf, dessen finales rmdirSync auf
/app/uploads ein EBUSY warf – das Verzeichnis ist im Container ein
Bind-Mount und lässt sich nicht aushängen. Fix: neuer Helper
emptyDirectory() löscht nur die Inhalte, das Verzeichnis bleibt
stehen.

Live-verifiziert: 4867 Datensätze + 1 Datei in 13.2s
wiederhergestellt; Log-Modal zeigt den vollständigen Verlauf.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-19 11:53:04 +02:00
parent 95541e8ac4
commit 37df8c0c4a
8 changed files with 506 additions and 15 deletions
+23
View File
@@ -97,6 +97,29 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [x] **🆕 Backup-Operations-Log + EBUSY-Fix beim Restore**
- Zwei neue Log-Panels auf der DB-Backup-Seite: links
"Backup-Erstellung", rechts "Backup-Wiederherstellung". Jeder
Eintrag zeigt ✓/✗-Status, Summary, Timestamp und User. Klick
öffnet ein Modal mit dem vollständigen Verlauf (alle
`console.log/error/warn/info`-Zeilen werden während der
Operation in einen Puffer mitgefangen).
- Persistiert in neuer Tabelle `BackupLog`
(Migration `20260519100000_backup_log` mit `IF NOT EXISTS`).
Limit 1 MB pro `fullLog`, Auto-Refresh alle 5s.
- Endpoints (settings:update):
`GET /api/settings/backup-logs?operation=CREATE|RESTORE`,
`GET /api/settings/backup-logs/:id`.
- **Bonus**: Das neue Log hat sofort einen alten Bug aufgedeckt
`EBUSY: rmdir '/app/uploads'` beim Restore. Ursache: das
Backup-Service rief `deleteDirectory(UPLOADS_DIR)` mit dem
finalen `rmdirSync`, aber `/app/uploads` ist ein Bind-Mount,
den Linux nicht aushängen lässt. Fix: neuer Helper
`emptyDirectory()` löscht nur die Inhalte, das Verzeichnis
selbst bleibt stehen.
- **Live-verifiziert**: 4867 Datensätze + 1 Datei in 13.2s
wiederhergestellt, Log-Modal zeigt den vollständigen Verlauf.
- [x] **🐛 DSGVO-Rolle: Menüpunkte in den Einstellungen unsichtbar**
- Symptom: User mit ausschließlich DSGVO-Rolle sah keinerlei
Karten unter Einstellungen → System (DSGVO-Dashboard,