Webinterface is af en zakt naar B, Eigenimage neemt het over
De opruimronde eerst. Zes vinkjes stonden open terwijl het werk gedaan was: open punt 5, fase 5, "draaien op de Umbrel", "verifiëren tegen een echte status.json", en het nakijken van de eerste indeling op een breed scherm, een indeling die na fase 6 niet meer bestaat. Elk staat nu afgevinkt met de reden erbij, want een regel wegpoetsen laat de vraag "is dit ooit gebeurd" open. Ook de regel "Niets" onder Geblokkeerd is geen vinkje meer. Een leeg vakje bij het woord niets telt mee zodra iemand de openstaande punten telt, en dat is precies wat die kop moet uitsluiten. Wat er in Webinterface overblijft is niet te plannen of ligt bij de gebruiker: een etmaal wachten op het log, waar Nginx Proxy Manager zijn certificaten neerzet, en of Zoraxy een harde afhankelijkheid wordt. Vandaar tier B. Eigenimage is daarmee gepromoveerd naar Actief met nummer 006 en tier A, zoals op 27-08 afgesproken. Het masterplan is omgezet: de drie open beslissingen zijn naar OPEN.md gegaan, het werk naar TAKEN.md in vier fasen, en PLAN.md houdt het ontwerp. Het origineel blijft nog even staan; dat verhuist pas naar Archief nu deze commit er is. De eerste stap daar is geen bouwtaak maar een vraag: blijft het Gitea-register ook bij publicatie de bron. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -23,7 +23,7 @@
|
||||
|
||||
| Plan | App | Volgende stap | Status |
|
||||
|-|-|-|-|
|
||||
| [Webinterface](Plannen/Actief/005-Webinterface/TAKEN.md) | Gate | **Fase 6 draait en is goedgekeurd op een breed scherm; de bijstellingen zitten in 0.0.18.** Nog te doen: nakijken op een telefoon (de stap van vijf naar drie naar twee kolommen, en de dialoog op smal), en het uploaden op het niet-gelukkige pad. Allebei bij de gebruiker | 🔶 |
|
||||
| [Eigenimage](Plannen/Actief/006-Eigenimage/TAKEN.md) | Gate | **Beantwoord eerst open punt 1: blijft het Gitea-register ook bij publicatie de bron?** Dat bepaalt waar `build.sh` naartoe duwt. Daarna fase 1: het bouwrecept in `tools/electrum-gate/`, multi-arch, en anoniem te halen. Let op §1 van het plan: het lost níet het updateprobleem op, want dat bestaat niet meer | ⬜ |
|
||||
| [Umbrelapp](Plannen/Actief/008-Umbrelapp/TAKEN.md) | Relay | **Hij draait sinds 25-08-2026, maar kan in de kern niet werken.** Uit de broncode van Suite: bij een eigen relay-URL registreert de cliënt geen eigenaar, terwijl Trezor's relay iedereen zonder limietenrij weigert. Volgende stap is de kále Evolu-relay proberen (`docker.io/evoluhq/relay:latest`, één container, gepubliceerde image) en waarschijnlijk daarnaartoe verbouwen. Zie open punt 6 | 🔶 |
|
||||
| [Proefopstelling](Plannen/Actief/007-Proefopstelling/TAKEN.md) | Relay | **Eerst beslissen of dit plan nog bestaansrecht heeft.** Fase 1 is af, maar fase 2 en 3 zijn ingehaald: het pakket draait al op de Umbrel, dus een lokale opstelling ernaast meet minder en kost meer. Wat overblijft zijn twee vragen die al als blokkade in **Umbrelapp** staan, en die horen op één plek | 🔶 |
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
|
||||
| Plan | App | Volgende stap | Status |
|
||||
|-|-|-|-|
|
||||
| [Webinterface](Plannen/Actief/005-Webinterface/TAKEN.md) | Gate | **De pagina is af en goedgekeurd, op een breed scherm én op een telefoon (27-08-2026).** Van A naar B: wat er nog staat wacht op tijd (het activiteitenlog een etmaal laten lopen) of is een beslissing van de gebruiker (waar Nginx Proxy Manager zijn certificaten neerzet, en of Zoraxy een harde afhankelijkheid wordt) | 🔶 |
|
||||
| [Appstore](Plannen/Actief/010-Appstore/TAKEN.md) | Gate | De repo `ElectrumTLS` weghalen op de Git-server; daar staat het domein nog in de historie. **De omschakeling naar Fulcrum is op 27-08-2026 gelukt zonder aanpassing**, dus daarvan is alleen de herstartcontrole nog over, en die komt vanzelf bij de eerstvolgende herstart | 🔶 |
|
||||
|
||||
## C - Wacht op afhankelijkheid
|
||||
@@ -64,7 +65,6 @@ daaronder, dus deze tabel en de mapinhoud kunnen niet uit elkaar lopen.
|
||||
| [Bereikbaarheid.PLAN.md](Plannen/Masterplannen/Bereikbaarheid.PLAN.md) | Relay | Umbrelapp: er valt niets bereikbaar te maken zolang er niets draait | Synchroniseren buiten het thuisnetwerk. **Suite eist geen TLS**, dus Tailscale blijft open en een certificaat is geen voorwaarde. Het risico van een publiek eindpunt is niet vertrouwelijkheid (dat regelt de versleuteling) maar misbruik als gratis opslag: een kale relay kent geen accounts. Wil je tóch open, dan is een eigenaars-allowlist nodig; drie manieren in §4b |
|
||||
| [Publicatie-Relay.PLAN.md](Plannen/Masterplannen/Publicatie-Relay.PLAN.md) | Relay | Umbrelapp, plus een image die te pinnen valt | Inleveren bij de officiële appstore. Twee dingen kunnen dit blokkeren: een image die niet als multi-arch digest in een registry bestaat, en de eis dat de umbrelOS-inlog aan blijft terwijl de relay een cliënt zonder sessie moet bedienen |
|
||||
| [Publicatie-Gate.PLAN.md](Plannen/Masterplannen/Publicatie-Gate.PLAN.md) | Gate | Appstore: de herstart-controle | **Doel van de gebruiker sinds 20-08-2026:** de app inleveren als standaard-app voor Umbrel. Dat verandert de maatstaf van "hij werkt hier" naar "iemand anders keurt het pakket goed". Het meeste is al goed; wat er nog moet is de images pinnen, het app-id kaal maken en de manifestvelden op orde. Het risico zit niet in die lijst maar in de leesmount op de certificaten van Zoraxy |
|
||||
| [Eigenimage.PLAN.md](Plannen/Masterplannen/Eigenimage.PLAN.md) | Gate | – | **Aan de beurt na Webinterface** (besloten 27-08-2026; een volgordekeuze, geen harde afhankelijkheid, vandaar het streepje hiernaast). Van de code die nu uit `app-data` gemount wordt een eigen image maken, in het eigen Gitea-register. **Het lost níet het updateprobleem op**, want alle code staat al in een `*.template` en die staan in de whitelist. Wat het wel doet: code uit `app-data`, het shell-blok van honderd regels uit de compose, en één eigen digest in plaats van twee vreemde. Kosten: een bouwronde per wijziging, en multi-arch is nog nooit geprobeerd |
|
||||
| [Configuratie.PLAN.md](Plannen/Masterplannen/Configuratie.PLAN.md) | Gate | – | **Grotendeels ingehaald op 19-08-2026** en moet opgeschoond worden voordat promotie nog zin heeft: de agent doet de certificaatbronnen en de keuze al, en het hardgecodeerde domein is uit de compose en uit `nginx.conf.template` verdwenen. Wat er nog in zit is een configuratiebestand voor de poort- en padoverstemmingen, plus de README |
|
||||
|
||||
Cross-plan kennis staat in [KNOWLEDGE.md](KNOWLEDGE.md). Naslag staat niet in deze boom maar in
|
||||
|
||||
@@ -1,12 +1,21 @@
|
||||
# Taken - Webinterface
|
||||
|
||||
> Prioriteit: **A** | Wacht op: –
|
||||
> Prioriteit: **B** | Wacht op: –
|
||||
>
|
||||
> **Wat hierna komt, besloten door de gebruiker op 27-08-2026: het masterplan Eigenimage.** Dat is geen
|
||||
> afhankelijkheid maar een volgordekeuze, en de reden staat aan die kant: een eigen image maakt van elke
|
||||
> wijziging een bouwronde, en dat remt precies het itereren op de pagina dat dit plan nog doet. Rond je dit
|
||||
> plan af, promoveer **Eigenimage** dan naar `Actief/` met een nieuw tussennummer, en beantwoord eerst open
|
||||
> punt 1 daar: blijft het Gitea-register ook bij publicatie de bron. **Eigenaar van die vraag: gebruiker**
|
||||
> **Van A naar B op 27-08-2026, na fase 6.** De pagina is af en goedgekeurd door de gebruiker, op een breed
|
||||
> scherm én op een telefoon: "helemaal zoals ik het gewild heb". Wat er nog staat is niet te plannen (een
|
||||
> etmaal wachten op het log) of het is een beslissing van de gebruiker (Nginx Proxy Manager, Zoraxy als
|
||||
> harde afhankelijkheid). Er is niets meer dat een sessie zelf kan oppakken, en dat is precies wat tier B
|
||||
> betekent.
|
||||
>
|
||||
> **Eigenimage is dezelfde dag gepromoveerd naar `Actief/` en heeft tier A overgenomen**, zoals de
|
||||
> gebruiker op 27-08-2026 besloot. Beantwoord daar eerst open punt 1: blijft het Gitea-register ook bij
|
||||
> publicatie de bron. Dit plan houdt zijn nummer 005; alleen het gepromoveerde plan kreeg een nieuw
|
||||
> tussennummer.
|
||||
>
|
||||
> **Bij het opruimen op 27-08-2026 zijn zes vinkjes rechtgezet** die door de gebeurtenissen ingehaald
|
||||
> waren: open punt 5, fase 5, "draaien op de Umbrel", "verifiëren tegen een echte status.json", en het
|
||||
> nakijken van de eerste indeling op een breed scherm, een indeling die niet meer bestaat.
|
||||
>
|
||||
> **Van C naar B naar A op 20-08-2026, op één dag.** Eerst verviel de blokkade "de app geïnstalleerd en de
|
||||
> agent draaiend". Aan het eind van die dag is dit het enige plan met werk dat nú te doen is: **Appstore**
|
||||
@@ -61,8 +70,8 @@ Daarna, en niet eerder:
|
||||
- [ ] Uitzoeken waar Nginx Proxy Manager op umbrelOS zijn certificaten neerzet. De mount staat
|
||||
uitgecommentarieerd in `docker-compose.yml`: een gok invullen zou Docker een lege maphierarchie
|
||||
laten aanmaken in de app-data van een app die er misschien niet eens is
|
||||
- [ ] Open punt 5: laten controleren of de TLS-poort zélf antwoordt. Dat is nu het enige wat de app niet
|
||||
over zichzelf weet, en het is zijn enige taak
|
||||
- [x] **Open punt 5: gebouwd in 0.0.16 en bevestigd op het apparaat** (27-08-2026). Zie fase 6 voor wat de
|
||||
controle wel en niet bewijst
|
||||
- [x] **Open punt 6: een certificaat uploaden via de pagina. Gebouwd in 0.0.7** (20-08-2026). Beschrijfbare
|
||||
mount voor de agent, een eigen nginx-locatie met een grotere limiet, en validatie met
|
||||
`load_cert_chain` voordat er iets geplaatst wordt. De bestandsnaam komt uit het certificaat zelf,
|
||||
@@ -70,15 +79,13 @@ Daarna, en niet eerder:
|
||||
- [ ] Open punt 7: beslissen of Zoraxy een harde afhankelijkheid wordt. "Zoraxy of NPM" kan niet, en dat
|
||||
is op 20-08-2026 in de bron nagetrokken; alleen de wens staat nog open. Zie [OPEN.md](OPEN.md)
|
||||
punt 7
|
||||
- [ ] Fase 5, het activiteitenlog, als de gebruiker het wil
|
||||
- [x] **Fase 5, het activiteitenlog: gebouwd en uitgerold** in 0.0.6, verfijnd in 0.0.14. Zie de fase zelf
|
||||
|
||||
De drie controles op `openssl`, `nc` en de WebDAV-module zijn **vervallen** met de komst van de agent: die
|
||||
doet dat werk zelf met de standaardbibliotheek. Zie [PLAN.md](PLAN.md) §4a0.
|
||||
|
||||
Daarna, in deze volgorde:
|
||||
|
||||
- [ ] Fase 2 bouwen op de uitkomst van die controle
|
||||
- [ ] Fase 5, als de gebruiker de wallet-activiteit wil
|
||||
Hier stonden nog twee regels die naar fase 2 en fase 5 vooruitwezen. Allebei **vervallen op 27-08-2026 bij
|
||||
het opruimen**: die fasen zijn af, en een vooruitwijzing naar afgerond werk leest als openstaand werk.
|
||||
|
||||
## Fase 1 - Het liegen eruit
|
||||
|
||||
@@ -110,7 +117,7 @@ shell-lus in de compose. Onderbouwing in [PLAN.md](PLAN.md) §4a0.
|
||||
staat. Zie [PLAN.md](PLAN.md) §4c: liever minder informatief dan onwaar
|
||||
- [x] De lus valt nooit stil: een mislukte ronde wordt gelogd en overgeslagen. Stoppen zou de pagina op
|
||||
oude gegevens bevriezen, en dat is precies het liegen dat dit plan moest afschaffen
|
||||
- [ ] Draaien op de Umbrel. Niets hiervan is buiten de tests uitgevoerd
|
||||
- [x] **Draait op de Umbrel sinds 20-08-2026.** Deze regel stond er nog van vóór de installatie
|
||||
|
||||
## Fase 3 - De pagina vult zichzelf
|
||||
|
||||
@@ -122,7 +129,8 @@ shell-lus in de compose. Onderbouwing in [PLAN.md](PLAN.md) §4a0.
|
||||
wat er al onder de blokhoogte, in de badge bij de Electrum-server en in de voettekst stond
|
||||
- [x] Leesbare melding als het bestand ontbreekt, zonder dat het op een fout lijkt.
|
||||
Zie [OPEN.md](OPEN.md) punt 1
|
||||
- [ ] Verifiëren tegen een échte `status.json` in plaats van tegen de voorbeeldversie uit de preview
|
||||
- [x] **Geverifieerd tegen een échte `status.json`** sinds de app draait (20-08-2026), en sindsdien bij
|
||||
elke release opnieuw
|
||||
|
||||
## Fase 4a - De indeling
|
||||
|
||||
@@ -161,8 +169,8 @@ Vastgesteld door de gebruiker op 19-08-2026 na het bekijken van de eerste versie
|
||||
- [x] **Het losse verbindingsadres met kopieerknop eruit**, plus het label "tested clients". Zonder
|
||||
verlies: hetzelfde adres staat bij elke clientregel, in de vorm die díe client wil, met een
|
||||
kopieerknop erbij. Het instelkader werd daarmee 533px in plaats van 610px
|
||||
- [ ] Nog niet met eigen ogen gezien op een echt breed scherm; gecontroleerd via de afmetingen van de
|
||||
kaders, niet visueel, want het browserpaneel stond dicht
|
||||
- [x] **Vervallen: deze indeling bestaat niet meer.** De regel ging over het nakijken van fase 4a op een
|
||||
breed scherm, en fase 6 heeft die indeling op 27-08-2026 vervangen. Wat er nagekeken is, staat daar
|
||||
|
||||
## Fase 4 - Bruikbaar in plaats van alleen eerlijk
|
||||
|
||||
@@ -175,7 +183,8 @@ Vastgesteld door de gebruiker op 19-08-2026 na het bekijken van de eerste versie
|
||||
terugval met `execCommand` is daar het pad dat gebruikt wordt en niet de uitzondering. Wat op
|
||||
19-08-2026 lokaal wél bewezen is: de **faalroute** meldt "Press Ctrl+C" in plaats van stil niets te
|
||||
doen. De geslaagde route vraagt een echte muisklik, want de clipboard-API weigert een klik die uit
|
||||
een script komt
|
||||
een script komt. **Sinds 0.0.17 zijn het er twee in plaats van tien**, allebei in het dichtgeklapte
|
||||
instelkader, dus het is één klik om te proberen. **Eigenaar: gebruiker**
|
||||
|
||||
## Fase 4b - De certificaatkeuze
|
||||
|
||||
@@ -292,4 +301,7 @@ de vijfde widget; de rest is de pagina verbouwen om wat er dan staat.
|
||||
|
||||
## Geblokkeerd / wacht op
|
||||
|
||||
- [ ] Niets. De afhankelijkheid van **Configuratie** is vervallen, zie [PLAN.md](PLAN.md)
|
||||
Niets. De afhankelijkheid van **Configuratie** is vervallen, zie [PLAN.md](PLAN.md).
|
||||
|
||||
Als platte regel en niet als vinkje (opgeruimd 27-08-2026): een leeg vakje bij het woord "niets" telt mee
|
||||
als openstaand werk zodra iemand de vinkjes telt, en dat is precies wat deze kop moet uitsluiten.
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
# Open punten - Eigenimage
|
||||
|
||||
> Beslissingen die nog een **eigenaar** of een **moment** nodig hebben. Staat een punt hier zonder
|
||||
> allebei, dan is dat de eerste fout om op te lossen. Wordt een punt een taak, dan verhuist het naar
|
||||
> [TAKEN.md](TAKEN.md).
|
||||
>
|
||||
> **Nummers blijven staan**, ook als een punt beslist is: er kan elders naar verwezen worden, ook vanuit
|
||||
> codecommentaar. Beslissen betekent verplaatsen naar de kop hieronder, niet hernummeren.
|
||||
>
|
||||
> Deze drie punten stonden als §7 in het masterplan en zijn bij de promotie op 27-08-2026 hierheen
|
||||
> verhuisd.
|
||||
|
||||
## Nog te beslissen
|
||||
|
||||
1. **Blijft het Gitea-register ook bij publicatie de bron?** Voor eigen gebruik is het antwoord ja, en het
|
||||
is bewezen: Evolu Relay draait er sinds 25-08-2026 op, inclusief een gecontroleerde anonieme pull. Voor
|
||||
het masterplan **Publicatie-Gate** zitten er twee bezwaren aan die geen van beide een spec-eis zijn maar
|
||||
allebei echt:
|
||||
|
||||
- **het domein van de gebruiker komt in de compose van een publieke repo**, en dat is precies wat het
|
||||
plan **Configuratie** eruit gehaald heeft. Nu staat het in de store-URL van een repo die niemand
|
||||
aangekondigd heeft; dan zou het in het pakket staan dat aan de officiële store aangeboden wordt;
|
||||
- **iedereen die de app installeert haalt dan een image van de thuisserver van de gebruiker.** Dat maakt
|
||||
die server een afhankelijkheid van andermans installatie, met het verkeer en de beschikbaarheid die
|
||||
daarbij horen.
|
||||
|
||||
De spec eist alleen `registry/repo:versie-of-commit@sha256:<digest>` met beide architecturen, en zegt
|
||||
niets over wélk register. Gitea voldoet dus aan de letter. De vraag is of je dat wilt.
|
||||
|
||||
**Dit is het punt dat vóór de eerste taak beantwoord moet zijn**, want het bepaalt waar `build.sh` naar
|
||||
duwt en wat er in de compose komt te staan. Een antwoord "voor nu Gitea, bij inlevering opnieuw kijken"
|
||||
is een geldig antwoord en waarschijnlijk het goede; het staat dan tenminste opgeschreven.
|
||||
**Moment:** vóór fase 1 · **Eigenaar:** gebruiker
|
||||
|
||||
2. **Eén image of twee?** [PLAN.md](PLAN.md) §6 stelt één voor: de agent en nginx blijven twee containers,
|
||||
maar ze delen één image. Twee images is netter gescheiden en verdubbelt het bouwwerk en het pinwerk.
|
||||
**Moment:** bij de start van het werk · **Eigenaar:** sessie, met de gebruiker mee
|
||||
|
||||
3. **Waar wordt gebouwd?** Op de Umbrel staat Docker, maar dat is een productiemachine en hij is amd64,
|
||||
terwijl arm64 ook een eis is. Bouwen op de werkplek van de gebruiker vraagt daar Docker. Dit hangt samen
|
||||
met de multi-arch-stap uit §4 van het plan, die nog nooit geprobeerd is.
|
||||
**Moment:** bij de start van het werk · **Eigenaar:** gebruiker
|
||||
|
||||
## Beslist
|
||||
|
||||
Nog niets.
|
||||
@@ -0,0 +1,163 @@
|
||||
# Eigenimage - plan
|
||||
|
||||
> **App: Electrum Gate**, met een korte paragraaf over wat het voor Evolu Relay betekent (§8). Voorgesteld
|
||||
> door de gebruiker op 27-08-2026: van de uitvoerbare bestanden die nu in de app-map staan een image maken
|
||||
> en die in het eigen Gitea-register zetten.
|
||||
>
|
||||
> **Gepromoveerd van masterplan naar `Actief/` op 27-08-2026**, toen **Webinterface** afgerond was; dat was
|
||||
> de volgorde die de gebruiker die dag afsprak. Het origineel staat in `Plannen/Masterplannen/Archief/` en
|
||||
> is historie: hier wordt gewerkt.
|
||||
>
|
||||
> Taken staan in [TAKEN.md](TAKEN.md), de open beslissingen in [OPEN.md](OPEN.md). §7 en §9 hieronder zijn
|
||||
> daarheen verhuisd en staan er niet meer; wat hier blijft is het ontwerp en de afweging.
|
||||
|
||||
## 1. Waar dit over gaat, en wat het uitdrukkelijk níet oplost
|
||||
|
||||
Electrum Gate is de enige app in deze store zonder eigen image. Hij draait op `python:3-alpine` en
|
||||
`nginx:alpine` en mount zijn eigen programmacode uit `app-data`. Dat is geen ongeluk maar een besluit uit
|
||||
het plan **Appstore**: geen eigen image bouwen betekende toen geen bouwstap, geen register en geen
|
||||
inloggegevens, en de app werkte.
|
||||
|
||||
Dit plan stelt dat besluit ter discussie, en het begint met wat het **niet** is:
|
||||
|
||||
**Dit is geen oplossing voor het updateprobleem, want dat is er niet meer.** De valkuil die dit project een
|
||||
dag gekost heeft is dat een update alleen een whitelist ververst. Maar `*.template` staat in die whitelist,
|
||||
en alle code van deze app staat inmiddels in een `.template`-bestand: `agent.py.template`,
|
||||
`index.html.template`, `nginx.conf.template` en `stream.conf.template`. Een `git push` met een
|
||||
versieverhoging bereikt een bestaande installatie dus gewoon. Wie dit plan verkoopt met "dan komen
|
||||
wijzigingen eindelijk aan", verkoopt iets wat al werkt.
|
||||
|
||||
Er is één uitzondering en die is echt: **`icon.png` is geen template** en bereikt een bestaande installatie
|
||||
nooit. Dat staat als zodanig in de compose. Voor een plaatje dat vrijwel nooit wijzigt is dat goed genoeg,
|
||||
en het is te klein om dit plan op te bouwen.
|
||||
|
||||
Wat het wél is, staat in §3.
|
||||
|
||||
## 2. Wat er vandaag uit `app-data` gemount wordt
|
||||
|
||||
De inventaris, want dit is precies de lijst die in een image zou verdwijnen.
|
||||
|
||||
| Bestand | Container | Wat het is |
|
||||
|-|-|-|
|
||||
| `agent.py` | agent | het programma: certificaten lezen, de Electrum-server bevragen, `status.json` schrijven, de keuze aannemen |
|
||||
| `nginx.conf` | server | de configuratie van de pagina en de proxy naar de agent |
|
||||
| `stream.conf` | server | het TLS-blok voor poort 50022, bewust apart |
|
||||
| `index.html` | server | het dashboard |
|
||||
| `icon.png` | server | het plaatje in de kop en het tabblad |
|
||||
| het `command`-blok | server | ruim honderd regels shell in `docker-compose.yml`: log-format, TLS aan- en uitzetten, de sessieteller en de herlaadlus |
|
||||
|
||||
Die laatste regel is de interessantste. Dat blok staat in de compose omdat de compose in de whitelist
|
||||
staat, en het moet daar dollartekens ontsnappen als `$$` omdat umbreld elk `${...}` in een template
|
||||
leegmaakt. Het is dus shell in een YAML-string met een eigen ontsnappingsregel eroverheen: het enige stuk
|
||||
van deze app waar de vorm door de verpakking bepaald wordt en niet door wat het doet.
|
||||
|
||||
## 3. Wat een eigen image oplevert
|
||||
|
||||
Op volgorde van hoe zwaar het weegt.
|
||||
|
||||
1. **De programmacode gaat uit `app-data`.** Dat is de afwijking die de gebruiker zelf opmerkte op
|
||||
20-08-2026, uitgezocht in `Umbrel-appstore-spec.md`: bij andere apps staat in `app-data` alleen
|
||||
configuratie en data, want hun code zit in een image. Voor eigen gebruik is dat cosmetisch. Voor het
|
||||
masterplan **Publicatie-Gate** is het meer dan dat, want daar kijkt iemand anders naar het pakket.
|
||||
2. **Het `command`-blok wordt een gewoon script.** Een `entrypoint.sh` in de image is te lezen, te
|
||||
controleren en desnoods te testen, en hoeft geen dollartekens te verdubbelen. Dat is de grootste
|
||||
inhoudelijke winst en de enige die de code zelf beter maakt.
|
||||
3. **Eén digest in plaats van twee vreemde.** De pin-eis uit **Publicatie-Gate** gaat nu over
|
||||
`python:3-alpine` en `nginx:alpine`, images van iemand anders die bij elke beveiligingsupdate opnieuw
|
||||
gepind moeten worden. Met een eigen image pin je één ding dat je zelf uitgeeft. Let op de andere kant
|
||||
hiervan: de basisimage zit dan ín jouw image, dus het onderhoud verdwijnt niet, het verhuist naar het
|
||||
bouwrecept.
|
||||
4. **`icon.png` wordt updatebaar**, zie §1.
|
||||
|
||||
## 4. Wat het kost, en dit is de reden dat het moment ertoe doet
|
||||
|
||||
**Elke wijziging wordt een bouwronde.** Vandaag is een wijziging aan het dashboard: bestand aanpassen,
|
||||
`version` ophogen, committen, in umbrelOS updaten. Met een eigen image wordt dat: aanpassen, bouwen, naar
|
||||
het register duwen, de digest opzoeken, de compose bijwerken, `version` ophogen, committen, updaten. Dat is
|
||||
geen ramp, maar het is een veelvoud, en het moet op de machine met Docker gebeuren en niet op de machine
|
||||
waar geschreven wordt.
|
||||
|
||||
Dat is precies het probleem met "nu": het plan **Webinterface** staat op tier A en itereert op
|
||||
`index.html.template`. Een bouwronde per UI-wijziging remt het plan dat op dit moment het meeste oplevert.
|
||||
|
||||
**Multi-arch is een tweede kostenpost.** De eis is `linux/amd64` én `linux/arm64` in de manifest-lijst. De
|
||||
Umbrel van de gebruiker is amd64 (vastgesteld 20-08-2026 uit de nginx-startlog), dus een `docker build`
|
||||
daar levert de helft. Dat vraagt `buildx` met QEMU, en dat is trager en kan bij een Python-image met
|
||||
gecompileerde afhankelijkheden stukgaan. Deze app heeft die afhankelijkheden niet, dus de kans is klein,
|
||||
maar hij is niet nul en het is nog nooit geprobeerd.
|
||||
|
||||
## 5. Het register: Gitea werkt, en dat is bewezen
|
||||
|
||||
Dit is het deel waar het minste onzeker aan is, want de weg is al een keer gelopen.
|
||||
|
||||
Op 25-08-2026 faalde de eerste installatie van Evolu Relay met `pull access denied` op een image die alleen
|
||||
lokaal gebouwd was. De verklaring staat in `Umbrel-appstore-spec.md`: umbreld haalt elke image zelf op via
|
||||
de Docker Engine API, dus lokaal bouwen bestaat niet voor hem en `pull_policy: never` verandert daar niets
|
||||
aan. De oplossing werd het Gitea-register op dezelfde server als de store,
|
||||
`sc.kamenier-hamer.nl/sysop/evolu-relay`, gepind op tag plus digest.
|
||||
|
||||
Twee dingen zijn daarbij al vastgesteld en gelden hier onverkort:
|
||||
|
||||
- **anoniem halen moet werken**, want umbreld krijgt geen inloggegevens mee. Controleer dat met een
|
||||
uitgelogde pull in dezelfde context waarin je inlogde, anders meet je je eigen sessie. Het commando staat
|
||||
onderaan `tools/evolu-relay/build.sh`;
|
||||
- **het bouwrecept hoort in `tools/`**, nooit in de app-map. Een `Dockerfile` staat niet in de
|
||||
update-whitelist, dus bouwen-in-de-app kost bij elke versie een deïnstallatie.
|
||||
|
||||
## 6. Hoe het eruit zou zien
|
||||
|
||||
Eén image, niet twee. De agent en nginx blijven wel twee containers, want ze doen verschillend werk en de
|
||||
sessieteller moet in de netwerk-namespace van nginx zitten; maar één image met beide erin scheelt een
|
||||
bouwrecept, en `nginx` plus `python3` in één alpine is klein.
|
||||
|
||||
```
|
||||
tools/electrum-gate/
|
||||
Dockerfile de basisimage, agent.py, de nginx-configuratie, de pagina, entrypoint.sh
|
||||
build.sh pin op de basisimage, bouwt multi-arch, duwt naar het register, drukt de digest af
|
||||
```
|
||||
|
||||
Wat er in de app-map overblijft: `docker-compose.yml`, `umbrel-app.yml`, `icon.png` en `data/` met zijn
|
||||
twee `.gitkeep`-bestanden. De compose houdt zijn `environment`-blok, want dat is hoe
|
||||
`${APP_ELECTRS_NODE_IP}` binnenkomt, en die weg is op 27-08-2026 juist bewezen bij de omschakeling naar
|
||||
Fulcrum.
|
||||
|
||||
Eén ding om bij het ontwerp niet over te slaan: `index.html.template` bevat vandaag
|
||||
`${APP_ELECTRS_NODE_IP}:${APP_ELECTRS_NODE_PORT}`, ingevuld door umbreld bij het starten. Zit de pagina in
|
||||
de image, dan bestaat die invulling niet meer en moet het adres langs de omgeving naar binnen, bijvoorbeeld
|
||||
doordat de agent het in `status.json` zet en de pagina het daaruit leest. Dat is werk dat nu nog gratis is
|
||||
en straks niet meer.
|
||||
|
||||
## 7. Open punten
|
||||
|
||||
Verhuisd naar [OPEN.md](OPEN.md) bij de promotie op 27-08-2026. Het gaat om drie vragen: blijft het
|
||||
Gitea-register ook bij publicatie de bron, wordt het één image of twee, en waar wordt er gebouwd. De eerste
|
||||
moet vóór de eerste taak beantwoord zijn.
|
||||
|
||||
Dit kopje blijft staan met deze verwijzing en is niet weggehaald, want de nummering van de paragrafen
|
||||
hierna wordt elders aangehaald.
|
||||
|
||||
## 8. Wat dit voor Evolu Relay betekent
|
||||
|
||||
Voor die app is dit plan grotendeels al uitgevoerd: `tools/evolu-relay/build.sh` bestaat, het register is
|
||||
gekozen en de anonieme pull is gecontroleerd. Wat hier eventueel bijkomt is de multi-arch-stap, want ook
|
||||
dat recept bouwt vandaag één architectuur.
|
||||
|
||||
**Trek dat werk niet in dit plan.** Het plan **Umbrelapp** staat op tier A met de conclusie dat de
|
||||
gepakketteerde relay in de kern niet kan werken, en dat de volgende stap de kale
|
||||
`docker.io/evoluhq/relay:latest` is. Wordt dat de weg, dan is er een gepubliceerde image en vervalt het
|
||||
hele bouwrecept. Iets verbeteren aan een recept dat misschien weggaat, is de verkeerde volgorde.
|
||||
|
||||
## 9. Waarom dit nú actief is
|
||||
|
||||
**Beslist door de gebruiker op 27-08-2026: na Webinterface**, en dat moment is er. Dat was dezelfde
|
||||
afweging als waarom de pin-eis in **Publicatie-Gate** op "niet nu doen" staat: zolang er nog gedraaid en
|
||||
verbeterd wordt, betaalt elke wijziging de bouwronde uit §4 en levert het niets op wat er dan ontbreekt.
|
||||
**Webinterface** iterereerde die dag juist op de pagina, en dat was het werk dat er het meeste onder zou
|
||||
lijden. Dat plan is dezelfde dag afgerond en naar tier B gezakt.
|
||||
|
||||
Het valt daarmee ook samen met het werk dat toch aan de compose gedaan moet worden vóór de inlevering uit
|
||||
**Publicatie-Gate**: het pinnen en het kaal maken van het app-id vragen allebei een herinstallatie, en die
|
||||
kun je één keer doen in plaats van drie keer.
|
||||
|
||||
**Wat dit niet is: een harde afhankelijkheid.** Technisch kon dit plan altijd al. De volgorde was een
|
||||
keuze, geen feit over het plan.
|
||||
@@ -0,0 +1,19 @@
|
||||
# Voortgang - Eigenimage
|
||||
|
||||
> Chronologisch sessielog, nieuwste bovenaan. Kort: 3 tot 6 regels per entry. Wat er is gebeurd en
|
||||
> waarom, niet wat er nog moet: dat staat in [TAKEN.md](TAKEN.md).
|
||||
|
||||
## 27-08-2026 - gepromoveerd naar Actief, er is nog niets gebouwd
|
||||
|
||||
Het masterplan is omgezet naar een plan onder `Actief/` met nummer 006, direct nadat **Webinterface**
|
||||
afgerond en naar tier B gezakt was. Dat was de volgorde die de gebruiker diezelfde dag afsprak toen het
|
||||
plan geschreven werd.
|
||||
|
||||
Er is aan de app zelf nog **niets** gedaan. Wat hier ligt is ontwerp: de inventaris van wat er vandaag uit
|
||||
`app-data` gemount wordt, wat een eigen image wel en niet oplevert, en wat het kost. De drie open
|
||||
beslissingen uit §7 zijn naar [OPEN.md](OPEN.md) verhuisd.
|
||||
|
||||
Het eerste wat er moet gebeuren is geen bouwtaak maar open punt 1: blijft het Gitea-register ook bij
|
||||
publicatie de bron. Dat bepaalt waar het bouwrecept naartoe duwt.
|
||||
|
||||
**Geraakt:** alleen documentatie. **Tests:** niet van toepassing.
|
||||
@@ -0,0 +1,72 @@
|
||||
# Taken - Eigenimage
|
||||
|
||||
> Prioriteit: **A** | Wacht op: –
|
||||
>
|
||||
> **Gepromoveerd van masterplan naar `Actief/` op 27-08-2026**, direct na het afronden van
|
||||
> **Webinterface**. Dat was de volgorde die de gebruiker die dag afsprak, en de reden staat in
|
||||
> [PLAN.md](PLAN.md) §9: een eigen image maakt van elke paginawijziging een bouwronde, en dat had het
|
||||
> werk aan de webinterface geremd. Dat werk is nu klaar.
|
||||
>
|
||||
> **Lees vóór de eerste taak [OPEN.md](OPEN.md) punt 1.** Blijft het Gitea-register ook bij publicatie de
|
||||
> bron? Dat bepaalt waar `build.sh` naartoe duwt en wat er in de compose komt te staan. Beginnen zonder dat
|
||||
> antwoord betekent de kans lopen dat het bouwrecept en de compose twee keer geschreven worden.
|
||||
>
|
||||
> **En lees §1 van het plan.** Het argument dat voor de hand ligt, "dan komen wijzigingen eindelijk aan bij
|
||||
> een bestaande installatie", geldt hier níet: alle code staat in een `*.template` en die staan in de
|
||||
> update-whitelist. Wat dit plan wél oplevert, staat in §3.
|
||||
|
||||
## Volgende stap
|
||||
|
||||
- [ ] **Open punt 1 beantwoorden: Gitea ook bij publicatie, of niet?** Dit is geen bouwtaak maar het
|
||||
bepaalt de eerste. **Eigenaar: gebruiker**
|
||||
|
||||
## Fase 1 - Het bouwrecept
|
||||
|
||||
- [ ] Beslissen: één image of twee (open punt 2). [PLAN.md](PLAN.md) §6 stelt één voor
|
||||
- [ ] Beslissen: waar wordt gebouwd (open punt 3). De Umbrel is amd64 en een productiemachine
|
||||
- [ ] `tools/electrum-gate/Dockerfile` schrijven: basisimage, `agent.py`, de nginx-configuratie, de pagina,
|
||||
en een `entrypoint.sh`. **Niet in de app-map**: een `Dockerfile` staat niet in de update-whitelist,
|
||||
dus bouwen-in-de-app kost bij elke versie een deïnstallatie
|
||||
- [ ] `tools/electrum-gate/build.sh` naar het voorbeeld van `tools/evolu-relay/build.sh`: pin op de
|
||||
basisimage, bouwen, naar het register duwen, en de digest afdrukken die in de compose moet
|
||||
- [ ] **Multi-arch bouwen, en dat is nieuw werk.** `linux/amd64` én `linux/arm64` in de manifest-lijst.
|
||||
Vraagt `buildx` met QEMU en is hier nog nooit geprobeerd; zie [PLAN.md](PLAN.md) §4
|
||||
- [ ] **Controleren dat de image anoniem te halen is.** umbreld krijgt geen inloggegevens mee. Uitloggen in
|
||||
dezelfde context waarin je inlogde, anders meet je je eigen sessie. Het commando staat onderaan
|
||||
`tools/evolu-relay/build.sh`
|
||||
|
||||
## Fase 2 - Het `command`-blok wordt een script
|
||||
|
||||
- [ ] Het inline `command`-blok uit `docker-compose.yml` omzetten naar `entrypoint.sh` in de image. Dat is
|
||||
ruim honderd regels shell in een YAML-string met een eigen ontsnappingsregel voor het dollarteken;
|
||||
zie [PLAN.md](PLAN.md) §2. **Dit is de grootste inhoudelijke winst van het hele plan**
|
||||
- [ ] Let op wat daarbij niet mag sneuvelen: het `log_format` met `$$`, de sessieteller uit
|
||||
`/proc/net/tcp`, de herlaadlus met zijn vangnettak, en het feit dat nginx met `exec` het hoofdproces
|
||||
wordt. Die laatste is geen detail: andersom blijft de shell PID 1, geeft signalen niet door, en ziet
|
||||
Docker een geslaagde afsluiting als nginx omvalt
|
||||
|
||||
## Fase 3 - De app-map opschonen
|
||||
|
||||
- [ ] `agent.py.template`, `nginx.conf.template`, `stream.conf.template` en `index.html.template` uit de
|
||||
app-map halen zodra ze in de image zitten
|
||||
- [ ] **`index.html` heeft dan geen template-invulling meer.** Vandaag staat er
|
||||
`${APP_ELECTRS_NODE_IP}:${APP_ELECTRS_NODE_PORT}` in, ingevuld door umbreld bij het starten. Zit de
|
||||
pagina in de image, dan moet dat adres langs de omgeving naar binnen, bijvoorbeeld doordat de agent
|
||||
het in `status.json` zet en de pagina het daaruit leest. Dat is werk dat nu nog gratis is
|
||||
- [ ] De compose houdt zijn `environment`-blok; dat is hoe `${APP_ELECTRS_NODE_IP}` binnenkomt, en die weg
|
||||
is op 27-08-2026 bewezen bij de omschakeling naar Fulcrum
|
||||
- [ ] Wat er in de app-map overblijft: `docker-compose.yml`, `umbrel-app.yml`, `icon.png` en `data/` met
|
||||
zijn twee `.gitkeep`-bestanden
|
||||
|
||||
## Fase 4 - Uitrollen en verifiëren
|
||||
|
||||
- [ ] Image gepind als `repo:tag@sha256:<digest>` in de compose, en `version` verhoogd in het manifest.
|
||||
Zonder die verhoging rolt umbrelOS niets uit
|
||||
- [ ] Op de Umbrel installeren en controleren dat alles het nog doet: de pagina, de certificaatkeuze, de
|
||||
TLS-poort, de zelfcontrole en het activiteitenlog
|
||||
- [ ] **`icon.png` wordt hiermee updatebaar**, want die zit dan in de image. Dat was de enige echte
|
||||
uitzondering op "alles komt al aan bij een update"; zie [PLAN.md](PLAN.md) §1
|
||||
|
||||
## Geblokkeerd / wacht op
|
||||
|
||||
Niets, behalve open punt 1 hierboven, en dat is een vraag van één regel aan de gebruiker.
|
||||
Reference in New Issue
Block a user