Files
UmbrelApps/Docs/Plannen/Actief/008-Umbrelapp/TAKEN.md
T
HarmenandClaude Opus 5 e4a8747307 De leeskant is bewezen, en daarmee is het doel van Umbrelapp gehaald
Getest met een tweede gebruikersaccount op dezelfde Mac, en dat is schoner dan een
tweede apparaat: die installatie begint met een lege lokale Evolu-database, dus
alles wat daar verschijnt kan alleen van de relay komen. De labels kwamen door, en
een wijziging aan die kant komt ook weer terug. Beide richtingen dus, met bewijs.

Daarmee staat er wat dit plan beloofde: een tweede app in deze store,
geinstalleerd op de Umbrel, met Trezor Suite die erop synchroniseert. Het restwerk
is klein en wacht nergens op: een herstart van de app overleven, twee images
pinnen, en data per eigenaar kunnen wissen.

Prioriteitsherziening die daarbij hoort. Umbrelapp zakt van A naar B. Eigenimage
gaat naar A, want dat lag alleen stil omdat de gebruiker eerst Evolu Relay wilde
afmaken; het is hernummerd naar 004 zodat de bovenkant van de reeks weer op
tier-orde staat. Proefopstelling zakt naar B en is klaar voor het archief: alle
vragen die het bezat zijn hier beantwoord, en de rest gaat over een pakket dat niet
meer bestaat.

De takenlijst is opgeschoond van regels die over het oude pakket gingen: de
Postgres-pin, de schemavraag, het adres op 3851 en de twee blokkades. In plaats
daarvan staan de twee images die nu nog ongepind zijn. En de controle of deze app
Electrum Gate raakt is afgevinkt met wat er werkelijk gebeurde: dat deed hij, via
een gedeelde containernaam, en dat is gerepareerd.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 13:59:15 +02:00

14 KiB
Raw Blame History

Taken - Umbrelapp

App: Evolu Relay. Prioriteit: B | Afhankelijk van:

Van A naar B op 28-08-2026: het doel van dit plan is gehaald en het restwerk wacht nergens op.

Actief sinds 25-08-2026. Gepromoveerd uit Masterplannen/ omdat de gebruiker besloot het pakket meteen te maken. De afhankelijkheid op Proefopstelling is daarmee geen blokkade meer maar een parallelle bron: fase 1 daarvan is af en leverde de feiten waarop dit pakket rust. Wat er nog uit moet komen zijn twee vragen die pas bij het installeren pijn doen, en die staan hieronder als eigen taak.

Dit is de focus vanaf 27-08-2026, op verzoek van de gebruiker. Het werk aan Electrum Gate is die dag afgerond tot en met de tweede indeling; het plan Eigenimage staat klaar maar ligt bewust stil. Twee feiten om mee te beginnen: de app staat op dit moment uit op de Umbrel, en hij is nog nooit met Trezor Suite verbonden geweest. "Gebouwd" is hier dus nog verder van "werkend" dan bij Gate.

Volgende stap

  • De kále Evolu-relay geprobeerd, en hij werkt (28-08-2026). Trezor Suite op de desktop stuurde elf labels naar docker.io/evoluhq/relay:latest en die kwamen aan: de database in het volume groeide van 40960 naar 49152 bytes. De protocolversie klopt, en daarmee is de richting uit OPEN.md punt 6 gemeten in plaats van verwacht. Het protocol en alle metingen staan in PLAN.md §6a
  • Uitgezocht waarom iOS niets doet (28-08-2026): het ligt aan het apparaat en niet aan dit pakket. De OwnerId wordt op de Trezor afgeleid, en het model van de gebruiker kan nog niet aan een iPhone gekoppeld worden. Zonder apparaat kent de app geen deviceStaticSessionId, en dan slaat Suite een label lokaal op en doet verder niets, zonder melding. De hele redenering met bronregels staat in OPEN.md punt 9
  • De leeskant gemeten en in orde (28-08-2026). Getest met een tweede gebruikersaccount op dezelfde Mac, en dat is schoner dan een tweede apparaat: die installatie heeft een lege lokale Evolu-database, dus alles wat daar verschijnt kan alleen van de relay komen. Dezelfde Trezor en dezelfde wallet, dus dezelfde OwnerId en geen nieuwe eigenaar. De labels kwamen door. Daarmee zijn beide richtingen bewezen
  • Besloten wat er met het huidige pakket gebeurt (28-08-2026): het gaat eruit. De relay van Trezor, de quota-manager en de Postgres vervallen. Wat ervoor in de plaats komt staat in PLAN.md §4g en §4h
  • De limiter gekozen (28-08-2026): weg 1, uitbreiden via createRelay. Dat bleek veel kleiner dan Bereikbaarheid §4b aannam: het zijn twee terugroepfuncties, isOwnerAllowed en isOwnerWithinQuota, en Trezor doet zelf niets anders. De gebruiker breidde het ontwerp uit met een schakelaar voor nieuwe eigenaars en met wissen per eigenaar. Zie OPEN.md punt 8
  • De vraag of het databaseschema zichzelf aanmaakt is vervallen. Hij ging over het pakket dat eruit gaat, en de kale relay maakt zijn database bij de start zelf aan; dat is op 28-08-2026 gezien

