-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathreadme.txt
More file actions
156 lines (110 loc) · 14.9 KB
/
readme.txt
File metadata and controls
156 lines (110 loc) · 14.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
=== Seafile Updraft Backup Uploader ===
Contributors: malziland
Tags: backup, seafile, updraftplus, chunked-upload, cloudflare
Requires at least: 6.0
Tested up to: 6.9
Requires PHP: 8.2
Stable tag: 1.0.7
License: MIT
License URI: https://opensource.org/licenses/MIT
Lädt UpdraftPlus-Backups über die native Seafile-Upload-API (Chunked Upload) hoch. Cloudflare-Tunnel-tauglich. Inklusive Dashboard-Widget, E-Mail-Alerts, Retention und zuverlässigem Restore.
== Description ==
**Seafile Updraft Backup Uploader** koppelt UpdraftPlus an einen selbst gehosteten Seafile-Server über die native Seafile-Upload-API — nicht über WebDAV.
= Warum nicht WebDAV? =
Die WebDAV-Implementierung von Seafile unterstützt keine Chunked Uploads. Steht der Seafile-Server hinter einem Reverse-Proxy mit Upload-Limit (z. B. Cloudflare Tunnel Free Tier: 100 MB), können Dateien oberhalb dieser Grenze schlicht nicht übertragen werden.
Dieses Plugin löst das Problem mit der Upload-API, die die Seafile-Weboberfläche selbst verwendet. Große Dateien werden in kleine Stücke zerlegt (z. B. 40 MB), jedes Stück wird als eigener HTTP-Request gesendet — voll kompatibel mit Cloudflare Tunnel und anderen Reverse-Proxies.
= Funktionsumfang =
* **Chunked Upload** — Dateien werden in 5–90-MB-Stücken übertragen, konfigurierbar.
* **Stream-First-Restore** — Downloads nutzen zuerst den gleichen Pfad wie die Seafile-Web-Oberfläche (ein HTTP-GET). Für Dateien über 500 MB und bei Stream-Fehlern fällt das Plugin automatisch auf parallele Range-Chunks zurück.
* **Exponentielles Backoff mit zwei Kurven** — unterscheidet zwischen „Server kalt" (längere Pausen) und „Netz wackelt" (kürzere Pausen, bis 1 h).
* **Stillstand-Meldung per Mail ohne Abbruch** — wenn eine Datei 1 h nicht vorwärtsgeht, gibt's eine Info-Mail. Die Queue läuft weiter, probiert frische Links, wartet nötigenfalls länger.
* **Zero-Traffic-Betrieb** — läuft ohne Besucher, ohne WP-Cron-Dependency und ohne externe Dienste. Ein interner WordPress-Loopback hält die Queue am Laufen.
* **Pause & Resume** — Uploads und Restores lassen sich pausieren und an exakt derselben Byte-Position fortsetzen.
* **Integritätsprüfung ohne Extra-Bandbreite** — pro Datei wird beim Upload eine SHA1-Prüfsumme gespeichert und beim Restore streamend geprüft.
* **Lokal-Status pro Backup-Set** — farbige Badges („Lokal vollständig", „Teilweise lokal", „Nur remote"). Bei vollständig lokalem Set ersetzt „In UpdraftPlus öffnen" den Wiederherstellen-Button.
* **Erfolgs-Banner nach Restore** — zeigt Zeitpunkt, Dateianzahl, Größe, Dauer und verlinkt direkt zu UpdraftPlus.
* **Anonymisierter Log-Export** — Host, Library-ID, Ordnerpfad, E-Mails, IPs und UUIDs werden im Export maskiert. Zum Teilen im Support.
* **Dashboard-Widget, E-Mail-Benachrichtigungen, Retention-Management** (4 Default, 0 = alle behalten).
* **UpdraftPlus-History-Sync** — nach Löschen lokaler Backups werden die zugehörigen UpdraftPlus-History-Einträge entfernt.
* **AES-256 Passwortverschlüsselung** mit zufälligem IV.
* **Mehrsprachige Oberfläche** (Deutsch, Englisch — automatisch nach WordPress-Locale).
= Anforderungen =
* WordPress 6.0+
* PHP 8.2+
* UpdraftPlus (Free oder Premium)
* Ein Seafile-Server (self-hosted oder Cloud)
= Empfohlene Server-Konfiguration =
Das Plugin läuft auf Minimal-Hosting (30 s `max_execution_time`, 128 MB `memory_limit`) und passt Chunk-Größe, Parallelität und Tick-Budget automatisch nach unten an. Folgende Werte machen Multi-GB-Restores spürbar schneller:
* **`max_execution_time` ≥ 60 s** — doppelt so große Chunks (~11 MB statt ~5 MB), halber Tick-Overhead bei langen Restores.
* **`max_execution_time` ≥ 180 s** — hält die Chunk-Größe auf 20 MB und maximiert die Parallelität.
* **`memory_limit` ≥ 256 MB** — erlaubt bis zu 8 parallele Chunks ohne RAM-Druck. 128 MB funktionieren, deckeln die Parallelität aber tiefer.
Keine dieser Werte ist Pflicht. Ohne Ausbau skaliert das Plugin automatisch herunter — die gewählten Werte stehen beim Restore-Start im Activity-Log: `Restore-Konfiguration: Xs Tick-Budget, Y parallele Chunks à Z MB`.
= Einrichtung =
1. Plugin installieren und aktivieren.
2. Einstellungen → Seafile Backup öffnen.
3. Seafile-URL, Zugangsdaten, Bibliothek und Unterordner eintragen.
4. „Verbindung testen" klicken.
5. In UpdraftPlus den Remote-Speicher auf „Keine" setzen — dieses Plugin übernimmt den Upload.
6. Fertig. Backups werden nach jedem UpdraftPlus-Lauf automatisch nach Seafile hochgeladen.
== Frequently Asked Questions ==
= Funktioniert das ohne UpdraftPlus? =
Nein. Das Plugin braucht UpdraftPlus, um die Backup-Dateien zu erzeugen. Es übernimmt nur den Upload und den Restore auf den Server.
= Was passiert mit Dateien über 100 MB? =
Sie werden automatisch in Chunks zerlegt. Jeder Chunk geht als eigener HTTP-Request raus. Seafile setzt die Datei auf dem Server wieder zusammen.
= Funktioniert das mit Cloudflare Tunnel? =
Ja. Das ist der primäre Anwendungsfall. Jeder Upload-Chunk bleibt unter dem 100-MB-Limit. Für Downloads nutzt das Plugin standardmäßig einen einzelnen HTTP-GET (wie die Seafile-Weboberfläche), bei großen Dateien oder Fehlern fällt es auf parallele Range-Chunks zurück.
= Was passiert, wenn ein Upload fehlschlägt? =
Abhängig vom Setting bekommst du eine E-Mail. Der nächste Upload-Durchlauf erzeugt einen neuen Ordner. Manuell kann der Upload auch in den Plugin-Einstellungen neu gestartet werden.
= Was bedeutet Retention „0"? =
Alle Backups behalten — nichts wird automatisch gelöscht.
= Was passiert, wenn „Lokale Dateien löschen" aktiv ist? =
Nach erfolgreichem Upload nach Seafile werden die lokalen Backup-Dateien entfernt und die zugehörigen UpdraftPlus-History-Einträge automatisch bereinigt. Nur Einträge ohne lokal verbliebene Dateien werden entfernt — Backups, die UpdraftPlus durch eigene Retention noch lokal hält, bleiben unangetastet.
= Kann ich ein Backup wiederherstellen, das nur auf Seafile liegt? =
Ja. Einstellungen → Seafile Backup → Backup in der Liste suchen → „Wiederherstellen". Die Dateien werden in den UpdraftPlus-Ordner geladen. Danach in UpdraftPlus auf „Lokalen Ordner neu scannen" — das Backup erscheint dort und kann normal zurückgespielt werden. Das Plugin zeigt ein Erfolgs-Banner mit Direktlink in UpdraftPlus.
= Was bedeutet „Lokal vollständig / Teilweise lokal / Nur remote"? =
Das Plugin prüft pro Backup-Set, wie viele der Seafile-Dateien bereits lokal vorhanden sind (mit passender Dateigröße). „Lokal vollständig" → Restore wäre doppelte Arbeit, der Button wird durch „In UpdraftPlus öffnen" ersetzt. „Teilweise lokal" → beim Restore werden nur die fehlenden Dateien geladen. „Nur remote" → klassischer Full-Restore.
= Muss ich externen Cron einrichten? =
Nein. Das Plugin läuft durch einen internen WordPress-Loopback komplett eigenständig — keine Besucher nötig, kein externer Cron-Trigger. Für Umgebungen, die Loopbacks komplett blockieren (spezielle Firewall-Regeln, die WordPress sich selbst nicht aufrufen lassen), gibt es einen optionalen schlüsselgeschützten Cron-Endpoint. Die URL mit Crontab-Beispiel steht direkt im Admin unter „Erweitert: Optionaler externer Heartbeat".
== Screenshots ==
1. Feature-Überblick (Header-Grafik).
2. Einstellungsseite mit Seafile-Verbindung, Backup-Browser und Aktivitätsprotokoll (Demo-Daten, Library `WordPress-Backups`).
3. WordPress-Dashboard-Widget mit letztem Backup-Status.
== Changelog ==
= 1.0.7 =
* **Fix:** Worker-Crash-Notbremse — verhindert den 17-Stunden-Resume-Loop, der in Produktion auftrat, wenn ein bestimmter Chunk den PHP-Prozess wiederholt killte (häufig bei großen Uploads auf Hostern wie Hostinger mit harten `max_execution_time`/Memory-Limits). Neues Verhalten: (a) bei wiederholtem stillem Worker-Tod am **gleichen Byte-Offset** wird die Chunk-Größe für die betroffene Datei automatisch halbiert (Untergrenze 4 MiB); (b) wenn auch mit der minimalen Chunk-Größe weiter dieselbe Stelle crasht, wird die Datei als Fehler markiert und die Queue läuft mit den nächsten Dateien weiter; (c) hartes Maximum von 5 Crash-Wiederaufnahmen pro Datei. Vorher blockierte ein einzelner kaputter Chunk die gesamte Queue bis zum 17,8-h-Gesamt-Timeout — und die nachfolgenden Backup-Dateien wurden überhaupt nicht hochgeladen.
* **Diagnose:** Neuer Log-Eintrag „Worker still abgestürzt … an gleicher Stelle — Chunk-Größe auf X MB reduziert" macht die adaptive Verkleinerung im Aktivitätsprotokoll sichtbar. Skip-Fall wird als `FEHLER: Datei nach wiederholten Worker-Abstürzen übersprungen` geloggt.
* **Tests:** Drei neue Unit-Tests in `CrashDetectionGateTest` (Skip nach Retry-Cap, Same-Offset-Chunk-Halbierung, Floor-erreicht-Skip). 123 Tests / 343 Assertions, alle grün.
= 1.0.6 =
* **UI-Aufräumen:** Einzeldatei-Download aus dem „Dateien anzeigen"-Panel entfernt. Grund: der Button hieß „Download", kopierte aber serverseitig ins UpdraftPlus-Verzeichnis statt in den Browser — und zeigte die Erfolgsmeldung in einem Statusfeld außerhalb des Sichtbereichs, was den „nichts passiert"-Eindruck erzeugte. Der Knopf war zudem ohne Nutzen: UpdraftPlus-Chunks (`uploads7.zip`, `uploads14.zip`, …) sind semantisch undurchsichtig, und der **Wiederherstellen**-Button zieht fehlende Dateien über „Teilweise lokal" bereits gezielt nach. Für forensische Einzeldatei-Inspektion ist die Seafile-Weboberfläche der direktere Weg.
* **Aufgeräumt:** Zusätzlich zum UI-Element sind `SBU_Plugin::ajax_download()`, die JS-Funktion `sDl` (mit Confirm-Dialog, der nur den rohen Dateinamen zeigte), der `download-file`-Event-Delegation-Eintrag und die jetzt tote `SBU_Seafile_API::download_file()`-Methode samt `DEFAULT_DOWNLOAD_CHUNK`-Konstante entfernt. Reine Reduktion — Verhalten der Upload-, Restore- und Löschfunktionen bleibt identisch.
= 1.0.5 =
* **Breaking:** PHP-Mindestanforderung von 7.4 auf **8.2** angehoben. Composer-Constraint und Plugin-Header gleichzeitig aktualisiert — WordPress blockiert die Aktivierung auf älteren PHP-Versionen. Die unterstützte Matrix ist jetzt PHP 8.2 / 8.3 / 8.4 (CI-getestet).
* **Testsuite:** PHPUnit 9 → 11. Alle Test-Dateien von `@covers`-Docblocks auf PHP-8-Attribute (`#[CoversClass]` / `#[CoversMethod]`) migriert — null Deprecations mehr. Neue Tests für `SBU_Seafile_API` (17 HTTP-gemockte Fälle: Token-Cache, Library-Resolve, Upload-/Download-Link, Directory-Ops) und für den Log-Export-Sanitizer (12 Fälle: Host-, UUID-, Ordner-, E-Mail-, IP-, Nonce-Maskierung). Gesamt: **121 Tests / 333 Assertions** (vorher 92 / 263).
* **Dokumentation:** README, ARCHITECTURE und CONTRIBUTING auf den aktuellen Code-Stand gezogen — Modul-Boundaries-Tabelle, Test-Surface-Tabelle, reproduzierbarer Release-Workflow (rsync + zip), explizite Quality-Gate-Befehle. Neue Screenshots für Einstellungsseite und Dashboard-Widget mit Demo-Daten.
= 1.0.4 =
* ARCH-001 abgeschlossen: Schritt 4 zieht alle 24 Ajax-Handler in `SBU_Admin_Ajax` (Trait), Schritt 5 zerlegt Upload- und Restore-Flow in `SBU_Upload_Flow` bzw. `SBU_Restore_Flow` (Traits). Trait-Kompositon hält alle Private-Zugriffe intakt — null Visibility-Promotion. `SBU_Plugin` schrumpft von 4201 auf ~1100 Zeilen (−74 %). `SBU_Queue_Engine::tick_is_gated()` als `@phpstan-impure` markiert. Reines Refactoring, Verhalten 1:1. 92 Tests / 263 Assertions, alle grün.
= 1.0.3 =
* Zweiter Audit-Durchgang: Brute-Force-Schutz für den internen Cron-Schlüssel (WARNUNG ab 5 Fehlversuchen/h), Cron-Key jetzt im `X-SBU-Cron-Key`-Header statt im POST-Body, Zero-Traffic-Backstop für Log-Retention auf idle Admin-Sites. Status-Pillen in der Backup-Liste zentriert (kein Treppenversatz mehr). Refactoring ARCH-001 Schritte 1–3: `SBU_Activity_Log`, `SBU_Mail_Notifier`, `SBU_Queue_Engine` als eigene Services ausgelagert. Schritte 4–5 folgen in v1.0.4. 92 Tests / 263 Assertions, alle grün.
= 1.0.2 =
* Audit-Umsetzung (Datenschutz, Wartbarkeit, CI): Zeit-basierte Aufbewahrung des Aktivitätsprotokolls (Default 30 Tage, 7–365 Tage oder 0 = deaktiviert), Warn-Header im unmaskierten Log-Export, Inline-onclick aus dem Admin entfernt (Event-Delegation via `data-sbu-action`), CI-Gates (PHPCS, PHPStan) brechen den Build jetzt bei Fehlern ab. 92 Tests / 263 Assertions, alle grün.
= 1.0.1 =
* UI-Politur: Integritätsprüfungs-Hinweis aus dem Einstellungsblock in den Erklär-Bereich „So funktioniert das Plugin" verschoben. Toolbar im Aktivitätsprotokoll sauber in Filter-/Aktions-Gruppen aufgeteilt, mobiltauglich bis < 600 px.
= 1.0.0 =
* Erste öffentliche Version. Chunked Upload über Seafile-API, Stream-First-Restore mit Range-Chunk-Fallback, exponentielles Backoff mit zwei Kurven, Stillstand-Meldung per Mail ohne Abbruch, Zero-Traffic-Betrieb ohne externe Dienste, Pause/Resume mit Byte-Offset, Integritätsprüfung ohne Extra-Bandbreite, Lokal-Status-Badges im Backup-Browser, Erfolgs-Banner nach Restore mit UpdraftPlus-Deeplink, anonymisierter Log-Export, AIMD-Rate-Controller, AES-256 Passwortverschlüsselung, mehrsprachige Oberfläche. 87 Tests / 257 Assertions.
== Upgrade Notice ==
= 1.0.7 =
Wichtiger Stabilitäts-Fix für große Uploads: bisher konnte ein einzelner Chunk, der den PHP-Prozess wiederholt killte, die Backup-Queue bis zu 17 Stunden blockieren (und alle nachfolgenden Backup-Dateien wurden gar nicht hochgeladen). Neue Notbremse halbiert bei Wiederholungs-Absturz am gleichen Byte automatisch die Chunk-Größe; bleibt die Datei trotzdem stecken, wird sie übersprungen statt die ganze Queue zu blockieren. Keine Migration nötig.
= 1.0.6 =
UI-Bereinigung: Einzeldatei-Download entfernt. Der Button hatte einen verwirrenden „nichts passiert"-Eindruck ausgelöst (Datei landete im `wp-content/updraft/`-Ordner, Erfolgsmeldung lag außerhalb des Sichtfelds) und bot keinen klaren Mehrwert gegenüber „Wiederherstellen" oder der Seafile-Weboberfläche. Keine Migration nötig.
= 1.0.5 =
Breaking: PHP-Mindestanforderung 8.2. Auf älteren PHP-Versionen verweigert WordPress die Aktivierung. Vor dem Update die PHP-Version des Hosts prüfen. Danach keine manuelle Migration nötig. Intern: PHPUnit 11, erweiterte Testsuite (121 Tests / 333 Assertions), professionalisierte Dokumentation.
= 1.0.4 =
Abschluss des ARCH-001-Refactorings: Ajax-Handler, Upload-Flow und Restore-Flow sind jetzt als Traits ausgelagert. `SBU_Plugin` ist von 4201 auf ~1100 Zeilen runter (−74 %). Reine Umstrukturierung, Verhalten unverändert. Keine Migration nötig.
= 1.0.3 =
Sicherheits- und Architektur-Update: Cron-Schlüssel jetzt im Header (nicht mehr im Body), Brute-Force-Warnung im Aktivitätsprotokoll, UI-Treppenversatz bei Backup-Status-Pillen behoben. Drei Services aus der God-Class ausgelagert — Verhalten unverändert. Keine Migration nötig.
= 1.0.2 =
Datenschutz-Update: Aktivitätsprotokoll wird automatisch nach 30 Tagen aufgeräumt (konfigurierbar). Log-Export mit Warnhinweis auf identifizierende Daten. Keine Migration nötig.
= 1.0.1 =
Reine UI-Verbesserung. Kein Migrations-Aufwand.
= 1.0.0 =
Erste öffentliche Version.