Het relay-programma: de relay van Evolu met onze eigen allowlist
tools/evolu-relay/src/ bevat nu een eigen programma dat createRelay uit @evolu/nodejs aanroept met de twee terugroepfuncties die het bedoelde uitbreidpunt vormen. De relay zelf komt uit npm en wordt niet nagebouwd of aangepast; de opstartvolgorde is overgenomen uit apps/relay/src/index.ts van Evolu zelf. De opzet is drie bestanden met een harde scheiding, en die scheiding is de reden dat hier iets te testen valt. policy.js bevat het beleid als pure functies: geen bestanden, geen netwerk, geen klok. store.js is de enige plek met schijf erin. index.js doet niets anders dan lezen, doorgeven en opslaan. Het beleid: de eerste eigenaar die zich meldt wordt geleerd, een schakelaar bepaalt of er nog nieuwe bij mogen, en een eigenaar is te blokkeren, alsnog toe te laten of te vergeten. Geweigerde pogingen worden onthouden voor de pagina, afgekapt op twintig, want elke poging is een id dat de ander zelf verzint. Een onleesbaar owners.json wordt opzij geschoven en de app gaat dan dicht in plaats van open: we weten dan niet wie er toegelaten was, en met de leerstand aan zou de eerstvolgende die verbindt de nieuwe eigenaar worden. Met test: node tests/test_limiter.mjs, 60 toetsen, en de toetsen gaan over de guards en niet over het gelukkige pad. De beslissende regel is muteertest gedaan en de juiste toets viel om: een geblokkeerde eigenaar mag er niet alsnog in doordat de leerstand aanstaat. Het bestand is .mjs omdat de repo-root geen package.json heeft en een .js daar als CommonJS gelezen zou worden. build.sh bouwt niet langer de repo van Trezor maar onze eigen Dockerfile, dus git is er niet meer voor nodig en de pin zit nu in package.json. De image is node:24-slim en niet alpine, want better-sqlite3 heeft binaries voor glibc en niet voor musl. Er is nog geen package-lock.json; het script waarschuwt daarvoor en het staat als taak. Onderweg bleek een aanname van vanmiddag fout: de 1 MB uit de gepubliceerde image geldt per schrijfactie en niet per eigenaar. Er valt dus geen labelgeschiedenis tegenaan te lopen. Dat is rechtgezet in het plan en in de naslag, en het getal is overgenomen als bewuste keuze met RELAY_MAX_WRITE_BYTES ernaast. Wat er niet in zit en ook niet gegokt is: data per eigenaar wissen. Het beleid kan een eigenaar vergeten, maar zijn berichten staan in de SQLite van de relay, en dat is andermans schema. Tests: alle vier groen (32, 54, 39 en 60 goed, 0 fout). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -141,9 +141,11 @@ eigen image. Wat níet terugkomt is de Postgres, het wachtwoord en het onderhoud
|
||||
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
|
||||
**Twee dingen om niet over te slaan.** De gepubliceerde image laat `isOwnerAllowed` weg en zet
|
||||
`isOwnerWithinQuota` op 1 MB **per schrijfactie**, niet per eigenaar: de relay geeft door hoeveel bytes déze
|
||||
actie nodig heeft en telt niets op. Trezor telt wel op, maar uit hun eigen tabel, en die hebben wij niet.
|
||||
Wij nemen die 1 MB over als bewuste keuze, instelbaar met `RELAY_MAX_WRITE_BYTES`: één labelwijziging is
|
||||
klein, dus een schrijfactie die daarboven uitkomt is eerder een fout of misbruik dan normaal gebruik. 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
|
||||
|
||||
@@ -3,6 +3,21 @@
|
||||
> Chronologisch sessielog, nieuwste bovenaan. Kort: 3 tot 6 regels per entry. Wat er is gebeurd en waarom,
|
||||
> niet wat er nog moet: dat staat in [TAKEN.md](TAKEN.md).
|
||||
|
||||
## 28-08-2026 (later) - het relay-programma staat, met een test erop
|
||||
|
||||
`tools/evolu-relay/src/` bevat nu een eigen programma dat `createRelay` uit `@evolu/nodejs` aanroept met
|
||||
onze twee terugroepfuncties. Het beleid staat apart in `policy.js` als pure functies, zodat het te toetsen
|
||||
is zonder relay en zonder Docker: `node tests/test_limiter.mjs`, 60 toetsen. De beslissende regel is
|
||||
muteertest gedaan, en de juiste toets viel om: een geblokkeerde eigenaar mag er niet alsnog in via de
|
||||
leerstand.
|
||||
|
||||
`build.sh` bouwt niet langer de repo van Trezor maar onze eigen Dockerfile, en Git is daarvoor niet meer
|
||||
nodig. Onderweg bleek dat de 1 MB uit de gepubliceerde image **per schrijfactie** geldt en niet per
|
||||
eigenaar; dat is op twee plekken rechtgezet waar het verkeerd stond.
|
||||
|
||||
**Geraakt:** `tools/evolu-relay/`, `tests/test_limiter.mjs`, `CLAUDE.md` en de documentatie van dit plan.
|
||||
**Tests:** alle vier groen (32, 54, 39 en 60 goed, 0 fout).
|
||||
|
||||
## 28-08-2026 - de proef is geslaagd: de kale relay werkt
|
||||
|
||||
**Trezor Suite op de desktop stuurde elf labels naar `docker.io/evoluhq/relay:latest` en die kwamen aan**:
|
||||
|
||||
@@ -41,18 +41,28 @@
|
||||
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.
|
||||
|
||||
- [ ] **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
|
||||
- [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
|
||||
- [ ] **`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
|
||||
- [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
|
||||
- [ ] **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
|
||||
|
||||
Reference in New Issue
Block a user