Repository navigation
Offsite-Backup: Archiv als Datei streamen statt im Speicher halten - #460
Merged
Merged
Conversation
Das verschlüsselte .gcbk-Archiv wird nicht mehr als ein Buffer gebaut und an die Transporte gereicht. gcbk.writeBackupArchive schreibt es als Stream in eine Datei im privaten Ordner <Backup-Ordner>/.incoming (Name vom Server, Pfad geprüft, vorher Prüfung des freien Platzes, Löschen im finally, Reste eines Absturzes beim ersten Gebrauch); Größe und – für S3 – die SHA-256 der Teile entstehen beim Schreiben. Transporte (services/offsite/source.js für Datei oder Buffer): - WebDAV: PUT als Stream mit Content-Length (nie chunked). - S3: bis 64 MiB ein PUT als Stream, darüber Multipart in 64-MiB-Teilen, Teil für Teil aus der Datei gelesen, jeder mit eigenem SHA-256 signiert (kein UNSIGNED-PAYLOAD); bei einem Fehler AbortMultipartUpload. - SMB / SFTP: put direkt aus der Archivdatei (keine Kopie in eine Temp-Datei); das Zeitlimit wächst mit der Größe. - Wiederherstellungstest: downloadTo lädt in eine Datei statt in einen Buffer; Entschlüsseln wie bisher als Stream. Zu wenig Platz: Fehler NO_SPACE (507) mit Hinweis no_space und deutschem Text in der Oberfläche. via/tlsCa/Pinning/SMB3-Verschlüsselung unverändert. Messung (scripts/offsite-memory-check.js, 400 MB Plugin-Daten, Archiv 402 MB, WebDAV + S3-Multipart): zusätzlicher RSS vorher +441 MB (Spitze 517 MB), jetzt +43 MB (Spitze 118 MB) – gleich bei 50 und 800 MB. Tests: Multipart/Abbruch gegen den signaturprüfenden Fake-S3, Streaming mit Content-Length, downloadTo, SMB/SFTP aus der Datei, NO_SPACE, Aufräumen; neuer Live-Test tests/offsite_live.test.js im CI-Job "storage targets" (S3-Multipart mit abgesenkter Teilgröße, WebDAV, SMB3 verschlüsselt); Speichertest tests/offsite_memory.test.js. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016xX1efcZF1f6G9rhmaJNLD
…/file-system-race) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016xX1efcZF1f6G9rhmaJNLD
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Worum es geht
Bis 1.258.1 wurde das verschlüsselte Offsite-Archiv (
.gcbk) als ein Buffer gebaut und so an WebDAV/S3/SMB/SFTP übergeben. Mit ~400 MB Plugin-Daten heißt das: das ganze Archiv (~400 MB) liegt im Arbeitsspeicher, die Spitze lag bei über 500 MB RSS – zu viel für einen kleinen VPS.Jetzt wird das Archiv als Stream in eine Datei geschrieben und von dort hochgeladen. Der zusätzliche Speicher bleibt bei einigen zehn MB, egal wie groß das Archiv ist.
Änderungen
Archiv (
gcbk.writeBackupArchive)<Backup-Ordner>/.incoming(0700, Name zufällig vom Server, Pfad überbackupUpload.incomingPathgeprüft). Vorher Prüfung des freien Platzes (backup.checkFreeSpaceaus Backup: Plugin-Daten bis 512 MB, unvollständige Backups deutlich sichtbar #458), Löschen imfinally, Reste eines Absturzes werden beim ersten Gebrauch entfernt.NO_SPACE(507) mit Hinweisno_space; die Oberfläche zeigt einen deutschen Text („Auf dem GateControl-Server ist zu wenig Speicherplatz frei …“).Transporte (
services/offsite/source.js: Archivdatei oder – für Schreibtests – Buffer)Content-Length(nie chunked).UNSIGNED-PAYLOAD). Bei einem Fehler (auch bei „200 mit<Error>“ beim Abschließen) folgtAbortMultipartUpload.putdirekt aus der Archivdatei (smbclient liest in Blöcken), keine Kopie in eine Temp-Datei mehr.putdirekt aus der Archivdatei.withTrust) startet sauber von vorn.via(VPN-Gerät/Weiterleitung),tls_ca, Zertifikats-Pinning und SMB3-Verschlüsselung (feat(storage): NAS-Zertifikat ohne PEM-Datei vertrauen, Offsite-S3 über VPN, SMB3-Verschlüsselung #457) sind unverändert und laufen über dieselben Wege.Wiederherstellungstest
downloadTostattdownload: Das Archiv wird Stück für Stück in eine Datei geladen (mit Größenlimit), das Entschlüsseln läuft wie seit Backup: Plugin-Daten bis 512 MB, unvollständige Backups deutlich sichtbar #458 als Stream. Vorher lag es einmal ganz im Speicher.Aufbewahrung, Status/SSE, Fehlertexte und der Ablauf des Wiederherstellungstests bleiben gleich.
Speicher – vorher/nachher
node scripts/offsite-memory-check.js --mb 400 [--legacy]: 400 MB Plugin-Daten, Archiv 402 MB, Upload an WebDAV und S3 (Multipart, 16-MiB-Teile) in einem Prozess, RSS alle 10 ms gemessen.Mit 50 MB, 160 MB und 800 MB Archiv bleibt der Zusatz gleich bei ~43–45 MB (Arbeitsspeicher von V8 und zlib, nicht das Archiv).
Tests
downloadTo, unzulässige lokale Pfade werden abgelehnt (",;…).NO_SPACE/507 mit Hinweis, auch inlast_error_hint.writeBackupArchive: Größe, Teil-Hashes, Rechte 0600, kein Überschreiben, Aufräumen bei ENOSPC mitten im Schreiben.tests/offsite_live.test.jsgegen moto, wsgidav und Samba. Ein echtes Archiv (~12 MB) geht hoch, kommt Byte für Byte zurück und wird entschlüsselt. S3 läuft als Multipart mit 5 MiB (drei Teile) mit und ohne vorberechnete Hashes und als einzelner PUT; SMB mit erzwungener SMB3-Verschlüsselung. Lokal gegen dieselben Server grün.tests/offsite_memory.test.js: Ein Archiv von 160 MB muss mit < 100 MB zusätzlichem RSS hochgehen.Lokal (Node 22): volle Suite grün bis auf den bekannten lokalen Fehler
config_hash_stub_guard. ESLint-Security und no-undef wie in der CI: keine neuen Befunde.Nicht getestet
Generated by Claude Code