Het ontwerp van de limiter en de pagina, en de limiter is klein

createRelay uit @evolu/nodejs neemt twee terugroepfuncties, isOwnerAllowed en
isOwnerWithinQuota, en Trezor doet in createEvoluRelay.ts zelf niets anders. Hun
hele quota-manager met Postgres bestaat alleen om de tabel te vullen die die twee
raadplegen. Wij vullen ze met eigen logica en bouwen niets na. Weg 1 uit
Bereikbaarheid 4b is daarmee veel goedkoper dan daar aangenomen, en dat is wat de
keuze van de gebruiker mogelijk maakt.

De logica zoals hij hem formuleerde: de eerste eigenaar die zich meldt wint, een
schakelaar bepaalt of er nog nieuwe bij mogen, en data is per eigenaar te wissen.
Dat laatste doet het relay-proces zelf, aangestuurd met een vlagbestand vanaf de
pagina; geen tweede container die langszij in de SQLite schrijft en geen
Docker-socket.

Twee feiten uit de broncode van Evolu die het ontwerp sturen en die in de naslag
staan met bron. De gepubliceerde image zet isOwnerWithinQuota op 1 MB per eigenaar
en laat isOwnerAllowed weg, dus een kale relay is niet volledig ongelimiteerd,
maar dat plafond geldt ook voor de echte gebruiker. En de relay-URL van de client
bevat een pad dat letterlijk wordt overgenomen, wat een goedkope proxy-controle
mogelijk maakt; die is bewust niet genomen nu de allowlist er komt.

De poorten gaan om: pagina achter app_proxy met de inlog aan, relay op een eigen
gepubliceerde poort waar Zoraxy met TLS naartoe wijst. Dat lost open punt 2 op
zonder het bezwaar dat daar stond, en het volgt het patroon dat Electrum Gate in
deze repo al gebruikt. De pagina volgt hetzelfde ontwerpsysteem, zonder de Google
Fonts-verwijzing eruit.

