Files
UmbrelApps/Docs/Referenties/Upstream-evolu-relay.md
T
HarmenandClaude Opus 5 1a87a45685 De bovenstroomse repo gelezen, en twee aannames sneuvelden
De gebruiker wil de Evolu Relay-app meteen pakketteren. Daarvoor moest fase 1 van
Proefopstelling eerst af, want een compose schrijven op aannames is precies wat
dat plan moet voorkomen. Upstream-evolu-relay.md gaat daarmee van vooronderzoek
naar nagetrokken, met een bron-URL per feit.

De quota-manager is in de praktijk verplicht, en om een andere reden dan gedacht.
Niet omdat de relay hem aanroept: er is geen HTTP-koppeling en geen URL in de
configuratie, ze delen alleen de Postgres. Maar isOwnerAllowed() eist een rij in
de limietentabel en de quota-manager maakt die rijen. Zonder hem is de relay dus
niet open maar dicht voor iedereen. Dat maakt de tweede weg interessant, want een
rij is ook met de hand te zetten; de prijs daarvan is schrijven in andermans
schema.

Er is geen publieke image. Trezor bouwt er wel een maar duwt hem naar een eigen
Amazon ECR, en op Docker Hub staat niets. Zelf bouwen en publiceren, of geen app,
en dat is een doorlopende verplichting. Bijvangst die een risico wegneemt:
datzelfde werkproces bouwt amd64 en arm64, dus de Dockerfile is bovenstrooms
bewezen op een Pi. Nieuw risico dat ervoor terugkomt: LICENSE.md is door GitHub
geclassificeerd als "other", en zodra je een image publiceert distribueer je hun
software.

Twee kleinere correcties. De compose van Trezor draait de relay niet, er staan
alleen Postgres en Prometheus in; het is een ontwikkelopstelling en wat zij
uitrollen staat in .k8s/. En alle processen komen uit één image met per service
een ander command, dus het worden geen drie images.

Eén tegenspraak blijft staan en is expres niet weggeschreven als feit:
.env.sample zegt dat SERVER_ENV=prod authenticatie aanzet, maar in de code die ik
las bepaalt die vlag alleen het logniveau en staan de controles onvoorwaardelijk
aan. Eén van de twee is achterhaald. Dat is met één keer starten te meten en het
staat als taak in fase 2.

Tests: niet gedraaid, dit raakt alleen documentatie.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 16:57:39 +02:00

9.0 KiB

Upstream: trezor/trezor-suite-sync en Evolu Relay

Naslag, geen plan. Nagetrokken tegen de bron op 25-08-2026, met de URL's onderaan. Dat is een andere status dan de eerste versie van dit document had: die leunde op vooronderzoek van dezelfde dag en meldde per regel dat het niet geverifieerd was. Wat hieronder staat komt uit de bestanden zelf.

Op drie punten week de werkelijkheid af van het vooronderzoek, en alle drie raken het pakket. Ze staan in §2, §3 en §4.

1. Wat het is

Trezor Suite kan labels en accountnamen synchroniseren tussen apparaten. De server die dat doet heet in de interface "custom sync server"; het onderdeel zelf heet Evolu Relay en staat in de repo trezor/trezor-suite-sync (standaardbranch main, licentie in LICENSE.md, door GitHub geclassificeerd als "other").

Evolu is een local-first synchronisatielaag: de client houdt zijn eigen kopie bij en de relay is een doorgeefluik voor versleutelde wijzigingen. Volgens Trezor is de data client-side end-to-end versleuteld, dus de relay ziet niets leesbaars. Zelf hosten haalt Trezor uit de vergelijking, het verandert de privacygaranties niet.

2. Eén codebase, vier processen, en een compose die de app niet draait

Correctie op het vooronderzoek. Daar stond dat er een Dockerfile en een docker-compose.yaml in de repo staan en dat containeriseren dus "al gedeeltelijk gedaan is door Trezor zelf". Het eerste klopt, het tweede niet: de compose van Trezor draait de relay niet. Er staan precies twee diensten in, en dat is een ontwikkelopstelling:

  • db: image: postgres, ongepind, met PGDATA: /data/postgres en 5432:5432 naar buiten;
  • prometheus: network_mode: host, die localhost:4003 afloopt.

De README bevestigt de bedoeling: docker compose up in de ene terminal voor de database, en in de andere yarn start-quota-manager, yarn start-evolu-relay en yarn start-metrics. Wat Trezor zélf uitrolt staat niet in de compose maar in .k8s/, met Kustomize-overlays voor dev en prod.

Alle processen komen uit dezelfde codebase en dus uit dezelfde image. Dat is de belangrijkste pakketteerwinst van dit hele onderzoek: je hebt geen drie images nodig, maar één image met per service een ander command. De Dockerfile is node:24-alpine, twee fasen, Yarn 4.12.0, met EXPOSE 4000 4001 en CMD ["yarn", "start"]. Bij dat CMD staat bovenstrooms zelf een commentaar dat het misschien start-quota-manager of start-evolu-relay had moeten zijn, dus reken er niet op dat yarn start het juiste doet; zet het commando expliciet.

De poorten, met hun standaardwaarde uit src/config.ts:

Proces Poort Waarvoor
evolu-relay 4000 de sync-relay, dit is wat we nodig hebben
quota-manager 4001 quota- en betaalserver
health 4002 statuscontrole
metrics 4003 Prometheus

In .env.sample staan ze alle vier uitgecommentarieerd, dus de standaardwaarden gelden tenzij je ze zet. DATA_DIR heeft standaard de waarde data.

3. Is de quota-manager verplicht? Ja, in de praktijk wel

Dit is de vraag waar het vooronderzoek op hoopte dat het antwoord nee zou zijn. Dat is het niet, en de reden is preciezer dan "de relay heeft de quota-manager nodig".

De relay bevat twee controles, in src/evoluRelay/createEvoluRelay.ts:

  • isOwnerAllowed() vraagt getLimitsForOwner({ ownerId }) op en staat de eigenaar alleen toe als daar iets terugkomt dat niet leeg is;
  • isOwnerWithinQuota() controleert bij schrijven of usedBytes + requiredBytes binnen de limiet blijft.

De strekking: een eigenaar zonder rij in de limietentabel wordt geweigerd. En de quota-manager is precies het onderdeel dat die rijen aanmaakt. Zonder hem is de relay dus niet "open", maar dicht voor iedereen.

Twee dingen die dit relativeren en die het pakket bepalen:

  • er is geen HTTP-koppeling tussen de twee. In src/config.ts staat geen URL of hostnaam voor de quota-manager, alleen een poort waarop hij zelf luistert. Ze delen de Postgres. Praktisch gevolg: de relay hoeft de quota-manager niet te kunnen bereiken, alleen de tabel moet gevuld zijn;
  • daarmee zijn er twee wegen, en ze zijn allebei legitiem: de quota-manager meepakketteren en er één eigenaar in registreren, of de limietenrij één keer zelf in de database zetten. Het tweede is minder bewegende delen, maar het is wél zelf in andermans schema schrijven, en dat breekt bij een migratie.

Wat hier niet is uitgezocht, en het is de eerste vraag voor wie hier verder gaat: hoe je bij de quota-manager een eigenaar registreert, en of daar iets extern voor nodig is. De README verwijst voor de API-specificatie naar Notion en voor het uitproberen naar Bruno; er zit een bruno-collection/ in de repo die dat waarschijnlijk laat zien.

De onopgeloste tegenspraak rond dev en prod

In .env.sample staat SERVER_ENV="dev" # dev | prod (PROD enables evolu relay authentication). Dat suggereert dat de controles in dev uit staan, en dat zou een self-hosted relay eenvoudig maken.

Dat is niet terug te vinden in de code die ik gelezen heb. In src/config.ts wordt isDevServer = SERVER_ENV === 'dev' gezet, en in createEvoluRelay.ts bepaalt die vlag alleen het logniveau (debug tegenover info). createEvoluRelayCompositionRoot.ts hangt getLimitsForOwner onvoorwaardelijk in, zonder tak voor dev.

Dus: óf het commentaar in .env.sample gaat over iets anders dan deze twee controles, óf het is achterhaald. Ga er niet van uit dat SERVER_ENV=dev de deur opent, en ga er ook niet van uit dat hij dicht is: dit is precies het soort aanname waar een middag in gaat zitten. Het is met één keer starten te meten en dat hoort in Proefopstelling fase 2.

4. Er is geen publieke image, en dat is de grootste consequentie

Tweede correctie op het vooronderzoek, en de duurste. Trezor bouwt wel een image, maar publiceert hem niet ergens waar jij hem kunt halen.

Uit .github/workflows/build-and-push-image.yml: de image gaat via aws-actions/amazon-ecr-login naar een Amazon ECR in eu-central-1, met de registry-hostnaam als uitvoer van die stap en de naam als invoerparameter. Er is geen Docker Hub en geen ghcr in dat werkproces. Onder de namespace trezor op Docker Hub staat niets dat hierop lijkt.

Wat daaruit volgt voor dit project:

  • je bouwt en publiceert de image zelf, of er is geen Umbrel-app. Dat is geen eenmalige handeling maar een doorlopende verplichting: bij elke nieuwe versie van Trezor bouw je opnieuw;
  • linux/arm64 is geen risico meer. Datzelfde werkproces bouwt platforms: linux/amd64,linux/arm64 met QEMU, dus de Dockerfile is bovenstrooms bewezen op arm64. Dat was punt 2 van de oude versie van dit document en die vraag is hiermee weg;
  • de licentie wordt nu wél een vraag. GitHub classificeert LICENSE.md als "other". Zolang je alleen zelf draait is dat academisch; zodra je een image publiceert, distribueer je hun software. Lees dat bestand voordat er iets in een openbaar register komt.

5. Wat er nog helemaal niet uitgezocht is

Deze staan hier omdat ze het pakket bepalen en omdat er in deze ronde geen antwoord op kwam. Ze zijn geen taak (dat zijn ze in Proefopstelling en Umbrelapp).

  1. Kan Trezor Suite überhaupt naar een eigen sync-server wijzen, en op welk platform? Onveranderd de goedkoopste weerlegging van het hele project, en niets in deze repo zegt er iets over: dit is de serverkant.
  2. Accepteert Trezor Suite een http://-adres, of eist het TLS? Daar hangt het masterplan Bereikbaarheid aan.
  3. Hoe registreer je een eigenaar bij de quota-manager, en heeft die daarvoor iets extern nodig? Zie §3. Begin bij bruno-collection/.
  4. Wat doet SERVER_ENV=prod dat dev niet doet? Zie de tegenspraak in §3.
  5. Wat staat er in LICENSE.md? Zie §4.

6. Bronnen

Alles hierboven komt uit deze bestanden, geraadpleegd op 25-08-2026:

Het oorspronkelijke vooronderzoek van 25-08-2026 staat ongewijzigd in Vooronderzoek.PLAN.md. Wat daar niet meer klopt, staat hierboven in §2 en §4.