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.
|