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
+22 -18
View File
@@ -11,16 +11,18 @@ Draaien:
python tests/test_agent_certificates.py
De test laadt `agent.py.template` rechtstreeks. Dat kan omdat dat bestand geen
accolade-variabelen bevat en de invulling door umbreld hem dus onveranderd laat;
de eerste toets hieronder controleert precies dat.
De test laadt `tools/electrum-gate/agent.py` rechtstreeks: het bestand dat de
Dockerfile in de image zet. Tot 0.1.0 heette dat `agent.py.template` en stond het
in de app-map; de eerste toets hieronder is uit die tijd en blijft staan, want
het script haalt zijn instellingen nog altijd uit de omgeving en niet uit een
ingevulde constante.
"""
import sys
# Vóór de imports, want anders is het te laat: Python legt bytecode naast
# agent.py.template zodra die geïmporteerd wordt, en die rommel hoort niet in de
# app-map. Een keer is zo'n .pyc meegegaan in een commit.
# Vóór de imports, want anders is het te laat: Python legt bytecode naast agent.py
# zodra die geïmporteerd wordt, en die rommel hoort niet in de repo. Een keer is
# zo'n .pyc meegegaan in een commit.
sys.dont_write_bytecode = True
import importlib.machinery # noqa: E402
@@ -33,17 +35,13 @@ import subprocess # noqa: E402
import tempfile # noqa: E402
HERE = os.path.dirname(os.path.abspath(__file__))
TEMPLATE = os.path.join(HERE, os.pardir, "whatsnext-electrum-gate", "agent.py.template")
AGENT = os.path.join(HERE, os.pardir, "tools", "electrum-gate", "agent.py")
def load_agent():
"""Laadt agent.py.template als module.
Met een expliciete loader, want importlib kijkt normaal naar de extensie en
.template staat daar niet tussen.
"""
loader = importlib.machinery.SourceFileLoader("gate_agent", TEMPLATE)
spec = importlib.util.spec_from_file_location("gate_agent", TEMPLATE, loader=loader)
"""Laadt agent.py als module, buiten sys.path om."""
loader = importlib.machinery.SourceFileLoader("gate_agent", AGENT)
spec = importlib.util.spec_from_file_location("gate_agent", AGENT, loader=loader)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
return module
@@ -83,12 +81,18 @@ def nep_certificaat(tijdtag, tijdtekst):
def test_template_is_invulbaar_zonder_schade(u):
"""De aanname waar deze hele test op rust."""
with open(TEMPLATE, "r", encoding="utf-8") as f:
"""Een restant uit de template-tijd dat blijft staan.
Het bestand zit sinds 0.1.0 in de image en gaat door geen envsubst meer. Maar
een accolade-variabele in Python-code is ook zonder umbreld een fout, en als
iemand dit bestand ooit weer als template in een app-map zet, is dit de toets
die het meteen ziet.
"""
with open(AGENT, "r", encoding="utf-8") as f:
inhoud = f.read()
u.check("template bevat geen accolade-variabelen",
u.check("agent.py bevat geen accolade-variabelen",
"${" not in inhoud,
"umbreld zou die invullen en de Python-code slopen")
"een envsubst-stap zou die invullen en de Python-code slopen")
def test_einddatum_gelijk_aan_ssl(agent, u):