|
|
|
@@ -138,3 +138,203 @@ Op de Umbrel, en dat is waar dit plan om gaat:
|
|
|
|
|
5. controleren dat het toevoegen van deze app Electrum Gate niet raakt.
|
|
|
|
|
|
|
|
|
|
Meld per controle of hij gedaan is, en meld ook expliciet welke niet.
|
|
|
|
|
|
|
|
|
|
### 6a. Testprotocol: praat Trezor Suite met de kale relay?
|
|
|
|
|
|
|
|
|
|
Geschreven 28-08-2026, als uitwerking van de eerste taak in [TAKEN.md](TAKEN.md) en van
|
|
|
|
|
[OPEN.md](OPEN.md) punt 6. Deze proef gaat **niet** over het pakket dat er nu staat: hij draait de kale
|
|
|
|
|
`docker.io/evoluhq/relay:latest` los ernaast, met één commando, en raakt de app niet aan.
|
|
|
|
|
|
|
|
|
|
**De vraag die hij beantwoordt:** past de protocolversie van Suite (`@evolu/web@3.0.0-next.1`, met een
|
|
|
|
|
eigen patch in `.yarn/patches/`) op de gepubliceerde image van Evolu? Dat is het enige dat nog niet uit de
|
|
|
|
|
broncode af te leiden was.
|
|
|
|
|
|
|
|
|
|
**Wat hij níet beantwoordt:** of de relay veilig genoeg is om zo te draaien. Dat is de limiter uit
|
|
|
|
|
[OPEN.md](OPEN.md) punt 8, en die vraag komt pas ná een geslaagde uitslag.
|
|
|
|
|
|
|
|
|
|
**Eigenaar: gebruiker.** Dit is niet vanaf een laptop met alleen de repo te doen.
|
|
|
|
|
|
|
|
|
|
#### Voorbereiding
|
|
|
|
|
|
|
|
|
|
1. Een host met Docker en poort 4000 vrij. De Umbrel is het handigst; daar moet het met `sudo`, want de
|
|
|
|
|
gebruiker `umbrel` zit niet in de groep `docker`. Naast Suite op de PC mag ook.
|
|
|
|
|
2. De app `whatsnext-evolu-relay` staat uit, en dat blijft zo. Er is dus geen botsing, ook niet op 3851.
|
|
|
|
|
3. Het Trezor-apparaat bij de hand: het aanzetten van de synchronisatie vraagt een bevestiging op het
|
|
|
|
|
apparaat zelf.
|
|
|
|
|
4. Een tweede Suite-installatie is **niet** nodig, maar wel de enige manier om de proef helemaal rond te
|
|
|
|
|
krijgen. Zie stap 7.
|
|
|
|
|
|
|
|
|
|
#### De stappen
|
|
|
|
|
|
|
|
|
|
**1. De image halen en bekijken.** Dit legt meteen twee dingen vast die verderop nodig zijn: waar de relay
|
|
|
|
|
zijn data neerzet, en de digest waarop later te pinnen valt.
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
sudo docker pull docker.io/evoluhq/relay:latest
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
sudo docker image inspect docker.io/evoluhq/relay:latest --format '{{index .RepoDigests 0}} | cmd={{.Config.Cmd}} | ports={{.Config.ExposedPorts}} | volumes={{.Config.Volumes}}'
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Noteer de digest en het datapad. Onze naslag zegt `/app/data`, maar dat komt uit de documentatie van Evolu
|
|
|
|
|
en niet uit de image; wat hier uitkomt is de waarheid.
|
|
|
|
|
|
|
|
|
|
**Gemeten op 28-08-2026:** `evoluhq/relay:latest` staat op
|
|
|
|
|
`sha256:dbbe0ca13a78beffcfcbedadd4081c4452e81599801d375d93b0861b411535d2`. Dat is de digest die bij een
|
|
|
|
|
pull op tag gemeld wordt, dus de index-digest, en daarmee precies wat er bij een pin in de compose hoort.
|
|
|
|
|
Nog niet gecontroleerd is of die index arm64 bevat; dat telt pas bij **Publicatie-Relay**.
|
|
|
|
|
|
|
|
|
|
**2. Starten, op de voorgrond.** Het log is de helft van de meting, dus laat dit venster staan.
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
sudo docker run --rm --name evolu-proef -p 4000:4000 docker.io/evoluhq/relay:latest
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Een goede start meldt één regel: `Evolu Relay started on port 4000`** (gemeten 28-08-2026). Meer komt er
|
|
|
|
|
bij het opstarten niet, dus dat is het hele startsignaal.
|
|
|
|
|
|
|
|
|
|
**En `healthy` in `docker ps` betekent hier minder dan het lijkt.** De healthcheck van de image opent met
|
|
|
|
|
Node een TCP-verbinding naar 127.0.0.1:4000 en sluit hem meteen; er gaat geen enkel verzoek overheen. Groen
|
|
|
|
|
zegt dus alleen dat de poort binnen de container accepteert, niet dat de relay iets zinnigs doet. Dat is
|
|
|
|
|
dezelfde fout als de bovenstroomse Postgres-healthcheck uit §4e, en de les herhaalt zich: **nemen we deze
|
|
|
|
|
image in het pakket op, dan hoort er een healthcheck bij die wél iets vraagt.** Vergat je `--name`, dan vind je de naam met
|
|
|
|
|
`sudo docker ps --filter ancestor=evoluhq/relay:latest --format '{{.ID}} {{.Names}}'`.
|
|
|
|
|
|
|
|
|
|
**3. Luistert hij, en spreekt hij WebSocket?** In een tweede venster:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
curl -si --max-time 5 -H 'Connection: Upgrade' -H 'Upgrade: websocket' -H 'Sec-WebSocket-Version: 13' -H 'Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==' http://127.0.0.1:4000/
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Het antwoord hoort `HTTP/1.1 101 Switching Protocols` te zijn (gemeten 28-08-2026). `Connection refused`
|
|
|
|
|
betekent dat er niets luistert, en dan is stap 1 het antwoord.
|
|
|
|
|
|
|
|
|
|
**Doe dit niet met een gewone GET, en al helemaal niet met een browser.** Dat is op 28-08-2026 een half uur
|
|
|
|
|
zoeken geworden: de relay negeert een verzoek zonder upgrade-headers volledig, dus `curl` geeft niets terug
|
|
|
|
|
en de browser meldt na een minuut dat de site niet bereikbaar is. Dat ziet er identiek uit aan een dode
|
|
|
|
|
poort of een firewall, terwijl er niets aan de hand is. **Alleen de handshake hierboven meet iets.**
|
|
|
|
|
|
|
|
|
|
**4. Een nulmeting van de opslag.** Hierop rust de belangrijkste conclusie, dus doe hem vóór je Suite
|
|
|
|
|
aansluit.
|
|
|
|
|
|
|
|
|
|
**Niet met `docker diff`, en dat is een valstrik die hier op 28-08-2026 is ingelopen.** De image
|
|
|
|
|
declareert `/app/data` als VOLUME (gemeten: `volumes=map[/app/data:{}]`), dus Docker hangt daar een naamloos
|
|
|
|
|
volume in. `docker diff` toont uitsluitend de schrijflaag van de container en kijkt niet in een volume: die
|
|
|
|
|
uitvoer blijft leeg, ook na een geslaagde synchronisatie. Een lege uitkomst zou dan als "er landt niets"
|
|
|
|
|
gelezen worden, en dat is precies de verkeerde conclusie.
|
|
|
|
|
|
|
|
|
|
Meet daarom op het volume zelf. Eerst het hostpad opzoeken:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
sudo docker inspect evolu-proef --format '{{range .Mounts}}{{.Type}} {{.Name}} -> {{.Source}}{{end}}'
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
En dan, met dat pad, de meting die je later herhaalt:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
sudo ls -la <hostpad>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Schrijf de uitkomst op; leeg of alleen een verse database is een prima nulmeting. `sudo du -sb <hostpad>`
|
|
|
|
|
geeft er een getal bij dat makkelijker te vergelijken is.
|
|
|
|
|
|
|
|
|
|
**De nulmeting van 28-08-2026, meteen na de start:** één bestand, `evolu-relay.db`, 40960 bytes, eigenaar
|
|
|
|
|
uid 1001. Twee dingen die dat vastlegt. De relay maakt zijn eigen SQLite-database aan bij de start, dus de
|
|
|
|
|
schemavraag die bij het Trezor-pakket openstaat bestaat hier niet. En hij draait niet als root, wat precies
|
|
|
|
|
de reden is dat een zelfgemaakte bind-mount hier niet gebruikt wordt.
|
|
|
|
|
|
|
|
|
|
**Wij openen dat bestand niet.** Ook niet om te kijken of het label erin staat; dat is data van de
|
|
|
|
|
gebruiker. `ls` en `du` zeggen genoeg.
|
|
|
|
|
|
|
|
|
|
**5. Suite ernaartoe wijzen.** Instellingen, **dev-utils**, het veld voor de relay-URL:
|
|
|
|
|
`http://<host>:4000`, met de eigen opslaan-knop van dat veld. `http://` volstaat, dat blijkt uit Trezor's
|
|
|
|
|
eigen e2e-test. **De quota-manager-URL laat je met rust**: bij een eigen relay-URL negeert Suite hem toch,
|
|
|
|
|
en dat is precies de bevinding waar deze richting op rust. Zet daarna de synchronisatie aan en bevestig op
|
|
|
|
|
het apparaat.
|
|
|
|
|
|
|
|
|
|
**6. Eén label maken**, of een account hernoemen. Kijk daarna naar de drie signalen, in deze volgorde:
|
|
|
|
|
|
|
|
|
|
- **het log in venster 1**: komt er een verbinding binnen, en blijft die staan?
|
|
|
|
|
- **`sudo ls -la <hostpad>`** uit stap 4: is er in het volume iets bijgekomen of gegroeid? **Kijk vooral
|
|
|
|
|
naar de tijdstempel van `evolu-relay.db` en niet alleen naar de omvang:** SQLite schrijft in pagina's, en
|
|
|
|
|
een enkel label past mogelijk in de ruimte die er al is. Verschijnen er `-wal` of `-shm`-bestanden naast,
|
|
|
|
|
dan is dat op zichzelf al bewijs van schrijfverkeer;
|
|
|
|
|
- **Suite zelf**: zegt hij iets over de sync-status? Dit is het zwakste signaal van de drie, zie de
|
|
|
|
|
valkuil hieronder.
|
|
|
|
|
|
|
|
|
|
**7. Alleen met een tweede cliënt: de rondgang.** Wijs een tweede Suite naar dezelfde relay, met dezelfde
|
|
|
|
|
Trezor, en kijk of het label vanzelf verschijnt. Dit is de enige controle die beide richtingen bewijst.
|
|
|
|
|
Heb je die niet, dan is stap 6 het eindpunt en meld je dat de leeskant ongemeten bleef.
|
|
|
|
|
|
|
|
|
|
#### De uitslag lezen
|
|
|
|
|
|
|
|
|
|
| Waarneming | Wat het betekent |
|
|
|
|
|
|-|-|
|
|
|
|
|
| Geen verbinding in het log, curl uit stap 3 werkte wel | Suite komt er niet bij. Adresvorm, firewall of het verkeerde IP. **Nog geen uitspraak over het protocol**, dus eerst dit oplossen |
|
|
|
|
|
| Verbinding komt op en valt meteen weg, herhaald in een cyclus | Dit is het beeld van een geweigerde handshake, en dus de meest waarschijnlijke vorm van een protocolmismatch. **Uitslag: mislukt**, en het log is de bevinding: schrijf het letterlijk over |
|
|
|
|
|
| Verbinding blijft staan, maar het volume verandert niet na een label | Verbonden, maar er landt niets. Ook mislukt, en interessanter dan de vorige: dan zit het niet in de handshake maar in de laag erboven. **Controleer eerst dat je naar het volume kijkt en niet naar `docker diff`** |
|
|
|
|
|
| Verbinding blijft staan én het volume groeit | **Geslaagd op de schrijfkant.** Dit is genoeg om de richting uit punt 6 te bevestigen en aan de limiter te beginnen |
|
|
|
|
|
| En de tweede cliënt ziet het label | **Volledig geslaagd.** Beide richtingen bewezen |
|
|
|
|
|
|
|
|
|
|
#### De valkuil, en hij is groot
|
|
|
|
|
|
|
|
|
|
**Dat je het label in Suite ziet staan bewijst niets.** Evolu is local-first: de schrijfactie landt eerst
|
|
|
|
|
in de lokale database en daarna pas bij de relay. Bij een mislukte verbinding ziet de interface er dus
|
|
|
|
|
precies hetzelfde uit. Vandaar dat de conclusie in de tabel hierboven aan de **relaykant** hangt en niet
|
|
|
|
|
aan wat Suite toont.
|
|
|
|
|
|
|
|
|
|
#### Opruimen
|
|
|
|
|
|
|
|
|
|
Ctrl-C in venster 1; door `--rm` verdwijnt de container en met hem de opslag. Dat is voor een proef prima,
|
|
|
|
|
maar het betekent ook dat een herhaling opnieuw bij nul begint, en dat je een geslaagde meting niet per
|
|
|
|
|
ongeluk op oude data doet.
|
|
|
|
|
|
|
|
|
|
**Zet daarna de relay-URL in Suite terug**, anders blijft hij naar een relay wijzen die er niet meer is.
|
|
|
|
|
|
|
|
|
|
**En laat de proefcontainer niet staan.** Hij is onbeschermd bereikbaar op het hele netwerk, en dat is nu
|
|
|
|
|
juist het gat dat de limiter uit [OPEN.md](OPEN.md) punt 8 moet dichten.
|
|
|
|
|
|
|
|
|
|
#### Wat je terugkoppelt
|
|
|
|
|
|
|
|
|
|
Het log uit venster 1 (letterlijk, ook als het er saai uitziet), de inhoud van het volume van vóór en
|
|
|
|
|
na, de digest uit stap 1, en of stap 7 gedaan is. Met die vier is de vervolgsessie beslisbaar zonder de
|
|
|
|
|
proef te herhalen.
|
|
|
|
|
|
|
|
|
|
#### Wat er op 28-08-2026 gemeten is, en wat nog steeds niet
|
|
|
|
|
|
|
|
|
|
**De hoofdvraag is die dag níet beantwoord.** Er is geen enkele cliënt tot een verbinding gekomen, dus over
|
|
|
|
|
de protocolversie is nog niets bekend. Wat er wél uit kwam is de halve dag waard, en staat hieronder zodat
|
|
|
|
|
het niet opnieuw uitgezocht hoeft te worden.
|
|
|
|
|
|
|
|
|
|
**De relay zelf is in orde.** Hij haalt, start en luistert. De WebSocket-handshake slaagt zowel vanaf de
|
|
|
|
|
Umbrel zelf als vanaf een Mac elders op het netwerk, met een correcte `Sec-WebSocket-Accept`. De poort is
|
|
|
|
|
gepubliceerd op alle interfaces. Aan de serverkant is er dus niets te repareren.
|
|
|
|
|
|
|
|
|
|
**Hij maakt zijn database zelf aan.** Direct na de start staat er één bestand in het volume,
|
|
|
|
|
`evolu-relay.db` van 40960 bytes, eigenaar uid 1001. Daarmee vervalt in deze richting de schemavraag die bij
|
|
|
|
|
het Trezor-pakket nog openstaat, en het bevestigt dat de relay niet als root draait.
|
|
|
|
|
|
|
|
|
|
**Drie meetinstrumenten bleken onbruikbaar, en alle drie op dezelfde manier: ze gaven een vals negatief.**
|
|
|
|
|
Dit is de duurste les van de dag, want elk ervan leek een probleem aan te wijzen dat er niet was.
|
|
|
|
|
|
|
|
|
|
- **`docker diff` kijkt niet in een volume.** Omdat `/app/data` als VOLUME gedeclareerd is, blijft die
|
|
|
|
|
uitvoer leeg, ook na een geslaagde synchronisatie. Meet op het hostpad uit `docker inspect`.
|
|
|
|
|
- **Een browser of een gewone `curl` krijgt niets terug.** De relay negeert een verzoek zonder
|
|
|
|
|
upgrade-headers volledig: geen antwoord, geen foutcode. Dat ziet er identiek uit aan een dode poort of een
|
|
|
|
|
firewall. Alleen de handshake uit stap 3 meet iets.
|
|
|
|
|
- **`healthy` in `docker ps` zegt niets over werking.** De healthcheck opent een TCP-verbinding en sluit hem
|
|
|
|
|
meteen.
|
|
|
|
|
|
|
|
|
|
**iOS is voor deze proef geen bruikbaar platform gebleken.** Wat er werkt: het veld voor de relay-URL
|
|
|
|
|
bestaat in de iOS-app onder dev-utils, het valideert (`ws://` wordt geweigerd met "Enter a valid url", dus
|
|
|
|
|
het wil `http(s)://`, precies zoals Trezor's eigen e2e-test), en de ingevulde waarde overleeft een
|
|
|
|
|
geforceerde afsluiting. Wat er niet werkt: de app maakt geen enkele verbinding. Met een wachter die elke
|
|
|
|
|
halve seconde keek is er nooit een poging op poort 4000 aangekomen, en in de iOS-instellingen verscheen
|
|
|
|
|
geen schakelaar voor "Lokaal netwerk", wat erop wijst dat de app het nooit geprobeerd heeft.
|
|
|
|
|
|
|
|
|
|
Twee lezingen blijven mogelijk en zijn van buitenaf niet te scheiden: de app kan op dit platform geen eigen
|
|
|
|
|
relay gebruiken, of het synchroniseren zelf kwam niet op gang omdat de bevestiging op het apparaat
|
|
|
|
|
ontbrak. **Dat is een eigen vraag geworden en niet langer deel van deze proef**, want anders sluiten we twee
|
|
|
|
|
onbekenden tegelijk uit. De proef verhuist naar de desktop-Suite op de Mac, die aantoonbaar bij de relay
|
|
|
|
|
kan.
|
|
|
|
|