# SPDX-FileCopyrightText: 2020 Matthias Andreas Benkard # SPDX-License-Identifier: AGPL-3.0-or-later # Vorlage für die Auslieferung der ÄndGgner-Browserfassung unter # https://matthias.benkard.de/aendggner/. # # Es gibt keinen Anwendungsprozess: Der Server liefert nur statische Dateien aus # (Inhalt von target/web/), gerechnet wird im Browser. Weil der Dienst unter einem # Unterpfad einer bestehenden Domain läuft, ist dies kein eigener server-Block, # sondern ein Schnipsel zum Einfügen in den vorhandenen — Zertifikat, HTTP→HTTPS # und Domainname bleiben, wie sie sind: # # server { ... include /etc/nginx/snippets/aendggner.conf; ... } # # Ausgerollt wird nach /var/www/aendggner (siehe README.adoc, Abschnitt „Ausrollen“). # Ohne diesen Schritt liefe /aendggner ins Leere, und alle relativen Verweise der # Seite gingen von / statt von /aendggner/ aus. location = /aendggner { return 301 /aendggner/; } location /aendggner/ { # Bewusst „root /var/www“ (mit dem Verzeichnis /var/www/aendggner) statt # „alias /var/www/aendggner/“: In einer Präfix-Location löst try_files $uri # gegen den root auf, nicht gegen den alias, und liefert dann 404 für alles. root /var/www; index index.html; try_files $uri $uri/ =404; # Ohne den ersten Typ lehnt der Browser die Streaming-Instanziierung des Moduls # ab. Ein types-Block in einer location ersetzt die Zuordnung vollständig, statt # sie zu ergänzen — deshalb stehen hier alle vorkommenden Endungen. types { application/wasm wasm; text/html html; text/css css; text/javascript js; image/svg+xml svg; text/plain txt; application/gzip gz; } default_type application/octet-stream; # Das Wasm-Modul ist rund 24 MB groß. deploy/webpaket.sh legt beim Bauen .gz # und .br daneben; ausgeliefert wird die fertige Datei, statt sie je Abruf neu # zu packen. gzip_static bringen die üblichen Distributionspakete mit; # brotli_static setzt das Modul ngx_brotli voraus — fehlt es, die Zeile # streichen, gzip_static genügt. gzip_static on; brotli_static on; # Kein „expires 7d“: Die Dateinamen tragen keine Fassungskennung. Ein Browser # mit altem app.js und neuem .wasm (oder umgekehrt) bekäme eine Mischfassung, # die es nie gegeben hat. Stattdessen Revalidierung bei jedem Abruf; für das # unveränderte Modul kostet das ein 304 ohne Rumpf. add_header Cache-Control "no-cache" always; # add_header in einer location verdrängt sämtliche vom server-Block geerbten # Header. Alles, was hier gelten soll, muss deshalb hier stehen — auch ein # dort gesetztes HSTS. # add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always; # 'wasm-unsafe-eval' ist für die Instanziierung des Moduls nötig; echtes eval # oder new Function kommt in der erzeugten aendggner.js nicht vor. # # style-src braucht 'unsafe-inline': Die fertige Synopse wird als blob:-Dokument # geöffnet, und ein blob:-Dokument erbt die CSP des Dokuments, das es erzeugt # hat. Der HtmlRenderer bettet sein Stylesheet als