Evolu Relay als tweede app in de store, plus het bouwrecept

De gebruiker koos ervoor het pakket meteen te maken en een installatie te
proberen, met de image lokaal gebouwd en het recept in de repo. Dit is dat
pakket. Er is nog niets gebouwd en niets geinstalleerd; "gebouwd" is hier
nadrukkelijk niet "werkend".

De zwaarste ontwerpvraag is met een precedent beslecht en niet met een gok.
Trezor Suite is geen browser met een sessiecookie en kan dus niet achter de inlog
van umbrelOS; het was onduidelijk of PROXY_AUTH_ADD "false" dan verantwoord is of
een omweg. De eigen nostr-relay-app van Umbrel doet exact hetzelfde, om precies
dezelfde reden, en heeft ook geen eigen ports:. De prijs staat in de compose en in
het plan: wie die poort bereikt, bereikt de relay. Wat de schade beperkt is dat de
relay elke eigenaar zonder limietenrij weigert.

Daarom gaat de quota-manager mee, en dat is geen restje van Trezor's betaalde
hosting: hij is wat die rijen aanmaakt. Relay en quota-manager komen uit dezelfde
image met een ander command, want bovenstrooms is het een codebase met meerdere
startscripts. Het command staat expliciet en leunt niet op de CMD van de
Dockerfile, waar yarn start staat met bovenstrooms zelf een twijfel erbij.

Het bouwrecept staat in tools/ en niet in de app-map. Dat is geen netheid: een
Dockerfile staat niet in de update-whitelist, dus bouwen-in-de-app zou elke
nieuwe versie een deinstallatie plus herinstallatie kosten. Onder tools/ en niet
onder build/, want dat laatste staat in .gitignore als bouwselmap en het recept
zou stilzwijgend buiten de repo zijn gebleven. Dat kwam pas bij git status aan het
licht.

De poort is 3851 en niet 4000. 4000 is de eigen poort van de relay maar ook een
veelgebruikte poort, en een botsing op de host merk je pas als de app niet start.
Die les komt van 50002 tegen Fulcrum.

Nieuw testbestand test_appstore_vorm.py, en het gaat over de store en niet over
een app: id gelijk aan mapnaam, store-voorvoegsel, veldvolgorde, app_proxy die
naar een bestaande service wijst, en elke gemounte map die in de repo bestaat. Het
vindt zijn apps zelf, dus een derde app valt er automatisch onder. Digests toetst
het expres niet: geen van de twee apps haalt die regel vandaag en een suite die
altijd rood staat wordt niet gelezen.

Mutatie-getest met drie ingrepen: het app-id laten afwijken van de mapnaam,
APP_HOST naar een niet-bestaande service laten wijzen, en de .gitkeep weghalen.
Alle drie vielen om bij de juiste toets, en git diff was daarna leeg.

Umbrelapp is gepromoveerd naar Actief als 008, tussen Proefopstelling en
Appstore, en het masterplan is naar het archief. Wat er in de plannen als open
blijft staan is niet klein: of Trezor Suite dit adres accepteert, of het
databaseschema zichzelf aanmaakt, en hoe je een eigenaar registreert.

