diff options
| author | Matthias Andreas Benkard <code@mail.matthias.benkard.de> | 2026-08-15 10:51:11 +0200 |
|---|---|---|
| committer | Matthias Andreas Benkard <code@mail.matthias.benkard.de> | 2026-08-15 10:51:11 +0200 |
| commit | 2b1841e17533543d1cb15220ca86a2a37c853daf (patch) | |
| tree | 01b940cb06c5abc36704d2d4853343ee7b38ce02 /deploy/aendggner-web.service | |
| parent | 5700bbcb89186e432c5c7dd232b61c052de8e784 (diff) | |
Die Web-App rechnet im Browser statt auf dem Server
Bisher lief die Weboberfläche auf einem JDK-HttpServer: Uploads landeten als
temporäre Dateien auf dem Server, die Synopse entstand dort. Das kostete
Betrieb (systemd, Reverse Proxy, Rate-Limiting, Timeouts) und verlangte ein
Datenschutzversprechen, das nur zusicherbar, nicht nachprüfbar war — gerade
Entwurfstexte verließen den Rechner der Nutzer:innen.
Neu übersetzt `./mvnw -Pwasm package` dieselbe Pipeline mit GraalVM Web Image
(`native-image --tool:svm-wasm`) nach WebAssembly, PDFBox eingeschlossen.
Ausgeliefert werden nur noch statische Dateien; gerechnet wird im Browser.
Die erzeugte Synopse ist byteweise identisch mit der der Befehlszeile
(SHA-256 verglichen für IfSG 48/27/21 und BayJG 151/3/54).
Die Befehlszeile bleibt unberührt: `./mvnw package` erzeugt unverändert das
JAR, alle Optionen und Meldungstexte sind gleich, das Wasm-Profil ist rein
additiv und verlangt Oracle GraalVM 25.1+ (die CE hat kein Web Image).
Portabilitätsschnitt (nützt beiden Fassungen):
* `Quelle` (Name + Bytes) ersetzt `Path` in der Pipeline; nur die
Befehlszeile kennt noch ein Dateisystem. Der Name trägt genau den
bisherigen `getFileName()`-Text, damit Warnungen und Quellenzeile
wortgleich bleiben.
* `DateiTyp` erkennt PDF/XML/Klartext an den Signaturbytes. Tika entfällt —
eine schwergewichtige Abhängigkeit samt ServiceLoader- und
XML-Konfiguration weniger, was der Wasm-Übersetzung unmittelbar zugutekommt.
Vier Eigenheiten von Web Image, die der Quelltext jeweils an Ort und Stelle
vermerkt:
* `java.util.zip.Inflater` ist nicht angebunden (GR-65205), ohne Inflate ist
kein PDF lesbar. `InflaterErsatz` substituiert ihn durch jzlib.
* Typisierte JS-Felder lassen sich nicht nach `byte[]` umsetzen
(„byteArrayHub is not defined“); der Dateiinhalt wandert als Base64.
* JULs Standardformatter ruft `StackWalker`, den es dort nicht gibt.
* Im Worker fehlt `document.currentScript`, worauf die Laufzeit das
Wasm-Modul neben `worker.js` sucht; die VM wird deshalb mit ausdrücklichem
Pfad ein zweites Mal gestartet.
Die Reachability-Metadaten stammen aus einem Lauf des Tracing-Agents über die
Pipeline; die PDFBox- und FontBox-Ressourcen sind als Globs ergänzt, sonst
scheitern PDFs an „Could not find referenced cmap stream Identity-H“.
Entfallen: WebMain, UploadHandler, StaticHandler, Multipart und die
systemd-Unit. Die nginx-Vorlage liefert jetzt statische Dateien aus, und die
Datenschutzseite sagt, was nun stimmt: Die Dateien verlassen den Rechner
nicht.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Change-Id: I38faf2ac0f764d601f080d4276babe4747773683
Diffstat (limited to 'deploy/aendggner-web.service')
| -rw-r--r-- | deploy/aendggner-web.service | 41 |
1 files changed, 0 insertions, 41 deletions
diff --git a/deploy/aendggner-web.service b/deploy/aendggner-web.service deleted file mode 100644 index f87bbb8..0000000 --- a/deploy/aendggner-web.service +++ /dev/null @@ -1,41 +0,0 @@ -# systemd-Unit für den ÄndGgner-Webserver. -# -# Installation (Beispiel): -# sudo cp deploy/aendggner-web.service /etc/systemd/system/ -# sudo useradd --system --home /opt/aendggner --shell /usr/sbin/nologin aendggner -# sudo cp -r . /opt/aendggner && sudo chown -R aendggner:aendggner /opt/aendggner -# sudo systemctl daemon-reload -# sudo systemctl enable --now aendggner-web -# -# Erwartet, dass zuvor "mvn package" gelaufen ist, sodass target/aendggner-*.jar -# und target/libs/* existieren. - -[Unit] -Description=AendGgner Web-App -After=network.target - -[Service] -Type=simple -User=aendggner -Group=aendggner -WorkingDirectory=/opt/aendggner -ExecStart=/bin/sh -c 'exec java -cp "target/aendggner-*.jar:target/libs/*" eu.mulk.aendggner.web.WebMain' -Environment=AENDGGNER_WEB_PORT=8080 -Environment=AENDGGNER_WEB_BIND=127.0.0.1 -Restart=on-failure -RestartSec=5 - -# Ressourcen-Obergrenzen: hält den Dienst auf einem kleinen Server in Schach, -# selbst wenn die Anwendungs- und Proxy-seitigen Limits einmal nicht greifen. -MemoryMax=512M -CPUQuota=150% -TasksMax=128 - -# Härtung -NoNewPrivileges=true -PrivateTmp=true -ProtectSystem=strict -ProtectHome=true - -[Install] -WantedBy=multi-user.target |
