2026-08-25 16:27:57 +02:00
|
|
|
# Upstream: `trezor/trezor-suite-sync` en Evolu Relay
|
|
|
|
|
|
2026-08-25 16:57:39 +02:00
|
|
|
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.
|
2026-08-25 16:27:57 +02:00
|
|
|
|
|
|
|
|
## 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
|
2026-08-25 16:57:39 +02:00
|
|
|
`trezor/trezor-suite-sync` (standaardbranch `main`, licentie in `LICENSE.md`, door GitHub geclassificeerd
|
|
|
|
|
als "other").
|
2026-08-25 16:27:57 +02:00
|
|
|
|
|
|
|
|
Evolu is een local-first synchronisatielaag: de client houdt zijn eigen kopie bij en de relay is een
|
2026-08-25 16:57:39 +02:00
|
|
|
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.**
|
2026-08-25 16:27:57 +02:00
|
|
|
|
2026-08-25 16:57:39 +02:00
|
|
|
## 2. Eén codebase, vier processen, en een compose die de app niet draait
|
2026-08-25 16:27:57 +02:00
|
|
|
|
2026-08-25 16:57:39 +02:00
|
|
|
**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:
|
2026-08-25 16:27:57 +02:00
|
|
|
|
2026-08-25 16:57:39 +02:00
|
|
|
- `db`: `image: postgres`, ongepind, met `PGDATA: /data/postgres` en `5432:5432` naar buiten;
|
|
|
|
|
- `prometheus`: `network_mode: host`, die `localhost:4003` afloopt.
|
2026-08-25 16:27:57 +02:00
|
|
|
|
2026-08-25 16:57:39 +02:00
|
|
|
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.
|
2026-08-25 16:27:57 +02:00
|
|
|
|
2026-08-25 16:57:39 +02:00
|
|
|
**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.
|
2026-08-25 16:27:57 +02:00
|
|
|
|
2026-08-25 16:57:39 +02:00
|
|
|
De poorten, met hun standaardwaarde uit `src/config.ts`:
|
2026-08-25 16:27:57 +02:00
|
|
|
|
2026-08-25 16:57:39 +02:00
|
|
|
| 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 |
|
2026-08-25 16:27:57 +02:00
|
|
|
|
2026-08-25 16:57:39 +02:00
|
|
|
In `.env.sample` staan ze alle vier uitgecommentarieerd, dus de standaardwaarden gelden tenzij je ze zet.
|
|
|
|
|
`DATA_DIR` heeft standaard de waarde `data`.
|
2026-08-25 16:27:57 +02:00
|
|
|
|
2026-08-25 16:57:39 +02:00
|
|
|
## 3. Is de quota-manager verplicht? Ja, in de praktijk wel
|
2026-08-25 16:27:57 +02:00
|
|
|
|
2026-08-25 16:57:39 +02:00
|
|
|
**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".
|
2026-08-25 16:27:57 +02:00
|
|
|
|
2026-08-25 16:57:39 +02:00
|
|
|
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
|
2026-08-25 16:27:57 +02:00
|
|
|
**Bereikbaarheid** aan.
|
2026-08-25 16:57:39 +02:00
|
|
|
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.
|
2026-08-25 16:27:57 +02:00
|
|
|
|
2026-08-25 16:57:39 +02:00
|
|
|
## 6. Bronnen
|
2026-08-25 16:27:57 +02:00
|
|
|
|
2026-08-25 16:57:39 +02:00
|
|
|
Alles hierboven komt uit deze bestanden, geraadpleegd op 25-08-2026:
|
|
|
|
|
|
|
|
|
|
- [`docker-compose.yaml`](https://raw.githubusercontent.com/trezor/trezor-suite-sync/main/docker-compose.yaml)
|
|
|
|
|
- [`.env.sample`](https://raw.githubusercontent.com/trezor/trezor-suite-sync/main/.env.sample)
|
|
|
|
|
- [`Dockerfile`](https://raw.githubusercontent.com/trezor/trezor-suite-sync/main/Dockerfile)
|
|
|
|
|
- [`README.md`](https://raw.githubusercontent.com/trezor/trezor-suite-sync/main/README.md)
|
|
|
|
|
- [`src/config.ts`](https://raw.githubusercontent.com/trezor/trezor-suite-sync/main/src/config.ts)
|
|
|
|
|
- [`src/evoluRelay/createEvoluRelay.ts`](https://raw.githubusercontent.com/trezor/trezor-suite-sync/main/src/evoluRelay/createEvoluRelay.ts)
|
|
|
|
|
- [`src/evoluRelay/createEvoluRelayCompositionRoot.ts`](https://raw.githubusercontent.com/trezor/trezor-suite-sync/main/src/evoluRelay/createEvoluRelayCompositionRoot.ts)
|
|
|
|
|
- [`.github/workflows/build-and-push-image.yml`](https://raw.githubusercontent.com/trezor/trezor-suite-sync/main/.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](../Plannen/Masterplannen/Archief/Vooronderzoek.PLAN.md). Wat daar niet meer klopt,
|
|
|
|
|
staat hierboven in §2 en §4.
|