De app-map is niet langer de relay van Trezor met een Postgres en een quota-manager ernaast, maar de relay van Evolu met onze eigen allowlist eromheen. Drie containers werden relay, agent en nginx; het wachtwoord en de database zijn verdwenen. De poorten zijn omgedraaid en dat is de kern. Tot 0.0.2 hing de relay achter app_proxy en moest de inlog van umbrelOS dus uit, waardoor een statuspagina net zo onbeschermd zou zijn als de relay zelf. Nu hangt de pagina daar met de inlog aan, en publiceert de relay zijn eigen poort 3852 waar Zoraxy met TLS naartoe wijst. Dat is hetzelfde patroon als Electrum Gate met 50022. Niet 4000 op de host, want dat is een veelgebruikte poort en een botsing merk je pas als de app niet start. De agent beslist niets: hij leest wat het relay-proces heeft opgeschreven en legt opdrachten in een postbus die de relay zelf leegmaakt. Twee processen die in dezelfde allowlist schrijven is een wedloop die je een keer per jaar treft en dan niet kunt reproduceren. Hij weigert ook een tweede opdracht zolang de vorige er nog ligt, want overschrijven zou er stil een laten verdwijnen. De pagina volgt het ontwerpsysteem van Electrum Gate, zonder de Google Fonts-verwijzing daaruit: een app op een Umbrel hoort niet te wachten op een lettertype van buiten. Alles is met stringoptelling geschreven en zonder enig dollarteken, want umbreld haalt elke template door envsubst en zou een JavaScript-template-literal stilzwijgend leegmaken. De image is door de gebruiker gebouwd en geduwd; de compose is gepind op tag plus digest. Manifest naar 0.2.0, met een beschrijving en releaseNotes die kloppen met wat er nu draait in plaats van met het vorige pakket. Wat hier NIET mee bewezen is, en dat is meer dan gebruikelijk: de agent is alleen op syntaxis gecontroleerd, de pagina is nooit gerenderd, en of een opdracht van de pagina daadwerkelijk bij het relay-proces aankomt is niet gemeten. Dat kan alleen op het apparaat en staat als taak. Tests: alle vier groen (32, 54, 39 en 60 goed, 0 fout). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
161 lines
12 KiB
Markdown
161 lines
12 KiB
Markdown
# Taken - Umbrelapp
|
||
|
||
> **App: Evolu Relay.** Prioriteit: **A** | Afhankelijk van: –
|
||
>
|
||
> Actief sinds 25-08-2026. Gepromoveerd uit `Masterplannen/` omdat de gebruiker besloot het pakket meteen te
|
||
> maken. De afhankelijkheid op **Proefopstelling** is daarmee geen blokkade meer maar een parallelle bron:
|
||
> fase 1 daarvan is af en leverde de feiten waarop dit pakket rust. Wat er nog uit moet komen zijn twee
|
||
> vragen die pas bij het installeren pijn doen, en die staan hieronder als eigen taak.
|
||
>
|
||
> **Dit is de focus vanaf 27-08-2026, op verzoek van de gebruiker.** Het werk aan Electrum Gate is die dag
|
||
> afgerond tot en met de tweede indeling; het plan **Eigenimage** staat klaar maar ligt bewust stil. Twee
|
||
> feiten om mee te beginnen: **de app staat op dit moment uit** op de Umbrel, en hij is nog nooit met
|
||
> Trezor Suite verbonden geweest. "Gebouwd" is hier dus nog verder van "werkend" dan bij Gate.
|
||
|
||
## Volgende stap
|
||
|
||
- [x] **De kále Evolu-relay geprobeerd, en hij werkt (28-08-2026).** Trezor Suite op de desktop stuurde
|
||
elf labels naar `docker.io/evoluhq/relay:latest` en die kwamen aan: de database in het volume groeide
|
||
van 40960 naar 49152 bytes. **De protocolversie klopt**, en daarmee is de richting uit
|
||
[OPEN.md](OPEN.md) punt 6 gemeten in plaats van verwacht. Het protocol en alle metingen staan in
|
||
[PLAN.md](PLAN.md) §6a
|
||
- [ ] **De leeskant nog meten.** Er is geen tweede cliënt geweest, dus dat een ander apparaat die labels
|
||
terugkrijgt is niet gezien. **Eigenaar: gebruiker**
|
||
- [ ] **Uitzoeken waarom de iOS-app geen verbinding maakt.** Het veld voor de relay-URL bestaat daar,
|
||
valideert op `http(s)://` en onthoudt zijn waarde, maar er komt geen enkele poging aan op poort 4000.
|
||
Nu de desktop bewijst dat de relay in orde is, is dit een schone vraag geworden: het ligt aan de app
|
||
of aan het platform, niet aan ons. Zonder antwoord werkt de app alleen op de desktop, en dat scheelt
|
||
voor de waarde van dit hele plan
|
||
- [x] **Besloten wat er met het huidige pakket gebeurt (28-08-2026): het gaat eruit.** De relay van Trezor,
|
||
de quota-manager en de Postgres vervallen. Wat ervoor in de plaats komt staat in [PLAN.md](PLAN.md)
|
||
§4g en §4h
|
||
- [x] **De limiter gekozen (28-08-2026): weg 1, uitbreiden via `createRelay`.** Dat bleek veel kleiner dan
|
||
**Bereikbaarheid** §4b aannam: het zijn twee terugroepfuncties, `isOwnerAllowed` en
|
||
`isOwnerWithinQuota`, en Trezor doet zelf niets anders. De gebruiker breidde het ontwerp uit met een
|
||
schakelaar voor nieuwe eigenaars en met wissen per eigenaar. Zie [OPEN.md](OPEN.md) punt 8
|
||
- [x] **De vraag of het databaseschema zichzelf aanmaakt is vervallen.** Hij ging over het pakket dat eruit
|
||
gaat, en de kale relay maakt zijn database bij de start zelf aan; dat is op 28-08-2026 gezien
|
||
|
||
## Fase 5 - De verbouwing naar de kale relay
|
||
|
||
Nog niets van begonnen. De volgorde is bewust: eerst het programma dat de limiter draagt, dan de app
|
||
eromheen, want de compose hangt af van wat dat programma nodig heeft.
|
||
|
||
- [x] **Het eigen relay-programma geschreven (28-08-2026).** `tools/evolu-relay/src/`: `policy.js` met het
|
||
beleid als pure functies, `store.js` voor de staat op schijf, en `index.js` dat `createRelay`
|
||
aanroept met de opstartvolgorde van Evolu zelf. Met test: `node tests/test_limiter.mjs`, 60 toetsen,
|
||
en de beslissende regel is muteertest gedaan
|
||
- [x] **Een getal gekozen voor `isOwnerWithinQuota`: 1 MB per schrijfactie**, instelbaar met
|
||
`RELAY_MAX_WRITE_BYTES`. Onderweg bleek de aanname hieronder fout: die 1 MB van de gepubliceerde image
|
||
is **per schrijfactie** en geen totaal per eigenaar. Er valt dus geen labelgeschiedenis tegenaan te
|
||
lopen. Een totaal per eigenaar zou vragen dat we in de opslag van de relay kijken, en dat doen we niet
|
||
- [x] **De allowlist als staat onder `${APP_DATA_DIR}/data/`**, naast de relay-database en niet erin:
|
||
`owners.json`, atomair geschreven, en `command.json` als postbus voor de pagina
|
||
- [ ] **Data per eigenaar wissen.** Nog niet gebouwd, en bewust niet gegokt: het beleid kan een eigenaar
|
||
vergeten en blokkeren, maar zijn berichten staan in de SQLite van de relay
|
||
(`evolu_message`, `evolu_history`, met `ownerId` als systeemkolom). Dat is schrijven in andermans
|
||
schema, dus dat wil eerst nagekeken worden in `createRelaySqliteStorage` van Evolu
|
||
- [ ] **Een `package-lock.json` maken en `npm install` in de Dockerfile omzetten naar `npm ci`.** De twee
|
||
pakketten van Evolu staan exact vast, maar wat eronder hangt beweegt nu nog mee. `build.sh` waarschuwt
|
||
hiervoor. Kan pas op een machine met netwerk en npm
|
||
- [ ] **Wissen per eigenaar laten doen door het relay-proces zelf**, aangestuurd met een vlagbestand vanaf
|
||
de pagina. Geen tweede container die langszij in de SQLite schrijft, en geen Docker-socket
|
||
- [x] **`tools/evolu-relay/build.sh` omgeschreven (28-08-2026):** bouwt de eigen `Dockerfile` in plaats van
|
||
de repo van Trezor te klonen. Git is niet meer nodig, de pin zit nu in `package.json`, en `VERSION`
|
||
in het script hoort gelijk te zijn aan `version` in het manifest
|
||
- [x] **De compose omgezet (28-08-2026):** pagina achter `app_proxy` mét de inlog, relay op host-poort
|
||
3852. Postgres, wachtwoord en quota-manager eruit; drie containers werden relay, agent en nginx. De
|
||
image is gepind op tag plus digest
|
||
- [x] **De statuspagina gebouwd (28-08-2026):** `index.html.template`, `nginx.conf.template` en
|
||
`agent.py.template`, met het ontwerpsysteem van Electrum Gate en zonder de Google Fonts-verwijzing.
|
||
Toont of de relay draait, de omvang en het laatste schrijfmoment van de database, het adres dat je in
|
||
Suite invult, en de eigenaars in drie lijsten met knoppen om te blokkeren, alsnog toe te laten of te
|
||
vergeten. **Nog nooit in een browser gezien**
|
||
- [ ] **De pagina en de agent op het apparaat verifiëren.** Alles hierboven is ongetest gedrag: de agent is
|
||
alleen op syntaxis gecontroleerd, de pagina is nooit gerenderd, en of de opdrachten daadwerkelijk bij
|
||
het relay-proces aankomen is niet gemeten. **Eigenaar: gebruiker**
|
||
- [ ] **De app opnieuw installeren in plaats van updaten.** De gebruiker heeft de oude installatie op
|
||
28-08-2026 weggehaald; dat is ook de nette weg, want niet elk bestand bereikt een bestaande
|
||
installatie via een update
|
||
- [ ] **Zoraxy inrichten** op het eigen subdomein met TLS, doorverwijzend naar de relay-poort, met de
|
||
WebSocket-upgrade aan. Testen met de handshake-curl uit [PLAN.md](PLAN.md) §6a stap 3, met de
|
||
publieke naam in plaats van het IP. **Eigenaar: gebruiker**
|
||
|
||
## Fase 1 - De app-map
|
||
|
||
- [x] **`whatsnext-evolu-relay/` aangemaakt met `umbrel-app.yml` en `docker-compose.yml` (25-08-2026).**
|
||
Mapnaam gelijk aan het `id`, met het store-voorvoegsel `whatsnext-`, en de manifestvelden in de
|
||
voorgeschreven volgorde
|
||
- [x] `data/postgres/.gitkeep` erin, zodat de mount bij de eerste start niet als root wordt aangemaakt
|
||
- [x] **`dependencies` weggelaten en niet leeg gezet.** Deze app hangt van geen enkele andere app af; een
|
||
leeg veld zou suggereren dat er iets te kiezen valt
|
||
- [x] **Een eigen icoon (28-08-2026).** `icon.png` aangeleverd door de gebruiker, met de `icon`-regel in
|
||
het manifest die naar de rauwe versie in deze repo wijst. Als laatste regel, want bij inlevering in
|
||
de officiële store hoort hij weg
|
||
|
||
## Fase 2 - De compose
|
||
|
||
- [x] **`app_proxy` met `PROXY_AUTH_ADD: "false"`, en geen eigen `ports:`.** Trezor Suite is geen browser
|
||
met een sessiecookie. Dit is het patroon van de eigen `nostr-relay`-app van Umbrel, dus een precedent
|
||
en geen omweg; zie [PLAN.md](PLAN.md) §4c
|
||
- [x] **Relay en quota-manager uit één image met een ander `command`.** Expliciet en niet leunend op de
|
||
`CMD` van de Dockerfile, want daar staat `yarn start` met bovenstrooms zelf een twijfel erbij
|
||
- [x] **De quota-manager gaat mee.** Niet omdat de relay hem aanroept, maar omdat de relay elke eigenaar
|
||
zonder limietenrij weigert en dit is wat die rijen maakt
|
||
- [x] **Postgres onder `${APP_DATA_DIR}/data/postgres`**, wachtwoord uit `${APP_PASSWORD}`, `PGDATA` op een
|
||
submap, en `postgres:17-alpine` in plaats van `postgres` kaal
|
||
- [x] **Healthcheck op de eigen database en gebruiker**, niet op `-d postgres` zoals bovenstrooms: die
|
||
database bestaat hier niet, en dan is de controle groen op het verkeerde antwoord
|
||
- [x] **De eigen image gepind op tag plus digest (25-08-2026).**
|
||
`sc.kamenier-hamer.nl/sysop/evolu-relay:c03a204@sha256:2fe1e9e9…`, op beide services. Dat moest wel:
|
||
zie fase 4. **Let op dat dit één architectuur is** (amd64), want er is alleen amd64 geduwd. Voor de
|
||
officiele store hoort er een multi-arch index-digest met arm64 in; dat staat bij **Publicatie-Relay**
|
||
- [ ] **`postgres:17-alpine` pinnen op de multi-arch index-digest.** Kan meteen, met
|
||
`docker buildx imagetools inspect`, en het is het laatste ongepinde in deze app. Staat als TODO in de
|
||
compose
|
||
|
||
## Fase 3 - Het bouwrecept
|
||
|
||
- [x] **`tools/evolu-relay/build.sh` (25-08-2026).** Haalt de broncode op een vastgezette commit en bouwt
|
||
de Dockerfile van Trezor. Niet hun bouwstappen nabouwen; wat wij toevoegen is de pin
|
||
- [x] **Niet in de app-map gezet, en dat is geen netheid.** Een `Dockerfile` staat niet in de
|
||
update-whitelist, dus bouwen-in-de-app zou elke nieuwe versie een herinstallatie kosten. Zie
|
||
[PLAN.md](PLAN.md) §4f
|
||
- [x] **Onder `tools/` en niet onder `build/`:** dat laatste staat in `.gitignore` als bouwselmap, dus het
|
||
recept zou stilzwijgend buiten de repo blijven. Gevonden bij het stagen, niet bij het schrijven
|
||
- [x] Het script controleert na het ophalen dat de commit is wat hij verwachtte, en faalt hard als dat niet
|
||
zo is. Zonder die regel bouwt het stil de verkeerde toestand
|
||
|
||
## Fase 4 - Installeren en verifiëren op de Umbrel
|
||
|
||
Niets hiervan is op een laptop te doen. Eigenaar van deze hele fase: **gebruiker**.
|
||
|
||
- [x] **De image gebouwd op de Umbrel (25-08-2026), in 50 seconden.** Twee dingen die het opleverde: de
|
||
gebruiker `umbrel` zit hier níet in de groep `docker`, dus het moet met `sudo`; en de Dockerfile van
|
||
Trezor bouwt zonder aanpassing
|
||
- [x] **In een register gezet, want anders kan umbreld er niet bij (25-08-2026).** Dit was de grote
|
||
verrassing van de dag en het staat met bron in
|
||
[Umbrel-appstore-spec.md](../../../Referenties/Umbrel-appstore-spec.md): umbreld haalt élke image via
|
||
de Docker Engine API op, niet via compose. Een lokaal gebouwde tag is dus onbereikbaar en
|
||
`pull_policy: never` doet niets, want de compose wordt niet gelezen om te pullen. Het Gitea-register op
|
||
dezelfde server als de store bleek de kortste weg, en anoniem halen werkt daar
|
||
- [x] **De app geïnstalleerd en alle drie de containers blijven draaien (25-08-2026).** `relay`,
|
||
`quota-manager` en `db`, met `db` op healthy en de app-proxy op 3851. De lokale images waren vooraf
|
||
weggehaald, dus de pull uit het register is echt gedaan en het hele pad is bewezen: broncode →
|
||
bouwrecept → register → gepinde digest → installatie
|
||
- [ ] **Gecontroleerd of het databaseschema zichzelf aanmaakt.** Niet uitgezocht, en dit is de eerste
|
||
plek waar het misgaat als het antwoord nee is. Kijk in de logs van de relay-container
|
||
- [ ] Trezor Suite naar `<umbrel>:3851` laten wijzen en een label synchroniseren. **Dit is de enige
|
||
controle die telt**, en hij kan mislukken op de eigenaarsregistratie zonder dat er iets mis is met het
|
||
pakket
|
||
- [ ] De app gestopt en gestart, en de database heeft het overleefd
|
||
- [ ] Gecontroleerd dat het toevoegen van deze app Electrum Gate niet raakt
|
||
|
||
## Geblokkeerd / wacht op
|
||
|
||
- [ ] **Hoe registreer je een eigenaar bij de quota-manager?** Zonder antwoord kan er niet gesynchroniseerd
|
||
worden, ook al draait alles. Wacht op **Proefopstelling** fase 1; begin bij `bruno-collection/` in de
|
||
bovenstroomse repo
|
||
- [ ] **Accepteert Trezor Suite dit adres, en in welke vorm?** Wacht op **Proefopstelling**, "Volgende
|
||
stap". Als het antwoord nee is, is dit pakket zonder waarde
|