Fase 5 - De verbouwing naar de kale relay

Op 28-08-2026 in één sessie gedaan en op het apparaat draaiend, versie 0.3.0. Wat er staat: het eigen relay-programma met de allowlist, het bouwrecept, de compose met de omgedraaide poorten, de statuspagina, en TLS via Zoraxy op een eigen subdomein. De Mac synchroniseert eroverheen, met een geleerde eigenaar en een gesloten deur erna.

Wat er niet staat: iOS doet niets mee, en daardoor is de leeskant nooit gemeten. Beide staan hierboven bij "Volgende stap".

  • 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
  • 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
  • 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 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 omgezet (28-08-2026): pagina achter app_proxy mét de inlog, relay op host-poort 3852. Postgres, wachtwoord en quota-manager eruit; drie containers werden relay, agent en nginx. De image is gepind op tag plus digest
  • De statuspagina gebouwd (28-08-2026): index.html.template, nginx.conf.template en agent.py.template, met het ontwerpsysteem van Electrum Gate en zonder de Google Fonts-verwijzing. Toont of de relay draait, de omvang en het laatste schrijfmoment van de database, het adres dat je in Suite invult, en de eigenaars in drie lijsten met knoppen om te blokkeren, alsnog toe te laten of te vergeten. Nog nooit in een browser gezien
  • Het relay-programma op het apparaat geverifieerd (28-08-2026). Losgedraaid uit het register, buiten de app om. Het log meldde learned a new owner, en in /app/data stonden daarna evolu-relay.db van 49152 bytes (dezelfde omvang als bij de proef van vanochtend, dus de labels zijn geland) en owners.json van 241 bytes. Daarmee is de hele keten gemeten: isOwnerAllowed wordt aangeroepen met iets wat het beleid begrijpt, de leerstand werkt, en de allowlist gaat naar schijf
  • De pagina en de agent op het apparaat geverifieerd (28-08-2026). De pagina rendert, toont de gegevens van de relay, en de knop Close werkt: de leerstand ging naar closed en de geleerde eigenaar staat in de lijst met eerste en laatste verschijning. Daarmee is de hele keten gemeten, pagina → agent → postbus → relay-proces → schijf → pagina
  • De fout die dat opleverde is gerepareerd: de korte containernaam agent is op het gedeelde Docker-netwerk niet uniek, dus de helft van de verzoeken kwam bij Electrum Gate uit. Beide apps wijzen nu naar <app-id>_agent_1, en test_appstore_vorm.py toetst dat voortaan
  • De app opnieuw geïnstalleerd in plaats van geüpdatet (28-08-2026). De oude installatie was er eerst afgehaald, en dat was ook de nette weg: niet elk bestand bereikt een bestaande installatie via een update
  • Zoraxy ingericht (28-08-2026) op een eigen subdomein met TLS, doorverwijzend naar de relay-poort, met de WebSocket-upgrade aan. De handshake-curl uit PLAN.md §6a stap 3 geeft daar 101 Switching Protocols, en de desktop synchroniseert eroverheen

Fase 1 - De app-map

  • whatsnext-evolu-relay/ aangemaakt met umbrel-app.yml en docker-compose.yml (25-08-2026). Mapnaam gelijk aan het id, met het store-voorvoegsel whatsnext-, en de manifestvelden in de voorgeschreven volgorde
  • data/postgres/.gitkeep erin, zodat de mount bij de eerste start niet als root wordt aangemaakt
  • dependencies weggelaten en niet leeg gezet. Deze app hangt van geen enkele andere app af; een leeg veld zou suggereren dat er iets te kiezen valt
  • Een eigen icoon (28-08-2026). icon.png aangeleverd door de gebruiker, met de icon-regel in het manifest die naar de rauwe versie in deze repo wijst. Als laatste regel, want bij inlevering in de officiële store hoort hij weg