Tests: 32 goed 0 fout, 39 goed 0 fout en 54 goed 0 fout, niets overgeslagen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Harmen
2026-08-25 17:18:22 +02:00
co-authored by Claude Opus 5
parent 1a87a45685
commit b2e9c8fc7a
15 changed files with 993 additions and 33 deletions
@@ -0,0 +1,145 @@
# Umbrelapp - masterplan
> **App: Evolu Relay.** Status: nog niet actief. Dit is één bestand en dat is bewust: er is nog geen
> `TAKEN.md`, `PROGRESS.md` of `OPEN.md`, want er wordt nog niet aan gewerkt. Bij promotie naar
> `Plannen/Actief/NNN-Umbrelapp/` worden de paragrafen hieronder over die vier bestanden verdeeld; zie
> `HomeGit/Docs/Werkproces.md` §1b.
>
> Afhankelijk van: **Proefopstelling**. Het aantal containers, de variabelen en de authenticatievraag
> komen daar vandaan, en zonder die antwoorden is elk manifest een gok.
## 1. Doel
Van een stack die lokaal draait naar een tweede app in deze store, die je in umbrelOS installeert en die
daarna vanzelf terugkomt. Concreet: een map `whatsnext-evolu-relay/` met een `umbrel-app.yml` en een
`docker-compose.yml`, geïnstalleerd op de Umbrel van de gebruiker, met Trezor Suite die erop
synchroniseert.
## 2. Afbakening
Het pakket en de installatie: manifest, compose, en de controles op het apparaat zelf. Ook het opruimen
van wat de eigen opzet van Trezor meebrengt en Umbrel niet wil, zoals de `.k8s/`-map en een eigen
netwerkblok.
De store zelf valt hier **buiten**: die bestaat al en serveert Electrum Gate. Wat er nog aan moet gebeuren
is één map erbij.
## 3. Niet-doelen
- **Geen bereikbaarheid van buiten het thuisnetwerk.** Masterplan **Bereikbaarheid**. Dit plan is af als
het op het eigen netwerk werkt.
- **Geen inlevering bij de officiële store.** Masterplan **Publicatie-Relay**. Dat is een andere maatstaf:
niet "hij werkt hier" maar "iemand anders keurt het goed".
- **Geen wijzigingen aan de relay zelf.** Wat Trezor levert, draaien we; wat het niet kan, kan het niet.
## 4. Ontwerp
### 4a. De vorm is bekend, de inhoud niet
De repo-vorm van een community store, de app-proxy, de whitelist bij updates en de regel dat een wijziging
zonder verhoging van `version` niet wordt uitgerold: dat staat allemaal al opgeschreven, met bron, in
[Umbrel-appstore-spec.md](../../Referenties/Umbrel-appstore-spec.md), en het hoeft niet opnieuw uitgezocht
te worden. Electrum Gate in dezelfde repo is bovendien een werkend voorbeeld van elke regel daaruit.
Wat hieronder staat is wat daar **niet** uit volgt, omdat die spec is opgeschreven vanuit een app die op
vier punten een ander geval is.
### 4b. De cliënt is geen browser, en dat raakt de app-proxy
**Dit is de ontwerpvraag die alles bepaalt**, en de reden dat dit plan wacht in plaats van alvast te
beginnen aan een manifest.
Electrum Gate heeft een dashboard dat een mens in een browser opent, en dat mag dus gewoon achter de inlog
van umbrelOS staan. Trezor Suite is geen browser met een sessiecookie. Komt de relay achter `app_proxy` met
de standaardinstelling te staan, dan krijgt Suite een inlogpagina in plaats van de relay, en dat is geen
configuratiefoutje maar het einde van het pad.
Twee bekende uitwegen, allebei met een prijs:
1. **`PROXY_AUTH_ADD: "false"`** op de proxy-service, zoals Gitea en Budibase in de officiële store doen.
Dan doet de app zijn eigen authenticatie, en de vraag wordt meteen: **dóét deze relay dat?** Zo niet,
dan zet je een open eindpunt op je Umbrel;
2. **een eigen `ports:` op de service**, zoals Electrum Gate met 50022 doet. Voor een niet-web-poort is dat
normaal en de inlevereisen noemen het ook zo. De poort moet dan wel uniek zijn op de host, en dat is
hier een echte controle: op deze machine draaien al Electrum Gate, een Electrum-server en een reverse
proxy.
Welke van de twee het wordt, hangt af van hoe Suite zich tegen de relay authenticeert. Dat antwoord komt
uit **Proefopstelling**, fase 4.
### 4c. Er is geen web-UI, en `port` is een verplicht veld
`port` in het manifest is de poort die umbrelOS voor de tegel gebruikt, dus een web-UI-poort. Deze app
heeft er geen. Wat andere apps zonder interface daarmee doen is niet uitgezocht; zie open punt 1.
### 4d. Er zit een database in de stack
Nieuw ten opzichte van Electrum Gate, dat niets bewaart.
- **De Postgres-datamap hoort onder `${APP_DATA_DIR}/data/postgres`**, niet in een naamloos Docker-volume.
Anders overleeft de data een herinstallatie niet en zit hij niet in de back-up van umbrelOS.
- **Het wachtwoord hoort niet in de repo.** umbrelOS levert `${APP_PASSWORD}` en `${APP_SEED}` aan, per
installatie afgeleid. Een literal in de compose is in een publieke repo een gepubliceerd wachtwoord.
- **`backupIgnore` verdient een overweging, en het antwoord is hier waarschijnlijk "niets".** De database
ís de waarde van deze app. Dat staat er expliciet omdat Electrum Gate het veld wél gebruikt, en
overnemen uit gewoonte zou hier precies het verkeerde weglaten.
### 4e. Geen afhankelijkheden, en niets om te vervangen
Electrum Gate declareert `dependencies: [electrs]` en leunt op het wisselmechanisme met Fulcrum en
ElectrumX. Deze app staat op zichzelf: geen `dependencies`, geen `implements`, en geen leesmount in de map
van een andere app. Dat maakt het pakket eenvoudiger en het haalt meteen het grootste review-risico weg dat
Electrum Gate wél heeft.
### 4f. De image is niet van ons, en misschien bestaat hij niet
Electrum Gate draait op `nginx:alpine` en `python:3-alpine`, twee images die gewoon in een registry staan
en die je alleen nog hoeft te pinnen. Hier is niet bekend of Trezor een image publiceert of alleen een
Dockerfile levert. Is het alleen een Dockerfile, dan bouw en publiceer je zelf, en dan ben je onderhouder
van een image geworden. **Proefopstelling** fase 1 levert het antwoord; zie
[Upstream-evolu-relay.md](../../Referenties/Upstream-evolu-relay.md) §4 punt 1.
## 5. Het werk in grote lijnen
**Fase 1 - de app-map.** `whatsnext-evolu-relay/` naast `whatsnext-electrum-gate/`, met een
`umbrel-app.yml` waarvan het `id` gelijk is aan de mapnaam. Uitkomst: umbrelOS toont een tweede tegel in
de store, ook al doet de app nog niets.
**Fase 2 - de compose.** De `docker-compose.yaml` van Trezor omzetten: `app_proxy`, geen eigen netwerkblok,
data onder `${APP_DATA_DIR}/data/`, geheimen uit umbrelOS-variabelen, en `.k8s/` blijft waar het is.
Uitkomst: een compose die op de Umbrel start.
**Fase 3 - het manifest afmaken.** Velden in de voorgeschreven volgorde, een eigen icoon, en een antwoord
op de `port`-vraag uit §4c.
**Fase 4 - installeren en verifiëren op de Umbrel.** Installeren, Suite laten synchroniseren, en daarna de
controles die je alleen op het apparaat kunt doen: overleeft de data een update, komt de app terug na een
herstart, en botst er geen poort met wat er al draait.
## 6. Open punten
1. **Wat wordt `port` in het manifest?** Dat veld is de web-UI-poort voor de tegel en deze app heeft geen
web-UI. Wat andere apps zonder interface daarmee doen is niet uitgezocht.
**Moment:** fase 3 · **Eigenaar:** uit te zoeken bij het schrijven van het manifest
2. **Komt er een statuspagina?** Electrum Gate heeft er een en die bleek in de praktijk het nuttigste deel
van de app. Hier zou dat kunnen: draait de relay, hoe groot is de database, wanneer was de laatste
synchronisatie. Het is echter een eigen container en een eigen onderhoudslast, en het is geen voorwaarde
om te kunnen synchroniseren. Voordeel dat pas sinds de samenvoeging bestaat: de pagina van Electrum Gate
staat in dezelfde repo en is grotendeels over te nemen.
**Moment:** pas overwegen als fase 4 geslaagd is · **Eigenaar:** gebruiker
3. **Blijft de quota-manager buiten het pakket?** Als **Proefopstelling** uitwijst dat het kan, dan ja.
Blijkt hij verplicht, dan verandert dit plan van vorm en hoort dit punt opnieuw beslist te worden.
**Moment:** bij promotie van dit plan · **Eigenaar:** volgt uit Proefopstelling
## 7. Verificatie
Alles behalve het laatste punt is op een laptop te controleren; het laatste punt is precies waarom dit plan
bestaat.
- YAML geldig, `id` in het manifest gelijk aan de mapnaam, elke `image:` met een `@sha256:`-digest. Dat
zijn de fouten die je anders pas op het apparaat merkt, en ze zijn automatisch te controleren;
- **op de Umbrel:** installeren, synchroniseren met Suite, en daarna een herstart van de app en van het
apparaat. Meld per controle of hij gedaan is, en meld ook expliciet welke niet;
- **en één die alleen bij een tweede app in een bestaande store bestaat:** dat het toevoegen van deze app
Electrum Gate niet raakt. Een kapot manifest in de ene map mag de andere niet meeslepen; of umbrelOS dat
netjes doet is niet uitgezocht.