Alle apps van umbrelOS delen een Docker-netwerk, dus een servicenaam als 'agent' is daar niet uniek. Electrum Gate heeft er een op poort 8000 en Evolu Relay sinds vandaag ook, en Docker verdeelde de naam netjes over allebei. Gemeten op het apparaat: van tien verzoeken vanuit de nginx-container kwamen er vijf bij de verkeerde app uit, met een 404 tot gevolg. Op de statuspagina zag dat eruit als een status die wisselde tussen "running" en "agent unreachable". Dit raakte twee apps, en de tweede is de vervelende: de pagina van Electrum Gate proxyde ook naar http://agent:8000 en werkte alleen omdat die app tot vandaag de enige met die naam was. Het installeren van Evolu Relay heeft die pagina dus kapotgemaakt. Beide gaan nu naar <app-id>_agent_1, en beide manifesten gaan omhoog, want zonder verhoging bereikt een gewijzigde template geen bestaande installatie. Dezelfde les stond al in de compose van Electrum Gate, over de servicenaam 'server', en die is bij het schrijven van de nginx-config genegeerd. Daarom nu een toets erop: test_appstore_vorm controleert voor elke app dat een proxy_pass en elke *_HOST-variabele een naam gebruiken die met het app-id begint. Muteertest gedaan, de toets viel om op precies de korte naam. Bijgewerkt in build.sh: VERSION daar is het etiket op de image, en `version` in het manifest is een ander nummer dat erop vooruit mag lopen. Ze lopen uiteen zodra er een reparatie in de app-map zit zonder dat de image wijzigt, en dat is nu het geval. Tests: alle vier groen (34, 54, 39 en 60 goed, 0 fout). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
98 lines
4.8 KiB
Plaintext
98 lines
4.8 KiB
Plaintext
# nginx-configuratie voor Electrum Gate.
|
|
#
|
|
# Dit bestand is een template en dat is bewust. umbrelOS ververst bij een update
|
|
# alleen een whitelist van bestanden, en *.template staat daarin; een gewoon
|
|
# bestand naast de compose zou na een update ongewijzigd blijven staan. Daarnaast
|
|
# vult umbrelOS bij elke start de omgevingsvariabelen hieronder in en schrijft het
|
|
# resultaat naast dit bestand weg als nginx.conf.
|
|
#
|
|
# Let op bij het wijzigen: gebruik hier geen nginx-variabelen met een dollarteken
|
|
# (zoals de gebruikelijke in een log_format). De invulling vervangt elke ${...}
|
|
# en zou die stilzwijgend leegmaken. Daarom staat access_log voor http uit, en
|
|
# wordt het log_format van de stream-sessies door het command-blok in
|
|
# docker-compose.yml weggeschreven; dáár is een dollarteken te ontsnappen.
|
|
|
|
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, en dat is geen vergetelheid: die zouden een
|
|
# nginx-variabele vragen, en die haalt de template-invulling weg. 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 <app-id>_<service>_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.template, 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.
|
|
#
|
|
# Het command-blok van docker-compose.yml 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;
|