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
+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: