# nginx-configuratie voor Electrum Gate. # # Dit bestand zit in de image (tools/electrum-gate/Dockerfile) als # /etc/nginx/nginx.conf. Tot 0.0.29 was het een *.template in de app-map die # umbreld bij elke start door envsubst haalde, en daarom mocht er toen geen # nginx-variabele met een dollarteken in staan. Die beperking is weg. Dat de # access_log voor http nog steeds uit staat is een keuze en geen restant: de # pagina hangt achter de app_proxy en wat die opvraagt is niet interessant. user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } # ── De web-UI ──────────────────────────────────────────────────────────────── # Wordt niet rechtstreeks gepubliceerd: umbrelOS zet er zijn eigen app_proxy # voor, en die verwijst naar poort 80 van deze container. http { include /etc/nginx/mime.types; default_type application/octet-stream; access_log off; sendfile on; server { listen 80; root /usr/share/nginx/html; index index.html; # status.json wordt door de agent in de gedeelde map geschreven, niet in # de webroot. Geen cache: de pagina vraagt hem juist op om te zien hoe # oud de gegevens zijn. location = /status.json { alias /var/lib/gate/status.json; add_header Cache-Control "no-store"; } # De API van de agent. Het enige pad waarlangs iets van buiten de # instellingen van de app raakt, en dat is de certificaatkeuze. # # Waarom dit te verantwoorden is op een app waarvan de kleinheid het punt # is: het pad hangt achter de app_proxy van umbrelOS, die er zijn eigen # inlog voor zet, de TLS-poort staat er los van, en de agent accepteert # alleen een certificaat-id die hij zelf in de gemounte mappen gevonden # heeft. Het ergste wat een geslaagde aanroep doet is een ander, ook # bestaand, certificaat kiezen. # # Geen proxy_set_header hier: de agent heeft ze niet nodig. # # De volledige containernaam en niet de servicenaam 'agent'. Dat stond er # tot 0.0.23 wel, en het werkte zolang deze app de enige was met een # service van die naam. Sinds Evolu Relay er is, is dat niet meer waar: # beide apps zitten op hetzelfde Docker-netwerk, allebei met een 'agent' # op poort 8000, en Docker verdeelt de naam dan over de twee. Op # 28-08-2026 gemeten op het apparaat: van tien verzoeken kwamen er vijf # bij de verkeerde app uit. De vorm __1 is uniek per app; # het is dezelfde les die in de compose al stond over de naam 'server'. location /api/ { proxy_pass http://whatsnext-electrum-gate_agent_1:8000; client_max_body_size 1k; } # Het uploaden van een certificaat, en het enige pad met een grotere # limiet: een sleutel plus keten haalt de 1k van hierboven ruim. Een # exacte match, dus deze regel wint van /api/ hierboven en de grotere # limiet geldt nergens anders. De agent kapt zelf ook af, op 96k; deze # limiet is de eerste zeef en niet de enige. location = /api/certificate/upload { proxy_pass http://whatsnext-electrum-gate_agent_1:8000; client_max_body_size 96k; } } } # ── De TLS-terminatie ──────────────────────────────────────────────────────── # Die staat niet hier maar in stream.conf, en dat is geen ordening maar de # reparatie van een klem. nginx weigert te starten als een 'listen ... ssl' geen # certificaat heeft; stond het stream-blok hier, dan kwam met dat blok ook de # pagina hierboven niet omhoog zolang de agent geen certificaat gekozen had. En # de pagina is juist de plek waar die keuze gemaakt wordt. # # entrypoint.sh legt stream.conf in de map hieronder zodra cert.conf bestaat, en # haalt het weg als dat niet zo is. Een include met een jokerteken die nergens op # uitkomt is voor nginx geen fout, dus zonder certificaat start deze server # zonder poort 50022 en met een pagina die vertelt waarom. include /var/lib/gate/tls/*.conf;