2026-08-25 17:18:22 +02:00
|
|
|
|
# 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.
|
2026-08-27 16:47:29 +02:00
|
|
|
|
>
|
|
|
|
|
|
> **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.
|
2026-08-25 17:18:22 +02:00
|
|
|
|
|
|
|
|
|
|
## Volgende stap
|
|
|
|
|
|
|
2026-08-28 10:44:31 +02:00
|
|
|
|
- [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
|
2026-08-28 13:38:18 +02:00
|
|
|
|
- [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
|
2026-08-28 13:08:31 +02:00
|
|
|
|
- [ ] **De leeskant nog meten.** Er is nooit een tweede werkende cliënt geweest, dus dat een ander apparaat
|
2026-08-28 13:38:18 +02:00
|
|
|
|
de labels terugkrijgt is niet gezien. **Dit is nu de belangrijkste openstaande controle van dit plan**,
|
|
|
|
|
|
en er is een tweede cliënt voor nodig die wél een sleutel kan afleiden: een tweede desktop met
|
|
|
|
|
|
dezelfde Trezor is de kortste weg. iOS valt af zolang het apparaat niet aan de telefoon kan.
|
2026-08-28 13:08:31 +02:00
|
|
|
|
**Eigenaar: gebruiker**
|
2026-08-28 11:02:51 +02:00
|
|
|
|
- [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
|
2026-08-27 16:56:06 +02:00
|
|
|
|
|
2026-08-28 11:02:51 +02:00
|
|
|
|
## Fase 5 - De verbouwing naar de kale relay
|
2026-08-27 16:56:06 +02:00
|
|
|
|
|
2026-08-28 13:08:31 +02:00
|
|
|
|
**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".
|
2026-08-27 16:56:06 +02:00
|
|
|
|
|
2026-08-28 11:12:41 +02:00
|
|
|
|
- [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
|
2026-08-28 11:02:51 +02:00
|
|
|
|
- [ ] **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
|
2026-08-28 11:12:41 +02:00
|
|
|
|
- [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
|
2026-08-28 11:22:32 +02:00
|
|
|
|
- [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**
|
2026-08-28 11:28:42 +02:00
|
|
|
|
- [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
|
2026-08-28 11:51:41 +02:00
|
|
|
|
- [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
|
2026-08-28 11:02:51 +02:00
|
|
|
|
- [ ] **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**
|
2026-08-25 17:18:22 +02:00
|
|
|
|
|
|
|
|
|
|
## 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
|
2026-08-28 11:13:37 +02:00
|
|
|
|
- [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
|
2026-08-25 17:18:22 +02:00
|
|
|
|
|
|
|
|
|
|
## 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
|
2026-08-25 18:37:18 +02:00
|
|
|
|
- [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
|
2026-08-25 17:18:22 +02:00
|
|
|
|
|
|
|
|
|
|
## 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**.
|
|
|
|
|
|
|
2026-08-25 18:37:18 +02:00
|
|
|
|
- [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
|
2026-08-25 17:18:22 +02:00
|
|
|
|
- [ ] **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
|