| Matthias Andreas Benkard | 7d46f07 | 2026-08-24 21:43:05 +0200 | [diff] [blame] | 1 | # SPDX-FileCopyrightText: 2026 Matthias Andreas Benkard <code@mail.matthias.benkard.de> |
| Matthias Andreas Benkard | a5d5544 | 2026-08-23 08:31:49 +0200 | [diff] [blame] | 2 | # SPDX-License-Identifier: AGPL-3.0-or-later |
| 3 | |
| Matthias Andreas Benkard | 2d33bf7 | 2026-08-16 06:40:07 +0200 | [diff] [blame] | 4 | # Vorlage für die Auslieferung der ÄndGgner-Browserfassung unter |
| Matthias Andreas Benkard | 2ef19ec | 2026-08-29 20:39:11 +0200 | [diff] [blame^] | 5 | # https://aendggner.kellertomaten.de/. |
| Matthias Andreas Benkard | 7b455cd | 2026-08-09 08:33:37 +0200 | [diff] [blame] | 6 | # |
| Matthias Andreas Benkard | 2d33bf7 | 2026-08-16 06:40:07 +0200 | [diff] [blame] | 7 | # Es gibt keinen Anwendungsprozess: Der Server liefert nur statische Dateien aus |
| 8 | # (Inhalt von target/web/), gerechnet wird im Browser. Weil der Dienst unter einem |
| 9 | # Unterpfad einer bestehenden Domain läuft, ist dies kein eigener server-Block, |
| 10 | # sondern ein Schnipsel zum Einfügen in den vorhandenen — Zertifikat, HTTP→HTTPS |
| 11 | # und Domainname bleiben, wie sie sind: |
| 12 | # |
| 13 | # server { ... include /etc/nginx/snippets/aendggner.conf; ... } |
| 14 | # |
| Matthias Andreas Benkard | 8cbbaaa | 2026-08-23 13:20:48 +0200 | [diff] [blame] | 15 | # Ausgerollt wird nach /var/www/aendggner (siehe README.md, Abschnitt „Ausrollen“). |
| Matthias Andreas Benkard | 7b455cd | 2026-08-09 08:33:37 +0200 | [diff] [blame] | 16 | |
| Matthias Andreas Benkard | 2d33bf7 | 2026-08-16 06:40:07 +0200 | [diff] [blame] | 17 | # Ohne diesen Schritt liefe /aendggner ins Leere, und alle relativen Verweise der |
| 18 | # Seite gingen von / statt von /aendggner/ aus. |
| 19 | location = /aendggner { |
| 20 | return 301 /aendggner/; |
| Matthias Andreas Benkard | 7b455cd | 2026-08-09 08:33:37 +0200 | [diff] [blame] | 21 | } |
| 22 | |
| Matthias Andreas Benkard | 2d33bf7 | 2026-08-16 06:40:07 +0200 | [diff] [blame] | 23 | location /aendggner/ { |
| 24 | # Bewusst „root /var/www“ (mit dem Verzeichnis /var/www/aendggner) statt |
| 25 | # „alias /var/www/aendggner/“: In einer Präfix-Location löst try_files $uri |
| 26 | # gegen den root auf, nicht gegen den alias, und liefert dann 404 für alles. |
| 27 | root /var/www; |
| Matthias Andreas Benkard | 2b1841e | 2026-08-15 10:51:11 +0200 | [diff] [blame] | 28 | index index.html; |
| 29 | |
| Matthias Andreas Benkard | 2d33bf7 | 2026-08-16 06:40:07 +0200 | [diff] [blame] | 30 | try_files $uri $uri/ =404; |
| 31 | |
| 32 | # Ohne den ersten Typ lehnt der Browser die Streaming-Instanziierung des Moduls |
| 33 | # ab. Ein types-Block in einer location ersetzt die Zuordnung vollständig, statt |
| 34 | # sie zu ergänzen — deshalb stehen hier alle vorkommenden Endungen. |
| Matthias Andreas Benkard | 2b1841e | 2026-08-15 10:51:11 +0200 | [diff] [blame] | 35 | types { |
| 36 | application/wasm wasm; |
| Matthias Andreas Benkard | 2d33bf7 | 2026-08-16 06:40:07 +0200 | [diff] [blame] | 37 | text/html html; |
| 38 | text/css css; |
| 39 | text/javascript js; |
| 40 | image/svg+xml svg; |
| 41 | text/plain txt; |
| 42 | application/gzip gz; |
| Matthias Andreas Benkard | 2b1841e | 2026-08-15 10:51:11 +0200 | [diff] [blame] | 43 | } |
| Matthias Andreas Benkard | 2d33bf7 | 2026-08-16 06:40:07 +0200 | [diff] [blame] | 44 | default_type application/octet-stream; |
| Matthias Andreas Benkard | 2b1841e | 2026-08-15 10:51:11 +0200 | [diff] [blame] | 45 | |
| Matthias Andreas Benkard | 2d33bf7 | 2026-08-16 06:40:07 +0200 | [diff] [blame] | 46 | # Das Wasm-Modul ist rund 24 MB groß. deploy/webpaket.sh legt beim Bauen .gz |
| 47 | # und .br daneben; ausgeliefert wird die fertige Datei, statt sie je Abruf neu |
| 48 | # zu packen. gzip_static bringen die üblichen Distributionspakete mit; |
| 49 | # brotli_static setzt das Modul ngx_brotli voraus — fehlt es, die Zeile |
| 50 | # streichen, gzip_static genügt. |
| 51 | gzip_static on; |
| 52 | brotli_static on; |
| Matthias Andreas Benkard | 2b1841e | 2026-08-15 10:51:11 +0200 | [diff] [blame] | 53 | |
| Matthias Andreas Benkard | 2d33bf7 | 2026-08-16 06:40:07 +0200 | [diff] [blame] | 54 | # Kein „expires 7d“: Die Dateinamen tragen keine Fassungskennung. Ein Browser |
| 55 | # mit altem app.js und neuem .wasm (oder umgekehrt) bekäme eine Mischfassung, |
| 56 | # die es nie gegeben hat. Stattdessen Revalidierung bei jedem Abruf; für das |
| 57 | # unveränderte Modul kostet das ein 304 ohne Rumpf. |
| 58 | add_header Cache-Control "no-cache" always; |
| Matthias Andreas Benkard | 7b455cd | 2026-08-09 08:33:37 +0200 | [diff] [blame] | 59 | |
| Matthias Andreas Benkard | 2d33bf7 | 2026-08-16 06:40:07 +0200 | [diff] [blame] | 60 | # add_header in einer location verdrängt sämtliche vom server-Block geerbten |
| 61 | # Header. Alles, was hier gelten soll, muss deshalb hier stehen — auch ein |
| 62 | # dort gesetztes HSTS. |
| 63 | # add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always; |
| 64 | |
| 65 | # 'wasm-unsafe-eval' ist für die Instanziierung des Moduls nötig; echtes eval |
| 66 | # oder new Function kommt in der erzeugten aendggner.js nicht vor. |
| 67 | # |
| 68 | # style-src braucht 'unsafe-inline': Die fertige Synopse wird als blob:-Dokument |
| 69 | # geöffnet, und ein blob:-Dokument erbt die CSP des Dokuments, das es erzeugt |
| 70 | # hat. Der HtmlRenderer bettet sein Stylesheet als <style> ein — ohne die |
| 71 | # Freigabe erschiene die Synopse unformatiert. Skripte bleiben streng. |
| 72 | add_header Content-Security-Policy "default-src 'none'; script-src 'self' 'wasm-unsafe-eval'; worker-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self'; form-action 'none'; frame-ancestors 'none'; base-uri 'none'" always; |
| 73 | add_header X-Content-Type-Options "nosniff" always; |
| 74 | add_header Referrer-Policy "no-referrer" always; |
| 75 | add_header Permissions-Policy "geolocation=(), camera=(), microphone=(), usb=()" always; |
| Matthias Andreas Benkard | 7b455cd | 2026-08-09 08:33:37 +0200 | [diff] [blame] | 76 | } |
| Matthias Andreas Benkard | 2d33bf7 | 2026-08-16 06:40:07 +0200 | [diff] [blame] | 77 | |
| 78 | # Eine robots.txt unter /aendggner/ wäre wirkungslos: Maßgeblich ist allein die im |
| 79 | # Wurzelverzeichnis der Domain. Wer die Seite von der Indizierung ausnehmen will, |
| 80 | # trage dort ein: |
| 81 | # |
| 82 | # User-agent: * |
| 83 | # Disallow: /aendggner/ |