De gebruiker droeg evolu.dev/docs/relay aan met de vraag of dat de server is waarop deze app gebaseerd is. Niet dezelfde, wel de bovenstroom, en dat verschil is groot genoeg om het pakket ter discussie te stellen. trezor/trezor-suite-sync is niet Evolu maar Trezor's inzet ervan, met een Postgres en een quota-manager voor hun gehoste dienst. Het project eronder, evoluhq/evolu, heeft een eigen relay: een container, een gepubliceerde image docker.io/evoluhq/relay:latest, een datavolume in plaats van een database, en niets gedocumenteerd over toegangscontrole. De documentatie noemt die relay stateless en geschikt voor serverless. Praat Trezor Suite daarmee, dan vervalt vrijwel alles wat dit pakket ingewikkeld maakt: de bouwstap, het eigen register, de onderhoudsplicht op een image, de Postgres met zijn wachtwoord, en de eigenaarsregistratie die nu de blokkade is. Drie containers worden er een. Niet aangenomen en niet gemeten, dus het staat als open punt 6 met de proef erbij: docker run, Suite ernaartoe wijzen, label maken. Dat kost minuten en het antwoord bepaalt of er nog iets aan de huidige vorm verbeterd moet worden. Daarom staat het ook als eerste in "Volgende stap", vóór het nakijken van het databaseschema: dat laatste is weggegooid werk als de kale relay volstaat. Dat het huidige pakket deze laag heeft, is geen fout maar het gevolg van de volgorde waarin het gevonden is. Dat staat er ook zo bij, want anders leest dit over een maand als een verkeerde beslissing in plaats van als een ontdekking. Tests: niet gedraaid, dit raakt alleen documentatie. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
11 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.
0. Let op: er zijn twee relays, en wij pakketteerden de zware
Toegevoegd 25-08-2026, aan het eind van de dag, nadat de gebruiker evolu.dev/docs/relay aandroeg. Dit staat bovenaan omdat het de rest van dit document in een ander licht zet.
Evolu is een eigen project (evoluhq/evolu) en heeft een eigen relay. trezor/trezor-suite-sync is
niet dat project maar Trezor's inzet ervan, met een eigen opslaglaag en de quota-manager eromheen. Het
verschil is groot:
Evolu, apps/relay |
Trezor, trezor-suite-sync |
|
|---|---|---|
| Containers | één | drie: relay, quota-manager, Postgres |
| Image | gepubliceerd: docker.io/evoluhq/relay:latest |
geen; eigen Amazon ECR, dus zelf bouwen |
| Opslag | een datavolume op /app/data; de documentatie noemt de relay stateless en geschikt voor serverless |
Postgres |
| Toegangscontrole | niets over gedocumenteerd | eigenaar zonder limietenrij wordt geweigerd |
| Poort | 4000, ws:// |
4000 |
De vraag die hieruit volgt is de belangrijkste die dit project nu heeft: praat Trezor Suite met een kale Evolu-relay? Zo ja, dan vervalt vrijwel alles wat dit pakket ingewikkeld maakt: geen bouwstap, geen eigen register, geen onderhoudsplicht op een image, geen Postgres, geen wachtwoord, en vooral geen eigenaarsregistratie, wat nu de blokkade is.
Waarom het plausibel is: Suite is een Evolu-app, Evolu-apps praten met Evolu-relays, en de documentatie van
Evolu zegt zelfs dat een app meerdere relays tegelijk kan gebruiken. Waarom het toch mis kan gaan: de
protocolversie van de Evolu die Suite gebruikt hoeft niet die van de image te zijn, en Trezor kan iets
gewijzigd hebben. Niet aannemen, meten: docker run --rm -p 4000:4000 docker.io/evoluhq/relay:latest
en Suite ernaartoe wijzen kost minuten.
Wat er níet mee vervalt als het werkt: de quota-manager van Trezor is er voor hún gehoste dienst, en die willen we sowieso niet. Dat het pakket die nu bevat, is geen fout maar het gevolg van het feit dat deze laag ontdekt is vóórdat de laag eronder gevonden werd.
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, metPGDATA: /data/postgresen5432:5432naar buiten;prometheus:network_mode: host, dielocalhost:4003afloopt.
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()vraagtgetLimitsForOwner({ ownerId })op en staat de eigenaar alleen toe als daar iets terugkomt dat niet leeg is;isOwnerWithinQuota()controleert bij schrijven ofusedBytes + requiredBytesbinnen 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.tsstaat 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/arm64is geen risico meer. Datzelfde werkproces bouwtplatforms: linux/amd64,linux/arm64met 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.mdals "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).
- 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.
- Accepteert Trezor Suite een
http://-adres, of eist het TLS? Daar hangt het masterplan Bereikbaarheid aan. - Hoe registreer je een eigenaar bij de quota-manager, en heeft die daarvoor iets extern nodig? Zie
§3. Begin bij
bruno-collection/. - Wat doet
SERVER_ENV=proddatdevniet doet? Zie de tegenspraak in §3. - Wat staat er in
LICENSE.md? Zie §4.
6. Bronnen
Alles hierboven komt uit deze bestanden, geraadpleegd op 25-08-2026:
docker-compose.yaml.env.sampleDockerfileREADME.mdsrc/config.tssrc/evoluRelay/createEvoluRelay.tssrc/evoluRelay/createEvoluRelayCompositionRoot.ts.github/workflows/build-and-push-image.yml- Docker Hub, namespace
trezor: geen image die hierop lijkt
Het oorspronkelijke vooronderzoek van 25-08-2026 staat ongewijzigd in Vooronderzoek.PLAN.md. Wat daar niet meer klopt, staat hierboven in §2 en §4.