Fase 2 - De compose

  • app_proxy met PROXY_AUTH_ADD: "false", en geen eigen ports:. Trezor Suite is geen browser met een sessiecookie. Dit is het patroon van de eigen nostr-relay-app van Umbrel, dus een precedent en geen omweg; zie PLAN.md §4c
  • Relay en quota-manager uit één image met een ander command. Expliciet en niet leunend op de CMD van de Dockerfile, want daar staat yarn start met bovenstrooms zelf een twijfel erbij
  • De quota-manager gaat mee. Niet omdat de relay hem aanroept, maar omdat de relay elke eigenaar zonder limietenrij weigert en dit is wat die rijen maakt
  • Postgres onder ${APP_DATA_DIR}/data/postgres, wachtwoord uit ${APP_PASSWORD}, PGDATA op een submap, en postgres:17-alpine in plaats van postgres kaal
  • Healthcheck op de eigen database en gebruiker, niet op -d postgres zoals bovenstrooms: die database bestaat hier niet, en dan is de controle groen op het verkeerde antwoord
  • De eigen image gepind op tag plus digest (25-08-2026). sc.kamenier-hamer.nl/sysop/evolu-relay:c03a204@sha256:2fe1e9e9…, op beide services. Dat moest wel: zie fase 4. Let op dat dit één architectuur is (amd64), want er is alleen amd64 geduwd. Voor de officiele store hoort er een multi-arch index-digest met arm64 in; dat staat bij Publicatie-Relay
  • De Postgres-pin is vervallen (28-08-2026): die database zit niet meer in de app
  • python:3-alpine en nginx:alpine pinnen op hun multi-arch index-digest. Dat zijn de twee laatste ongepinde images van deze app, en ze staan als TODO in de compose. Met docker buildx imagetools inspect op de Umbrel. Electrum Gate heeft precies dezelfde twee openstaan, dus dit is één handeling voor beide apps

Fase 3 - Het bouwrecept

  • tools/evolu-relay/build.sh (25-08-2026). Haalt de broncode op een vastgezette commit en bouwt de Dockerfile van Trezor. Niet hun bouwstappen nabouwen; wat wij toevoegen is de pin
  • Niet in de app-map gezet, en dat is geen netheid. Een Dockerfile staat niet in de update-whitelist, dus bouwen-in-de-app zou elke nieuwe versie een herinstallatie kosten. Zie PLAN.md §4f
  • Onder tools/ en niet onder build/: dat laatste staat in .gitignore als bouwselmap, dus het recept zou stilzwijgend buiten de repo blijven. Gevonden bij het stagen, niet bij het schrijven
  • Het script controleert na het ophalen dat de commit is wat hij verwachtte, en faalt hard als dat niet zo is. Zonder die regel bouwt het stil de verkeerde toestand

Fase 4 - Installeren en verifiëren op de Umbrel

Niets hiervan is op een laptop te doen. Eigenaar van deze hele fase: gebruiker.

  • De image gebouwd op de Umbrel (25-08-2026), in 50 seconden. Twee dingen die het opleverde: de gebruiker umbrel zit hier níet in de groep docker, dus het moet met sudo; en de Dockerfile van Trezor bouwt zonder aanpassing
  • In een register gezet, want anders kan umbreld er niet bij (25-08-2026). Dit was de grote verrassing van de dag en het staat met bron in Umbrel-appstore-spec.md: umbreld haalt élke image via de Docker Engine API op, niet via compose. Een lokaal gebouwde tag is dus onbereikbaar en pull_policy: never doet niets, want de compose wordt niet gelezen om te pullen. Het Gitea-register op dezelfde server als de store bleek de kortste weg, en anoniem halen werkt daar
  • De app geïnstalleerd en alle drie de containers blijven draaien (25-08-2026). relay, quota-manager en db, met db op healthy en de app-proxy op 3851. De lokale images waren vooraf weggehaald, dus de pull uit het register is echt gedaan en het hele pad is bewezen: broncode → bouwrecept → register → gepinde digest → installatie
  • De schemavraag is vervallen (28-08-2026): de kale relay maakt zijn SQLite bij de start zelf aan, en de Postgres waar deze vraag over ging zit niet meer in de app
  • Trezor Suite synchroniseert (28-08-2026), heen én terug. Niet naar 3851 zoals hier stond maar naar 3852: de poorten zijn omgedraaid, want 3851 draagt nu de statuspagina. Zie de "Volgende stap" hierboven
  • De app gestopt en gestart, en de data heeft het overleefd. Nog niet gedaan, en het is de laatste controle van dit plan die er echt toe doet: de allowlist en de labels staan onder ${APP_DATA_DIR}/data/relay, dus een herstart hoort niets te kosten. Eigenaar: gebruiker
  • Gecontroleerd of het toevoegen van deze app Electrum Gate raakt (28-08-2026), en dat deed het. Niet zoals verwacht via poorten of geheugen, maar via een naam: beide apps hadden een service agent op hetzelfde Docker-netwerk, en Docker verdeelde de naam over allebei. De pagina van Gate ging daardoor stuk. Gerepareerd in beide apps, met een toets in test_appstore_vorm.py zodat het niet stil terugkomt

Geblokkeerd / wacht op

Leeg sinds 28-08-2026. Beide blokkades zijn opgeheven en ze staan hier voor de geschiedenis.

  • "Hoe registreer je een eigenaar bij de quota-manager?" is vervallen: de quota-manager zit niet meer in de app, en de kale relay kent geen limietentabel. De vraag bestond alleen bij het pakket van Trezor
  • "Accepteert Trezor Suite dit adres, en in welke vorm?" is beantwoord: ja, met http(s):// en desgewenst een pad, zowel via het dev-utils-veld als via de gewone "Custom server"-instelling. Gemeten op de desktop, heen en terug