De korte containernaam 'agent' wees naar de verkeerde app

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>
This commit is contained in:
Harmen
2026-08-28 11:41:58 +02:00
co-authored by Claude Opus 5
parent 0acd315877
commit 2b17f79181
6 changed files with 94 additions and 12 deletions
+47
View File
@@ -270,6 +270,52 @@ def test_data_onder_data(u, app):
not ontbreekt, "ontbreekt: %r" % ontbreekt) not ontbreekt, "ontbreekt: %r" % ontbreekt)
def test_containernamen_zijn_volledig(u, app):
"""Verwijzingen tussen containers gebruiken de volledige naam.
Alle apps van umbrelOS delen één Docker-netwerk, dus een servicenaam als
'agent' of 'server' is daar niet uniek. Heeft een tweede app dezelfde naam,
dan verdeelt Docker de naam over beide containers en komt ongeveer de helft
van het verkeer bij de verkeerde app uit.
Dat is geen theorie: op 28-08-2026 gaf de statuspagina van Evolu Relay
afwisselend goede gegevens en een 404, omdat Electrum Gate óók een 'agent' op
poort 8000 heeft. Van tien verzoeken kwamen er vijf verkeerd uit. Het maakte
bovendien de pagina van Electrum Gate kapot, een app die tot dat moment werkte.
De vorm <app-id>_<service>_1 is wél uniek. Deze toets kijkt naar de plekken
waar een naam als hostnaam wordt gebruikt: proxy_pass in een nginx-config, en
de omgevingsvariabelen die een hostnaam dragen.
"""
fout = []
for bestandsnaam in sorted(os.listdir(os.path.join(REPO, app))):
if not bestandsnaam.endswith(".template") and bestandsnaam != "docker-compose.yml":
continue
tekst = lees(os.path.join(REPO, app, bestandsnaam))
for regel in tekst.splitlines():
kaal = regel.strip()
if kaal.startswith("#"):
continue
naam = None
if kaal.startswith("proxy_pass http://"):
naam = kaal[len("proxy_pass http://"):].split(":", 1)[0].split("/", 1)[0]
elif "_HOST:" in kaal and not kaal.startswith("- "):
waarde = kaal.split(":", 1)[1].strip().strip('"')
# Een variabele van umbrelOS of een IP-adres is geen containernaam.
if waarde and not waarde.startswith("${") and not waarde[0].isdigit():
naam = waarde
if naam is None or naam in ("localhost", "127.0.0.1"):
continue
if not naam.startswith(app + "_"):
fout.append("%s: %s" % (bestandsnaam, naam))
u.check("%s: verwijzingen naar containers gebruiken de volledige naam" % app,
not fout, "korte namen: %r" % fout)
def rapporteer_pinstatus(apps): def rapporteer_pinstatus(apps):
"""Afdrukken, niet toetsen. Zie de uitleg bovenaan dit bestand.""" """Afdrukken, niet toetsen. Zie de uitleg bovenaan dit bestand."""
print() print()
@@ -299,6 +345,7 @@ def main():
test_manifest_volgorde(u, app) test_manifest_volgorde(u, app)
test_compose_bestaat_en_hangt_samen(u, app) test_compose_bestaat_en_hangt_samen(u, app)
test_data_onder_data(u, app) test_data_onder_data(u, app)
test_containernamen_zijn_volledig(u, app)
rapporteer_pinstatus(apps) rapporteer_pinstatus(apps)
return u.rapport() return u.rapport()
+9 -4
View File
@@ -27,10 +27,15 @@ set -eu
# De versies van `@evolu/common` en `@evolu/nodejs` staan exact in package.json en # De versies van `@evolu/common` en `@evolu/nodejs` staan exact in package.json en
# zijn dáár de pin. Hier staat alleen het etiket op de uitkomst. # zijn dáár de pin. Hier staat alleen het etiket op de uitkomst.
# #
# Houd VERSION gelijk aan `version` in whatsnext-evolu-relay/umbrel-app.yml. Twee # Dit is het etiket op de IMAGE. Verhoog het als de image verandert, dus als er
# redenen: je kunt op het apparaat zien wat er draait, en umbrelOS rolt een # iets in src/, package.json of de Dockerfile wijzigt, en zet dan dezelfde waarde
# wijziging niet uit als dat nummer niet omhoog gaat. Dat laatste heeft hier een # achter `image:` in de compose.
# keer een dag gekost. #
# `version` in umbrel-app.yml is een ander nummer en mag hierop vooruitlopen: dat
# moet bij élke wijziging aan de app omhoog, ook als alleen een template
# verandert, want anders rolt umbrelOS hem niet uit. Dat heeft hier een keer een
# dag gekost. Ze zijn dus gelijk zolang alleen de image wijzigt, en lopen uiteen
# zodra er een reparatie in de app-map zit.
VERSION="0.2.0" VERSION="0.2.0"
# Het register staat er expres in en dit is geen smaakkwestie: umbreld haalt élke # Het register staat er expres in en dit is geen smaakkwestie: umbreld haalt élke
+11 -2
View File
@@ -56,8 +56,17 @@ http {
# Geen proxy_set_header hier, en dat is geen vergetelheid: die zouden een # Geen proxy_set_header hier, en dat is geen vergetelheid: die zouden een
# nginx-variabele vragen, en die haalt de template-invulling weg. De # nginx-variabele vragen, en die haalt de template-invulling weg. De
# agent heeft ze niet nodig. # 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/ { location /api/ {
proxy_pass http://agent:8000; proxy_pass http://whatsnext-electrum-gate_agent_1:8000;
client_max_body_size 1k; client_max_body_size 1k;
} }
@@ -67,7 +76,7 @@ http {
# limiet geldt nergens anders. De agent kapt zelf ook af, op 96k; deze # limiet geldt nergens anders. De agent kapt zelf ook af, op 96k; deze
# limiet is de eerste zeef en niet de enige. # limiet is de eerste zeef en niet de enige.
location = /api/certificate/upload { location = /api/certificate/upload {
proxy_pass http://agent:8000; proxy_pass http://whatsnext-electrum-gate_agent_1:8000;
client_max_body_size 96k; client_max_body_size 96k;
} }
} }
+9 -3
View File
@@ -9,7 +9,7 @@ manifestVersion: 1
id: whatsnext-electrum-gate id: whatsnext-electrum-gate
category: bitcoin category: bitcoin
name: Electrum Gate name: Electrum Gate
version: "0.0.22" version: "0.0.23"
tagline: Your own node from anywhere, without waiting for Tor tagline: Your own node from anywhere, without waiting for Tor
description: >- description: >-
The privacy win is already yours: you run the Electrum server. A public one gets asked for The privacy win is already yours: you run the Electrum server. A public one gets asked for
@@ -56,13 +56,19 @@ description: >-
# staan. In 0.0.9 stond er daardoor drie keer "Earlier releases" en twee keer # staan. In 0.0.9 stond er daardoor drie keer "Earlier releases" en twee keer
# dezelfde 0.0.4-regel. De toets let er nu op. # dezelfde 0.0.4-regel. De toets let er nu op.
releaseNotes: >- releaseNotes: >-
In light mode the panels now have an outline as well as a shadow. A soft shadow on white gives depth but Fixes a page that could go blank or show stale values once another app from the same store was
no edge, so where a panel ended was a matter of looking closely. Dark mode is unchanged. installed. The page reached its helper by a short name that a second app happened to use as well, so
roughly half of its requests ended up at the wrong one. It now uses a name that is unique to this app.
If your page has been behaving oddly, this is why.
Earlier releases: Earlier releases:
0.0.22 gave panels in light mode an outline as well as a shadow. A soft shadow on white gives depth but
no edge, so where a panel ended was a matter of looking closely. Dark mode was unchanged.
0.0.21 put every tile value at the same size, so a block height no longer looked more important than a 0.0.21 put every tile value at the same size, so a block height no longer looked more important than a
server name beside it, and gave the dialog a cross to close instead of the word "Close". server name beside it, and gave the dialog a cross to close instead of the word "Close".
+8 -1
View File
@@ -48,8 +48,15 @@ http {
# Geen proxy_set_header, en dat is geen vergetelheid: die zouden een # Geen proxy_set_header, en dat is geen vergetelheid: die zouden een
# nginx-variabele vragen en die haalt de template-invulling weg. De agent # nginx-variabele vragen en die haalt de template-invulling weg. De agent
# heeft ze niet nodig. # heeft ze niet nodig.
# De volledige containernaam en niet de servicenaam 'agent'. Dat stond er
# eerst, en op het apparaat gaf het een 404 bij ongeveer elke tweede
# aanroep (28-08-2026): Electrum Gate heeft óók een service 'agent' op
# poort 8000, beide apps zitten op hetzelfde Docker-netwerk, en de korte
# naam kan dus naar de verkeerde container wijzen. De vorm
# <app-id>_<service>_1 is uniek per app. Dezelfde les stond al in de
# compose van Electrum Gate, over de servicenaam 'server'.
location /api/ { location /api/ {
proxy_pass http://agent:8000; proxy_pass http://whatsnext-evolu-relay_agent_1:8000;
# Een opdracht is een handvol bytes. De agent kapt zelf ook af, op # Een opdracht is een handvol bytes. De agent kapt zelf ook af, op
# 4k; dit is de eerste zeef en niet de enige. # 4k; dit is de eerste zeef en niet de enige.
client_max_body_size 4k; client_max_body_size 4k;
+10 -2
View File
@@ -11,7 +11,7 @@ manifestVersion: 1
id: whatsnext-evolu-relay id: whatsnext-evolu-relay
category: bitcoin category: bitcoin
name: Evolu Relay name: Evolu Relay
version: "0.2.0" version: "0.2.1"
tagline: Sync your Trezor Suite labels through your own machine tagline: Sync your Trezor Suite labels through your own machine
description: >- description: >-
Trezor Suite can sync the labels and account names you give your addresses across your Trezor Suite can sync the labels and account names you give your addresses across your
@@ -39,7 +39,15 @@ description: >-
Point Trezor Suite at this Umbrel to use it. Away from home you will need a way in, such as Point Trezor Suite at this Umbrel to use it. Away from home you will need a way in, such as
Tailscale or a reverse proxy with your own domain. Tailscale or a reverse proxy with your own domain.
releaseNotes: >- releaseNotes: >-
A different relay, and a much smaller app. 0.0.2 packaged the relay Trezor runs for their own Fixes a status page that alternated between working and showing an error. It reached its helper by a
short name that another app in this store uses as well, so about half of its requests ended up at the
wrong app. It now uses a name that is unique to this one.
Earlier releases:
0.2.0 was a different relay, and a much smaller app. 0.0.2 packaged the relay Trezor runs for their own
hosted service, with a quota manager and a PostgreSQL database beside it. That combination hosted service, with a quota manager and a PostgreSQL database beside it. That combination
cannot work on your own machine: Suite skips the quota manager as soon as you point it at a cannot work on your own machine: Suite skips the quota manager as soon as you point it at a
relay of your own, while that relay refuses every owner the quota manager never registered. relay of your own, while that relay refuses every owner the quota manager never registered.