De gebruiker gaat er eerst mee werken en komt dan met wat er beter moet. Tot die lijst er is, is dit geen werk: de pagina doet wat hij moet doen, en een gevoel is geen taak. Met de volgorde erbij, want die is niet vrijblijvend: verbeteren gaat voor het in een image stoppen. Zolang de pagina een template is, bereikt elke wijziging een installatie met een push en een versieverhoging; in een image kost elke tweak een bouw, een push naar het register en een nieuwe digest. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
196 lines
15 KiB
Markdown
196 lines
15 KiB
Markdown
# Taken - Umbrelapp
|
||
|
||
> **App: Evolu Relay.** Prioriteit: **B** | Afhankelijk van: –
|
||
>
|
||
> Van A naar B op 28-08-2026: het doel van dit plan is gehaald en het restwerk wacht nergens op.
|
||
>
|
||
> 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
|
||
- [x] **Uitgezocht waarom iOS niets doet (28-08-2026): het ligt aan het apparaat en niet aan dit pakket.**
|
||
De `OwnerId` wordt op de Trezor afgeleid, en het model van de gebruiker kan nog niet aan een iPhone
|
||
gekoppeld worden. Zonder apparaat kent de app geen `deviceStaticSessionId`, en dan slaat Suite een
|
||
label lokaal op en doet verder niets, zonder melding. De hele redenering met bronregels staat in
|
||
[OPEN.md](OPEN.md) punt 9
|
||
- [x] **De leeskant gemeten en in orde (28-08-2026).** Getest met een tweede gebruikersaccount op dezelfde
|
||
Mac, en dat is schoner dan een tweede apparaat: die installatie heeft een **lege** lokale
|
||
Evolu-database, dus alles wat daar verschijnt kan alleen van de relay komen. Dezelfde Trezor en
|
||
dezelfde wallet, dus dezelfde `OwnerId` en geen nieuwe eigenaar. De labels kwamen door. Daarmee zijn
|
||
beide richtingen bewezen
|
||
- [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
|
||
|
||
**Op 28-08-2026 in één sessie gedaan en op het apparaat draaiend, versie 0.3.0.** Wat er staat: het eigen
|
||
relay-programma met de allowlist, het bouwrecept, de compose met de omgedraaide poorten, de statuspagina, en
|
||
TLS via Zoraxy op een eigen subdomein. De Mac synchroniseert eroverheen, met een geleerde eigenaar en een
|
||
gesloten deur erna.
|
||
|
||
Wat er niet staat: iOS doet niets mee, en daardoor is de leeskant nooit gemeten. Beide staan hierboven bij
|
||
"Volgende stap".
|
||
|
||
- [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**
|
||
- [x] **Het relay-programma op het apparaat geverifieerd (28-08-2026).** Losgedraaid uit het register,
|
||
buiten de app om. Het log meldde `learned a new owner`, en in `/app/data` stonden daarna
|
||
`evolu-relay.db` van 49152 bytes (dezelfde omvang als bij de proef van vanochtend, dus de labels zijn
|
||
geland) en `owners.json` van 241 bytes. Daarmee is de hele keten gemeten: `isOwnerAllowed` wordt
|
||
aangeroepen met iets wat het beleid begrijpt, de leerstand werkt, en de allowlist gaat naar schijf
|
||
- [x] **De pagina en de agent op het apparaat geverifieerd (28-08-2026).** De pagina rendert, toont de
|
||
gegevens van de relay, en de knop **Close** werkt: de leerstand ging naar `closed` en de geleerde
|
||
eigenaar staat in de lijst met eerste en laatste verschijning. Daarmee is de hele keten gemeten,
|
||
pagina → agent → postbus → relay-proces → schijf → pagina
|
||
- [x] **De fout die dat opleverde is gerepareerd:** de korte containernaam `agent` is op het gedeelde
|
||
Docker-netwerk niet uniek, dus de helft van de verzoeken kwam bij Electrum Gate uit. Beide apps
|
||
wijzen nu naar `<app-id>_agent_1`, en `test_appstore_vorm.py` toetst dat voortaan
|
||
- [x] **De app opnieuw geïnstalleerd in plaats van geüpdatet (28-08-2026).** De oude installatie was er
|
||
eerst afgehaald, en dat was ook de nette weg: niet elk bestand bereikt een bestaande installatie via
|
||
een update
|
||
- [x] **Zoraxy ingericht (28-08-2026)** op een eigen subdomein met TLS, doorverwijzend naar de relay-poort,
|
||
met de WebSocket-upgrade aan. De handshake-curl uit [PLAN.md](PLAN.md) §6a stap 3 geeft daar
|
||
`101 Switching Protocols`, en de desktop synchroniseert eroverheen
|
||
|
||
## 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**
|
||
- [x] **De Postgres-pin is vervallen (28-08-2026):** die database zit niet meer in de app
|
||
- [ ] **De statuspagina verbeteren, op een lijst van de gebruiker.** Hij gaat er eerst mee werken en komt
|
||
dan met wat er beter moet (28-08-2026). Tot die lijst er is, is dit géén werk: de pagina doet wat hij
|
||
moet doen. **Doe dit vóór het plan Eigenimage voor deze app**, want zolang de pagina een `*.template`
|
||
is bereikt elke wijziging een installatie met een push plus versieverhoging; zit hij eenmaal in een
|
||
image, dan kost elke tweak een bouw en een digest. **Eigenaar: gebruiker levert de lijst**
|
||
- [ ] **`python:3-alpine` en `nginx:alpine` pinnen op hun multi-arch index-digest.** Dat zijn de twee laatste
|
||
ongepinde images van deze app, en ze staan als TODO in de compose. Met
|
||
`docker buildx imagetools inspect` op de Umbrel. Electrum Gate heeft precies dezelfde twee openstaan,
|
||
dus dit is één handeling voor beide apps
|
||
|
||
## 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
|
||
- [x] **De schemavraag is vervallen (28-08-2026):** de kale relay maakt zijn SQLite bij de start zelf aan,
|
||
en de Postgres waar deze vraag over ging zit niet meer in de app
|
||
- [x] **Trezor Suite synchroniseert (28-08-2026), heen én terug.** Niet naar 3851 zoals hier stond maar naar
|
||
3852: de poorten zijn omgedraaid, want 3851 draagt nu de statuspagina. Zie de "Volgende stap"
|
||
hierboven
|
||
- [ ] De app gestopt en gestart, en de data heeft het overleefd. **Nog niet gedaan**, en het is de laatste
|
||
controle van dit plan die er echt toe doet: de allowlist en de labels staan onder
|
||
`${APP_DATA_DIR}/data/relay`, dus een herstart hoort niets te kosten. **Eigenaar: gebruiker**
|
||
- [x] **Gecontroleerd of het toevoegen van deze app Electrum Gate raakt (28-08-2026), en dat deed het.**
|
||
Niet zoals verwacht via poorten of geheugen, maar via een naam: beide apps hadden een service `agent`
|
||
op hetzelfde Docker-netwerk, en Docker verdeelde de naam over allebei. De pagina van Gate ging daardoor
|
||
stuk. Gerepareerd in beide apps, met een toets in `test_appstore_vorm.py` zodat het niet stil
|
||
terugkomt
|
||
|
||
## Geblokkeerd / wacht op
|
||
|
||
**Leeg sinds 28-08-2026.** Beide blokkades zijn opgeheven en ze staan hier voor de geschiedenis.
|
||
|
||
- [x] **"Hoe registreer je een eigenaar bij de quota-manager?"** is vervallen: de quota-manager zit niet
|
||
meer in de app, en de kale relay kent geen limietentabel. De vraag bestond alleen bij het pakket van
|
||
Trezor
|
||
- [x] **"Accepteert Trezor Suite dit adres, en in welke vorm?"** is beantwoord: ja, met `http(s)://` en
|
||
desgewenst een pad, zowel via het dev-utils-veld als via de gewone "Custom server"-instelling. Gemeten
|
||
op de desktop, heen en terug
|