Open punt 8 en 2 zijn beslist, fase 5 staat als takenlijst. De gebruiker heeft de
oude installatie van de Umbrel gehaald; er wordt niet geupdatet maar opnieuw
gebouwd.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Harmen
2026-08-28 11:02:51 +02:00
co-authored by Claude Opus 5
parent 6b114475d5
commit edb91c4749
5 changed files with 198 additions and 21 deletions
+25 -2
View File
@@ -82,13 +82,32 @@
proxy met een eigen domein is wat Electrum Gate al doet. Beide veranderen dit van "een vlag omzetten" in
een eigen ontwerpvraag.
**Richting van de gebruiker, 28-08-2026:** een certificaat op een eigen subdomein, en Zoraxy dat die
naam doorzet naar de relay op de interne poort. Dat is dezelfde weg die Electrum Gate al gebruikt, dus
het is bekend terrein en geen nieuw bouwwerk. Twee dingen die daarbij vastliggen:
- **Zoraxy moet de WebSocket-upgrade doorlaten.** Dit is geen gewone HTTP-site; alles loopt over één
opgewaardeerde verbinding, en bij de meeste reverse proxies is dat een schakelaar per host. Staat die
uit, dan lijkt het beeld op dat van vanochtend: een server die leeft en een cliënt die niets doet. De
handshake-curl uit [PLAN.md](PLAN.md) §6a stap 3 is dan de test, met de publieke naam in plaats van
het IP;
- **TLS lost punt 8 niet op, het maakt het dringender.** Een certificaat regelt versleuteling en
waarschijnlijk iOS, maar niet wie er mag schrijven. Achter een publieke naam is de kale relay vanaf
het internet bereikbaar zonder enige toegangscontrole. De kale relay op een LAN is iets anders dan de
kale relay op een publiek subdomein.
**Goedkoopste volgende meting, en die kost niets:** op de telefoon controleren of de synchronisatie
überhaupt aangaat en of het apparaat om een bevestiging vraagt. Is het antwoord nee, dan is TLS niet de
verdachte en zou een certificaat niets opgelost hebben.
**Moment:** nadat de verbouwing staat; de desktop werkt en dat is genoeg om verder te bouwen ·
**Eigenaar:** gebruiker
8. **Welke limiter komt er op de kale relay?**
8. **Welke limiter komt er op de kale relay?** - **beslist op 28-08-2026: weg 1, de relay uitbreiden via
`createRelay`.** Het ontwerp staat in [PLAN.md](PLAN.md) §4g en bleek veel kleiner dan hieronder
aangenomen: het zijn twee terugroepfuncties en geen eigen relay. De gebruiker breidde het uit met een
schakelaar voor nieuwe eigenaars en het wissen van data per eigenaar. Het geheime pad uit de vierde weg
is bewust niet genomen. De rest van dit punt blijft staan als onderbouwing tot de verbouwing er is.
Nieuw op 27-08-2026, uit de richting in punt 6. Dit is de vraag die met "kaal gaan" meekomt en die je
niet kunt uitstellen tot na de verbouwing, want hij bepaalt of er een eigen image nodig blijft.
@@ -134,7 +153,11 @@
**Moment:** als fase 4 helemaal af is, dus als bewezen is dat er iets te delen valt · **Eigenaar:**
gebruiker
2. **Komt er een statuspagina?**
2. **Komt er een statuspagina?** - **beslist op 28-08-2026: ja, en achter de umbrelOS-inlog.** De
poortindeling gaat om: de pagina komt op de app-proxy mét inlog, de relay op een eigen gepubliceerde
poort waar Zoraxy naartoe wijst. Daarmee vervalt het bezwaar hieronder, want de pagina ligt dan wél
achter een grens. Zie [PLAN.md](PLAN.md) §4h.
Electrum Gate heeft er een en die bleek in de praktijk het nuttigste deel van die app. Hier zou dat
kunnen: draait de relay, hoe groot is de database, wanneer was de laatste synchronisatie, en is er een
eigenaar geregistreerd. Dat laatste is meer dan gemak, want het is precies waar het stil kan misgaan.
+70
View File
@@ -33,6 +33,12 @@ Alles hieronder rust op [Upstream-evolu-relay.md](../../../Referenties/Upstream-
feiten met bron-URL per stuk staan. De vorm van een Umbrel-app staat in
[Umbrel-appstore-spec.md](../../../Referenties/Umbrel-appstore-spec.md).
> **Let op de tweedeling in deze paragraaf.** §4a tot en met §4f beschrijven het pakket **zoals het op
> 25-08-2026 gebouwd is**, met de relay van Trezor, een Postgres en de quota-manager. Dat pakket gaat eruit:
> de proef van 28-08 (§6a) bewees dat de kale Evolu-relay werkt, en §4g en §4h beschrijven wat ervoor in de
> plaats komt. De oude paragrafen blijven staan tot de verbouwing gedaan is, want ze leggen uit waaróm er
> iets weggaat; daarna verdwijnen ze.
### 4a. Drie containers, twee images
De relay en de quota-manager komen uit **dezelfde** image met een ander `command`: bovenstrooms is het één
@@ -111,6 +117,70 @@ Voorlopig blijft die tag lokaal, op verzoek van de gebruiker: dat is de kortste
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.
### 4g. De limiter is niet een eigen relay maar twee functies
Beslist op 28-08-2026 door de gebruiker, na de geslaagde proef. De feiten met bron staan in
[Upstream-evolu-relay.md](../../../Referenties/Upstream-evolu-relay.md) §8.
`createRelay` uit `@evolu/nodejs` neemt twee terugroepfuncties: `isOwnerAllowed(ownerId)` en
`isOwnerWithinQuota(ownerId, requiredBytes)`. **Trezor doet precies dit en niets meer**; hun hele
quota-manager met Postgres bestaat alleen om de tabel te vullen die die twee functies raadplegen. Wij
vullen ze met eigen logica en houden verder alles van bovenstrooms. Er wordt dus **geen relay nagebouwd en
niets van Evolu aangepast**.
De logica die erin komt, zoals de gebruiker hem formuleerde:
- **de eerste eigenaar die zich meldt, wordt de eigenaar.** Geen id intikken, want Suite toont je `OwnerId`
nergens;
- **een schakelaar die bepaalt of er nog nieuwe eigenaars bij mogen.** Dit is wat de leer-variant bruikbaar
maakt in een huishouden: openzetten, tweede apparaat koppelen, weer dichtzetten;
- **data per eigenaar wissen**, zodat een verkeerd geleerde eigenaar geen herinstallatie kost.
**De prijs die we hiermee accepteren:** de bouwstap en het eigen register komen terug, want dit vraagt een
eigen image. Wat níet terugkomt is de Postgres, het wachtwoord en het onderhoud aan andermans schema. Het
bouwrecept in `tools/evolu-relay/` blijft dus bestaan, maar het bouwt straks niet meer de repo van Trezor;
het bouwt een klein eigen programma tegen `@evolu/nodejs`.
**Twee dingen om niet over te slaan.** De gepubliceerde image zet `isOwnerWithinQuota` op **1 MB per
eigenaar** en laat `isOwnerAllowed` weg. Nemen wij die grens over zonder erbij na te denken, dan stopt het
synchroniseren zodra de labelgeschiedenis daar tegenaan loopt, en dat merk je pas als het gebeurt. En de
allowlist is **staat**: die hoort onder `${APP_DATA_DIR}/data/`, naast de relay-database en niet erin.
**Wat er bewust níet in gaat: een geheim pad in de URL.** De cliënt neemt een pad in de relay-URL letterlijk
over, dus Zoraxy had alleen een onraadbaar pad kunnen doorlaten. Dat is een laag vóór de relay in plaats van
erin, en het is met één proxyregel alsnog toe te voegen. De gebruiker ziet er geen reden voor nu de
allowlist er komt, en dat klopt: het beschermt tegen hetzelfde, alleen eerder in de keten.
### 4h. De poorten omgedraaid: pagina achter de inlog, relay ernaast
Beslist op 28-08-2026, en het draait §4c om. Daar stond de relay achter de app-proxy met de inlog uit, en
dat maakte een statuspagina onmogelijk zonder die pagina net zo bloot te leggen.
De nieuwe indeling volgt het patroon dat Electrum Gate in deze repo al gebruikt:
- **de pagina achter `app_proxy`, met de umbrelOS-inlog gewoon aan.** Dat is de app-tegel op het dashboard;
- **de relay op een eigen `ports:`-regel**, waar Zoraxy met TLS op een eigen subdomein naartoe wijst.
Suite ziet daarmee nooit een inlogpagina en de pagina is nooit onbeschermd. Dat lost open punt 2 op zonder
de tweede poort die daar als bezwaar stond, want die tweede poort is er toch al.
**Zoraxy moet de WebSocket-upgrade doorlaten**, anders lijkt het beeld op dat van 28-08: een server die
leeft en een cliënt die niets doet. De handshake-curl uit §6a stap 3 is de test.
**De pagina volgt hetzelfde ontwerpsysteem als Electrum Gate**, aangewezen door de gebruiker op
28-08-2026: `HomeGit/Docs/website-design-system.html`. Dat is geen kwestie van smaak maar van herkenning,
want de twee apps staan straks naast elkaar op hetzelfde dashboard. Electrum Gate neemt die tokens
letterlijk over (`data-theme` maal `data-accent`, dezelfde accentkleur) en dat is het vertrekpunt. **Eén
ding niet overnemen uit het bronbestand: de verwijzing naar Google Fonts.** De pagina van Electrum Gate
heeft die bewust niet, en een app op een Umbrel hoort niet stuk te gaan of te vertragen op een lettertype
dat van buiten moet komen.
**De pagina praat niet met Docker.** Dezelfde regel als bij Electrum Gate: geen socket. De pagina en het
relay-proces delen een map onder `${APP_DATA_DIR}/data/`, en een knop op de pagina zet daar een vlagbestand
neer dat het relay-proces oppakt. Dat geldt zowel voor de schakelaar als voor het wissen: het wissen raakt
de SQLite van de relay, en dat hoort het proces te doen dat die database bezit, niet een tweede container
die er langszij in schrijft.
## 5. Raakvlakken
- **Proefopstelling** leverde alle feiten waarop §4 rust, en heeft nog twee open vragen die dit plan raken:
@@ -20,7 +20,13 @@ daar wel, valideert op `http(s)://` en onthoudt zijn waarde, maar de app doet ge
verbindingspoging. Het vermoeden is TLS; dat is niet gemeten en het is duur, want een certificaat voor een
LAN-adres bestaat niet.
**Geraakt:** alleen documentatie van dit plan. **Tests:** niet van toepassing.
**Het ontwerp van de limiter en de pagina staat er ook**, en de limiter bleek veel kleiner dan
**Bereikbaarheid** §4b aannam: `createRelay` neemt twee terugroepfuncties, en Trezor doet zelf niets
anders. De poorten gaan om, zodat de pagina achter de umbrelOS-inlog kan en Zoraxy met TLS naar de relay
wijst. De gebruiker heeft de oude installatie weggehaald; die wordt niet geüpdatet maar opnieuw gebouwd.
**Geraakt:** documentatie van dit plan plus `Referenties/Upstream-evolu-relay.md` §8. **Tests:** niet van
toepassing.
## 27-08-2026 - richting gekozen: kaal, met een limiter en een pagina erop
+37 -18
View File
@@ -26,27 +26,46 @@
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
- [ ] **Pas daarna beslissen wat er met het huidige pakket gebeurt.** Werkt de kale relay, dan wordt dit
één container op een gepubliceerde image en vervallen de Postgres en het wachtwoord. Werkt hij niet,
dan is de limietenrij met de hand zetten de enige weg vooruit
- [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
**De richting is al gekozen op 27-08-2026: kaal, met een eigen limiter erop en de statuspagina
erbij.** Zie [OPEN.md](OPEN.md) punt 6, 8 en 2. Wat daarbij vastligt en makkelijk verkeerd onthouden
wordt: de kale relay heeft géén toegangscontrole, dus de limiter is geen extraatje maar de vervanging
van de enige bescherming die er vandaag is. En de quota-manager die er nu in zit is daarvoor niet te
hergebruiken: die schrijft in Trezor's limietentabel, en die tabel bestaat straks niet meer
## Fase 5 - De verbouwing naar de kale relay
**Een eigen image blijft daardoor waarschijnlijk nodig**, want de meest voor de hand liggende limiter
breidt de relay uit via `createRelay`. Dat is geen obstakel: de gebruiker meldde op 27-08-2026 dat de
broncode nog op zijn Umbrel staat, dus opnieuw bouwen en naar het eigen Gitea-register duwen kan
gewoon. De bouwstap en het register vervallen dus mogelijk tóch niet; de Postgres en het wachtwoord
wel
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.
- [ ] **De limiter kiezen uit de drie wegen van Bereikbaarheid §4b**, met de leer-variant erbij: de eerste
eigenaar die verbindt wordt toegelaten, de rest geweigerd, met een wisknop op de statuspagina. Zie
[OPEN.md](OPEN.md) punt 8. **Pas nadat de proef geslaagd is**
- [ ] **In de logs van de relay kijken of het databaseschema zichzelf aanmaakt.** Alleen nog nuttig als het
huidige pakket blijft: `sudo docker logs whatsnext-evolu-relay_relay_1`
- [ ] **Het eigen relay-programma schrijven.** Een klein Node-project dat `createRelay` uit `@evolu/nodejs`
aanroept met onze twee functies. Niets van Evolu aanpassen en niets nabouwen. Zie [PLAN.md](PLAN.md)
§4g en [Upstream-evolu-relay.md](../../../Referenties/Upstream-evolu-relay.md) §8
- [ ] **Bewust een getal kiezen voor `isOwnerWithinQuota`.** De gepubliceerde image staat op 1 MB per
eigenaar. Overnemen zonder nadenken betekent dat het synchroniseren stilvalt zodra de
labelgeschiedenis daar tegenaan loopt
- [ ] **De allowlist als staat onder `${APP_DATA_DIR}/data/`**, naast de relay-database en niet erin, met
een `.gitkeep` voor de map
- [ ] **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
- [ ] **`tools/evolu-relay/build.sh` omschrijven:** niet meer de repo van Trezor bouwen maar het eigen
programma. De pin blijft, en met de pin mee gaat `version` in het manifest omhoog
- [ ] **De compose omzetten:** pagina achter `app_proxy` met de inlog aan, relay op een eigen `ports:`.
Postgres, wachtwoord en quota-manager eruit. Zie [PLAN.md](PLAN.md) §4h
- [ ] **De statuspagina bouwen**, met de pagina en de agent van Electrum Gate als vertrekpunt en met
hetzelfde ontwerpsysteem (`HomeGit/Docs/website-design-system.html`), maar zonder de Google
Fonts-verwijzing daaruit. Toont of de relay draait, welke eigenaars bekend en toegelaten zijn, de
omvang van de database en het laatste schrijfmoment. Draagt de schakelaar voor nieuwe eigenaars en de
wisknop per eigenaar
- [ ] **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