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>
141 lines
7.6 KiB
Markdown
141 lines
7.6 KiB
Markdown
# Umbrelapp - plan
|
|
|
|
> **App: Evolu Relay.** Ontwerp en afbakening. **Dit bestand lees je zelden**, alleen bij twijfel over
|
|
> scope of architectuur. Status staat in [TAKEN.md](TAKEN.md), geschiedenis in [PROGRESS.md](PROGRESS.md),
|
|
> onbesliste punten in [OPEN.md](OPEN.md).
|
|
>
|
|
> Gepromoveerd uit `Masterplannen/` op 25-08-2026, toen de gebruiker besloot het pakket meteen te maken in
|
|
> plaats van te wachten op de proefopstelling.
|
|
|
|
## 1. Doel
|
|
|
|
Een tweede app in deze store: `whatsnext-evolu-relay/`, met een manifest en een compose, geïnstalleerd op
|
|
de Umbrel van de gebruiker, met Trezor Suite die erop synchroniseert.
|
|
|
|
## 2. Afbakening
|
|
|
|
Het pakket en de installatie: manifest, compose, het bouwrecept voor de image, en de controles op het
|
|
apparaat zelf.
|
|
|
|
De store zelf valt hier buiten: die bestaat en serveert Electrum Gate al. Wat erbij komt is één map.
|
|
|
|
## 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**.
|
|
- **Geen wijzigingen aan de relay zelf.** Wat Trezor levert, draaien we.
|
|
- **Geen eigen statuspagina.** Zie [OPEN.md](OPEN.md) punt 2.
|
|
|
|
## 4. Ontwerp
|
|
|
|
Alles hieronder rust op [Upstream-evolu-relay.md](../../../Referenties/Upstream-evolu-relay.md), waar de
|
|
feiten met bron-URL per stuk staan. De vorm van een Umbrel-app staat in
|
|
[Umbrel-appstore-spec.md](../../../Referenties/Umbrel-appstore-spec.md).
|
|
|
|
### 4a. Drie containers, twee images
|
|
|
|
De relay en de quota-manager komen uit **dezelfde** image met een ander `command`: bovenstrooms is het één
|
|
codebase met meerdere startscripts. Daarnaast een Postgres. Dat is de hele stack.
|
|
|
|
Het `command` staat expliciet in de compose en leunt niet op de `CMD` van de Dockerfile: daar staat
|
|
`yarn start`, met bovenstrooms zelf een commentaar dat het misschien een van de twee specifieke scripts had
|
|
moeten zijn.
|
|
|
|
### 4b. De quota-manager gaat mee, en waarom dat geen keuze was
|
|
|
|
De relay weigert elke eigenaar die geen rij in de limietentabel heeft (`isOwnerAllowed()`), en de
|
|
quota-manager maakt die rijen. Er is **geen** HTTP-koppeling tussen de twee: geen URL in de configuratie,
|
|
ze delen alleen de database.
|
|
|
|
Dat laatste opent een tweede weg, die hier bewust niet gekozen is: de rij met de hand in de database
|
|
zetten en de quota-manager weglaten. Minder bewegende delen, maar het is schrijven in andermans schema en
|
|
dat breekt bij de eerste migratie. De container kost weinig; het risico van zelf in hun tabellen schrijven
|
|
is groter dan de winst.
|
|
|
|
### 4c. De app-proxy zonder inlog, en dat is het patroon en geen omweg
|
|
|
|
Trezor Suite is geen browser met een sessiecookie. Achter `app_proxy` met de standaardinstelling krijgt het
|
|
een inlogpagina in plaats van de relay.
|
|
|
|
De oplossing is `PROXY_AUTH_ADD: "false"`, met `port` in het manifest als de poort waar Suite naartoe
|
|
wijst. **Dat is niet zelfbedacht:** de eigen `nostr-relay`-app in de officiële store doet exact dit, om
|
|
precies dezelfde reden, en Gitea en Budibase doen het ook. Daarmee is de zwaarste ontwerpvraag van dit plan
|
|
beantwoord met een precedent in plaats van met een gok.
|
|
|
|
Het alternatief dat is afgevallen: een eigen `ports:` op de service, zoals Electrum Gate met 50022 doet.
|
|
Dat kan, maar het vraagt een tweede poort die op de host vrij moet zijn, terwijl de proxy-poort er al is.
|
|
|
|
**De prijs staat in de compose genoemd en hoort ook hier:** wie die poort kan bereiken, bereikt de relay
|
|
zonder aanmelding. Wat de schade beperkt is de weigering uit §4b. Dat is een reden om deze app niet zonder
|
|
meer naar het internet open te zetten, en het is de kern van het risico in **Publicatie-Relay**.
|
|
|
|
### 4d. De poort is 3851 en niet 4000
|
|
|
|
`port` in het manifest is de poort waarop umbrelOS de app aanbiedt. 4000 zou aansluiten op de eigen poort
|
|
van de relay, maar het is een veelgebruikte poort en een botsing op de host merk je pas als de app niet
|
|
start. Dat heeft bij Electrum Gate een dag gekost, met 50002 tegen Fulcrum. 3851 sluit aan op de 3850 van
|
|
die app.
|
|
|
|
### 4e. De database
|
|
|
|
Postgres onder `${APP_DATA_DIR}/data/postgres`, niet in een naamloos Docker-volume: dat is wat umbrelOS
|
|
bewaart en in de back-up meeneemt. Het wachtwoord komt uit `${APP_PASSWORD}`, per installatie afgeleid,
|
|
want deze repo is publiek.
|
|
|
|
`PGDATA` staat op een submap van de mount en niet op de wortel: Postgres weigert een datamap die al iets
|
|
anders bevat, en een mount kan een `lost+found` hebben.
|
|
|
|
De image is `postgres:17-alpine` en niet `postgres` kaal zoals bovenstrooms: dat laatste is `latest`, en
|
|
een grote-versiesprong migreert de datamap niet vanzelf. Dan start de database niet meer.
|
|
|
|
`backupIgnore` blijft leeg. Electrum Gate gebruikt dat veld wel, maar daar gaat het om een log en een
|
|
statusbestand; hier ís de database de waarde van de app.
|
|
|
|
### 4f. De image bouwen we zelf, en het recept staat in de repo
|
|
|
|
Trezor publiceert geen image: hun werkproces duwt naar een eigen Amazon ECR en op Docker Hub staat niets.
|
|
Er is dus een bouwstap, en die moet ergens.
|
|
|
|
**Niet in de app-map.** Dat is technisch mogelijk (`build:` in plaats van `image:`, en umbreld roept gewoon
|
|
`docker compose` aan), maar drie dingen maken het verkeerd, en het derde is fataal: de broncode zou in onze
|
|
repo moeten staan, de bouw duurt minuten tijdens het starten van de app, en **een `Dockerfile` staat niet in
|
|
de update-whitelist**, dus elke nieuwe versie zou een deïnstallatie plus herinstallatie vragen.
|
|
|
|
De gekozen vorm: `tools/evolu-relay/build.sh` haalt de broncode op een **vastgezette commit** en bouwt hun
|
|
Dockerfile. Het recept is versiebeheerd en na te lezen, de uitkomst staat in de Docker-opslag of later in
|
|
een register, en de compose verwijst alleen naar de tag. We bouwen niet hun Dockerfile na; wat wij
|
|
toevoegen is uitsluitend de pin.
|
|
|
|
Voorlopig blijft die tag lokaal, op verzoek van de gebruiker: dat is de kortste weg naar een installatie
|
|
die je kunt proberen. Compose haalt niets op zolang de image lokaal bestaat, dus dezelfde regel werkt later
|
|
ook als de tag naar een register wijst. Waar dat register komt te staan is [OPEN.md](OPEN.md) punt 1.
|
|
|
|
## 5. Raakvlakken
|
|
|
|
- **Proefopstelling** leverde alle feiten waarop §4 rust, en heeft nog twee open vragen die dit plan raken:
|
|
of Trezor Suite een eigen relay accepteert, en hoe je een eigenaar registreert.
|
|
- **Bereikbaarheid** begint waar dit plan ophoudt.
|
|
- **Publicatie-Relay** erft §4c als grootste review-risico, en §4f als grootste praktische eis.
|
|
- **Appstore** (Electrum Gate) leverde de les die §4d stuurt, en de ervaring dat een store-URL wisselen een
|
|
herinstallatie is.
|
|
|
|
## 6. Verificatie
|
|
|
|
Automatisch, en dat draait al: `tests/test_appstore_vorm.py` controleert voor élke app in deze repo dat het
|
|
`id` gelijk is aan de mapnaam, dat het store-voorvoegsel klopt, dat de manifestvelden in de voorgeschreven
|
|
volgorde staan, dat de `app_proxy` naar een bestaande service wijst en dat elke gemounte map in de repo
|
|
bestaat. Het pint niets af op digests; dat is bewust, zie de kop van dat bestand.
|
|
|
|
Op de Umbrel, en dat is waar dit plan om gaat:
|
|
|
|
1. de image bouwen met `tools/evolu-relay/build.sh`;
|
|
2. de app installeren en zien dat alle drie de containers blijven draaien. **De database is hier de
|
|
twijfel:** of het schema zichzelf aanmaakt is niet uitgezocht;
|
|
3. Trezor Suite naar `<umbrel>:3851` laten wijzen en een label synchroniseren. Dit is de enige controle die
|
|
telt, en hij kan mislukken op de registratie uit §4b zonder dat er iets mis is met het pakket;
|
|
4. de app stoppen en starten, en controleren dat de database het overleeft;
|
|
5. controleren dat het toevoegen van deze app Electrum Gate niet raakt.
|
|
|
|
Meld per controle of hij gedaan is, en meld ook expliciet welke niet.
|