Gate 0.1.0: eigen image, het command-blok is een script, de app-map is leeg

Plan Eigenimage, fase 1 tot en met 3. De vier templates verhuizen naar
tools/electrum-gate/ zonder extensie; daarnaast Dockerfile (nginx:1.30-alpine
plus python3), entrypoint.sh (het command-blok van de compose, zonder $$) en
build.sh naar het voorbeeld van Evolu Relay. Een image voor beide containers,
gebouwd op de Umbrel; open punt 2 en 3 daarmee beslist.

Inhoudelijk anders dan alleen verplaatst: het log_format staat in stream.conf
zelf, het backend-adres komt via twee plaatshouders zonder dollarteken uit de
omgeving (ook in de server-service), en de pagina haalt versie en adres uit
status.json via GATE_APP_VERSION.

Tests mee verhuisd en uitgebreid: entrypoint.sh en Dockerfile in plaats van het
command-blok, en de tag in de compose gelijk aan VERSION in build.sh voor elke
eigen image. Mutatie-getest met drie ingrepen.

Nog niet gebouwd: er is hier geen Docker. De tag staat ongepind tot de eerste
push; dat is fase 4 en die is van de gebruiker.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Harmen
2026-09-07 20:20:42 +02:00
co-authored by Claude Fable 5.1
parent 7b3804df89
commit 973b24a23f
25 changed files with 981 additions and 410 deletions
+89
View File
@@ -0,0 +1,89 @@
# 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 <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, 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;