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
+59
View File
@@ -69,6 +69,20 @@ klopt. Suite gebruikt `@evolu/web@3.0.0-next.1` **met een eigen patch** in `.yar
in minuten te weerleggen: `docker run --rm -p 4000:4000 docker.io/evoluhq/relay:latest`, Suite ernaartoe
wijzen, label maken.
**4. De relay-URL bevat een pad, en de cliënt gebruikt hem letterlijk.** Toegevoegd 28-08-2026 uit
`suite-common/suite-sync/src/relay/relayUrl.test.ts`. Hun eigen standaardwaarden zijn
`https://suite-sync.trezor.io/evolu/` en lokaal `http://127.0.0.1:4000/evolu/`: de relay van Trezor hangt
dus achter een pad, en een eigen URL wordt overgenomen zoals hij is. De kale Evolu-relay luistert op de
wortel; dat is gemeten met `http://10.0.0.11:4000` zonder pad.
**Dat opent een goedkope toegangscontrole die in geen van de drie wegen van Bereikbaarheid §4b stond:** een
onraadbaar pad in de URL, afgedwongen door de reverse proxy die er toch al staat. Geen eigen image, geen
regel code.
**En het verklaart de foutmelding op iOS.** De URL wordt gevalideerd met een `.url()`-regel uit yup
(`relayServerSettings.ts`), en die accepteert `ws://` niet. "Enter a valid url" ging dus over het schema en
niet over het adres.
Dat het huidige pakket de zware variant bevat is geen fout maar het gevolg van de volgorde waarin het
gevonden is: de laag van Trezor was eerder zichtbaar dan de laag eronder.
@@ -287,3 +301,48 @@ Twee waarschuwingen bij die bron. Het meeste hierboven komt uit **`suite-native`
desktopversie kan andere instellingen op een andere plek hebben, en dat is niet nagekeken. En het is een
kloon op een moment in de tijd: bij twijfel de datum van die kloon opzoeken voordat je er een conclusie op
bouwt.
## 8. De uitbreidpunten van de kale relay
Nagetrokken 28-08-2026 in de broncode van `evoluhq/evolu`, nadat de proef bewees dat de kale relay bruikbaar
is. Dit is wat een eigen limiter mogelijk maakt, en het is aanzienlijk minder werk dan **Bereikbaarheid**
§4b aannam.
**Er wordt geen relay nagebouwd; er worden twee functies meegegeven.** `createRelay` uit `@evolu/nodejs`
heeft deze vorm:
```ts
createRelay({ port = 443, name, isOwnerAllowed, isOwnerWithinQuota }): Task<Relay, never, RelayDeps>
```
`isOwnerAllowed(ownerId)` beslist of een eigenaar er überhaupt in mag, `isOwnerWithinQuota(ownerId,
requiredBytes)` of een schrijfactie past. Beide zijn asynchroon. De opslag wordt intern gemaakt met
`createRelaySqliteStorage(deps)({ isOwnerWithinQuota })`, dus SQLite, en `createRelayDeps()` levert de
driver.
**Trezor doet exact dit en niets meer.** Hun `createEvoluRelay.ts` roept de relay aan met die twee
functies, en beide kijken in hun limietentabel via `getLimitsForOwner()`. De hele quota-manager plus
Postgres bestaat dus alleen om die tabel te vullen. Dat is het bewijs dat ons pakket met dezelfde twee
haken hetzelfde kan zonder die machinerie.
**De gepubliceerde image vult ze zelf al deels in**, en dat is een valstrik om te kennen. In
`apps/relay/src/index.ts` staat `isOwnerAllowed` **uitgecommentarieerd** (dus iedereen mag erin) en
`isOwnerWithinQuota` op **1 MB per eigenaar**. Dat is geen theorie maar de image die wij draaien:
- **een kale relay is niet volledig ongelimiteerd.** Er zit een bovengrens op wat één eigenaar kan
wegschrijven, en dat dempt misbruik als gratis opslag meer dan gedacht;
- **maar 1 MB is ook een plafond voor de échte gebruiker.** Loopt de labelgeschiedenis daar tegenaan, dan
stopt het synchroniseren, en dat merk je pas als het gebeurt. Wie zelf een relay bouwt, kiest dat getal
dus bewust.
De relay zet zijn data in een map `data` naast het programma (`mkdirSync` plus `process.chdir`), en dat is
het volume `/app/data` uit de image. In de database zitten onder meer `evolu_message` en `evolu_history`, en
`ownerId` is een systeemkolom. **Data per eigenaar wissen is daarmee mogelijk maar het is schrijven in
andermans schema**, met dezelfde bezwaren als bij Trezor's limietentabel.
Bronnen, geraadpleegd 28-08-2026:
- [`packages/nodejs/src/local-first/Relay.ts`](https://raw.githubusercontent.com/evoluhq/evolu/main/packages/nodejs/src/local-first/Relay.ts)
- [`apps/relay/src/index.ts`](https://raw.githubusercontent.com/evoluhq/evolu/main/apps/relay/src/index.ts)
- [`src/evoluRelay/createEvoluRelay.ts`](https://raw.githubusercontent.com/trezor/trezor-suite-sync/main/src/evoluRelay/createEvoluRelay.ts) van Trezor
- [evolu.dev/docs/relay](https://www.evolu.dev/docs/relay) en [evolu.dev/docs/evolu-server](https://www.evolu.dev/docs/evolu-server)