Eén app store, twee apps

umbrelOS leest per store één repo, dus twee apps in twee repo's kan niet. Deze
repo is de store en bevat vanaf nu Electrum Gate en het werk aan Evolu Relay.
Opgezet als verse repo op verzoek van de gebruiker: de historie van ElectrumTLS
en van EvoluRelay komt niet mee.

Dat heeft één gevolg dat verder gaat dan opruimen. In de historie van
ElectrumTLS staat het domein van de gebruiker en het certificaatpad, van vóór de
opschoning van 19-08. Die komt hier niet in. Zolang die repo op de Git-server
blijft staan verandert dat niets, dus het weghalen ervan is het laatste stuk van
open punt 3 van het plan Appstore, en geen bijzaak.

De store zelf hoefde niet te veranderen: store-id whatsnext, en dus blijft het
app-id whatsnext-electrum-gate. Dat hangt aan het store-id en niet aan de URL,
dus voor umbrelOS is dit dezelfde app in een andere store. Dat de store op 19-08
naar de maker genoemd werd in plaats van naar deze ene app, betaalt zich hier
uit.

Wat de documentatie betreft is dit één wortel voor beide apps, en dat was de
reden om samen te voegen en niet de prijs ervan: de appstore-spec, het pinnen
van images en de werkwijze golden al voor allebei en stonden in twee repo's naast
elkaar. De kruisverwijzing die daarvoor nodig was (Referenties/Umbrel-appstore.md
in de oude EvoluRelay-repo) is verdwenen; wat daarin stond over de plekken waar
de relay een ander geval is, staat nu als ontwerp in het masterplan Umbrelapp §4.

Botsende namen kregen een achtervoegsel met de app, en alleen die: Publicatie
werd Publicatie-Gate en Publicatie-Relay, CHANGELOG.md werd
CHANGELOG-electrum-gate.md. Proefopstelling kreeg 007, tussen de twee bestaande
nummers, zodat de bovenkant van de reeks op tier-orde blijft staan.
CONTINUE_HERE.md heeft een kolom App, maar de tiers lopen over beide apps heen:
er is één volgorde van werken.

Electrum Gate gaat naar 0.0.15, want website, repo, support, submission en icon
wijzen nu naar UmbrelApps en zonder versieverhoging rolt dat niet uit. De release
notes leggen aan de gebruiker uit dat hij de store opnieuw moet toevoegen. Of een
geïnstalleerde app een wisseling van store-URL overleeft is nog steeds niet
uitgezocht; dat blijkt bij het omzetten.

Twee dingen in de plannen van Electrum Gate waren door deze verhuizing niet meer
waar en zijn bijgewerkt: de taak "de repo hernoemen" in fase 7 is afgevinkt, en
de repo-vorm in PLAN.md §4a toonde nog de store-id electrumtls, die al sinds
fase 7 achterhaald was.

Tests: 39 goed 0 fout en 54 goed 0 fout, niets overgeslagen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Harmen
2026-08-25 16:27:57 +02:00
co-authored by Claude Opus 5
commit 67ed9b603b
45 changed files with 8652 additions and 0 deletions
+144
View File
@@ -0,0 +1,144 @@
# Open punten - Appstore
> 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.
## Nog te beslissen
2. **Wat gebeurt er met de bestaande handmatige installatie?** - **In twee stappen, en de eerste is niet
meer uit te stellen** (bijgewerkt 20-08-2026).
De container is gestopt maar de compose staat er nog: een `alpine:latest` met een `apk add stunnel` bij
elke start, met `restart: unless-stopped` en een mount op de certificaten van Zoraxy. Wat er nu aan de
orde is:
- **de container weghalen, nu.** Hij bindt poort **50002**, en dat is precies de poort die Fulcrum op de
host wil. Zolang hij bestaat kan het omschakelen naar Fulcrum niet slagen, en dat staat in fase 6 als
taak. `restart: unless-stopped` betekent bovendien dat hij een herstart van de Umbrel overleeft;
- **de map laten staan tot de herstart-controle gedaan is.** Dat is een compose plus een
`entrypoint.sh` en het kost niets. Het is de gedocumenteerde weg terug, en die vervalt pas als
bewezen is dat de app na een herstart vanzelf terugkomt. Let op de volgorde: de container mount zijn
`entrypoint.sh` uit die map, dus eerst de container weg en dan de map.
**Moment:** stap 1 nu, stap 2 na de herstart-controle · **Eigenaar:** gebruiker
4. **Eigen icoon en gallery.**
Het manifest wijst nu naar het Electrs-icoon en een screenshot van Electrs in `getumbrel/umbrel-apps`,
dus naar andermans bestanden en naar plaatjes van een andere app. Er moet een eigen SVG komen. De
gallery is minder dringend: die is er voor een winkelpagina die hier niemand bezoekt, zie
[KNOWLEDGE.md](../../../KNOWLEDGE.md). Vraag is wie het icoon maakt en of het in de repo komt of extern
gehost wordt.
**Moment:** fase 5 · **Eigenaar:** gebruiker
7. **Hoe wordt de herstart-controle alsnog gedaan?**
Dit is de controle waar het hele plan om begon: komt de app na een herstart van de Umbrel vanzelf
terug. Hij is op 18-08-2026 uitgesteld omdat de Umbrel een productiemachine is en niet op verzoek
herstart wordt. Dat is een geldige reden, maar het betekent wel dat het plan **niet afgerond kan
worden**: alles wat er nu ligt is een sterke aanwijzing en geen bewijs.
Wat er specifiek niet mee getest is, en waar de enige echte twijfel zit: de **volgorde bij het
opstarten**. Zoraxy kan later klaar zijn dan deze app, en dan bestaat het certificaat nog niet.
Bijgewerkt op 20-08-2026: hier stond dat de compose daarvoor een wachtlus heeft. Die is er niet meer,
want juist die lus was de klem van 0.0.3. De opvolger is de vangnettak in de herlaadlus, die TLS
aanzet zodra `cert.conf` verschijnt zonder dat er een vlag bij hoort. Dat is precies het
Zoraxy-is-later-klaar-geval, en het is nog nooit echt voorgekomen; alleen getoetst tegen tijdelijke
bestanden.
**Moment:** bij de eerstvolgende herstart die er toch komt, bijvoorbeeld een umbrelOS-update of een
stroomonderbreking. Noteer de uitkomst dan in `PROGRESS.md`. · **Eigenaar:** gebruiker
9. **Volgt de app-map de conventie van andere apps?** Gevraagd door de gebruiker op 20-08-2026, die
opmerkte dat hij bij andere apps geen app-code in `app-data` ziet. Uitgezocht en vastgelegd in
[Umbrel-appstore-spec.md](../../../Referenties/Umbrel-appstore-spec.md); de korte versie is dat
config-in-app-data een bestaand patroon is (`electrs` mount zijn `torrc` zo) en dat code-in-app-data
het gevolg is van geen eigen image bouwen, wat een besluit is en geen ongeluk.
**Beide vervolgpunten zijn diezelfde dag gedaan in 0.0.9**, nadat de gebruiker zei dat hij de app wil
publiceren als standaard-app: de data staat onder `data/` met een `.gitkeep` per map, en `backupIgnore`
noemt de sessielog en `status.json`. Niet `data/runtime/config`, want daar zit de certificaatkeuze.
Wat het uitzoeken daarna opleverde is groter dan dit punt en staat daarom in een eigen masterplan
**Publicatie**: de eisen van de officiële store, wat er al aan voldoet, en het risico dat niet in een
checklist staat, namelijk de leesmount op de certificaten van Zoraxy.
**Moment:** afgerond · **Eigenaar:**
## Beslist
8. **Wordt de repo hernoemd, en wat wordt dan het store-id?** - **Store-id `whatsnext`, app-id
`whatsnext-electrum-gate`, repo-naam nog niet** (19-08-2026, gebruiker).
Het app-id **moet** met het store-id beginnen en de mapnaam moet gelijk zijn aan het app-id (zie
[Umbrel-appstore-spec.md](../../../Referenties/Umbrel-appstore-spec.md)). De aanname bij het stellen
van deze vraag was dat de repo-naam daar ook in zat, want de store-URL ís de repo-URL. **Dat klopte
niet:** het store-id is gewoon een veld in `umbrel-app-store.yml` en staat los van de naam van de
repo. Daardoor kon het store-id meteen goed gezet worden en kan de repo-naam wachten.
De store heet nu naar de maker en niet naar deze ene app. Dat is de variant die later een tweede app
toelaat zonder opnieuw te hernoemen, en dat weegt hier zwaarder dan de kosten, want die zijn nul: de
gebruiker gaf aan de app zonder bezwaar opnieuw te kunnen installeren.
**Afgerond op 25-08-2026, en eerder dan gedacht.** Hier stond dat de repo nog `ElectrumTLS` heette en
dat het hernoemen zou meeliften op een publieke versie op GitHub. Wat het versnelde was Evolu Relay:
umbrelOS leest per store één repo, dus een tweede app dwong de vraag af. De repo is
`UmbrelApps` geworden, met `website`, `repo`, `support`, `submission` en `icon` mee, in 0.0.15.
**Het app-id is niet meegegaan** en dat is de reden dat dit goedkoop was: `whatsnext-electrum-gate`
hangt aan het store-id en niet aan de URL. Voor umbrelOS is het dus dezelfde app in een andere store.
**Wat er wél open blijft, en nu voor het eerst echt aan de orde is:** of een geïnstalleerde app een
wisseling van **store-URL** overleeft, of dat de store verwijderd en opnieuw toegevoegd moet worden en
de app daarna opnieuw geïnstalleerd. Niet uitgezocht, en niet aannemen dat het meevalt. **Eigenaar:**
gebruiker, bij het omzetten van de store in umbrelOS.
1. **Draait `nginx:alpine` met de `stream`- en `stream_ssl`-module?** - **Ja** (18-08-2026).
Op de Umbrel gecontroleerd met `docker run --rm nginx:alpine nginx -V`. Aanwezig zijn
`--with-stream`, `--with-stream_realip_module`, `--with-stream_ssl_module` en
`--with-stream_ssl_preread_module`, alle vier statisch meegebouwd, dus zonder `load_module`.
Daarmee gaat het ontwerp uit [PLAN.md](PLAN.md) §4c door in de kleine variant: één container die de
web-UI serveert én TLS termineert, geen stunnel-installatie bij het starten, geen losse
`cert-monitor`, en de Docker-socket-mount vervalt.
Twee dingen die deze uitkomst meebracht en die het opschrijven waard zijn. nginx wil de **volledige
keten** in `ssl_certificate`, terwijl stunnel het gesplitst wilde; de `awk`-splitsing uit
`entrypoint.sh` is daarmee overbodig in plaats van overgenomen. En dit antwoord geldt voor de tag
`nginx:alpine` van vandaag: bij het pinnen op een digest wordt dezelfde controle op díe digest
herhaald, anders is er iets anders bewezen dan er uitgeleverd wordt.
6. **Hoe komen `entrypoint.sh` en `web/` in `${APP_DATA_DIR}`?** - **Bij installatie automatisch, bij
een update niet** (18-08-2026).
umbreld doet bij installatie `rsync --archive` van de hele app-map naar `${APP_DATA_DIR}`, dus de
mounts in de compose kloppen. Bij een **update** wordt alleen een whitelist ververst:
`docker-compose.yml`, `*.template`, `exports.sh`, `torrc`, `hooks` en `umbrel-app.yml`.
Gevolg dat het ontwerp stuurt: een gewijzigde `entrypoint.sh` bereikt een bestaande installatie nooit,
zonder foutmelding. Logica die later nog moet kunnen wijzigen hoort daarom in de compose, in de image,
of in een `*.template`-bestand; dat laatste staat in de whitelist én wordt bij elke start met de
omgevingsvariabelen ingevuld. Zie de naslag
[Umbrel-appstore-spec.md](../../../Referenties/Umbrel-appstore-spec.md).
3. **Wanneer wordt er voor het eerst gepusht?** - **Meteen, vóór de opschoning** (18-08-2026).
De repo staat sindsdien publiek op `https://sc.kamenier-hamer.nl/sysop/ElectrumTLS.git`, met het
domein en het certificaatpad er nog in. Publiek zijn was geen keuze (umbreld kloont anoniem), alleen
de volgorde was dat. Afweging van de gebruiker: de repo is voor eigen gebruik en wordt niet
aangekondigd, dus vindbaarheid is laag.
Gevolg dat vastligt: die waarden staan nu in de **historie**. Het plan **Configuratie** haalt ze uit de
bestanden, niet uit de historie; dat laatste zou een herschrijving vragen. Behandel het domein dus als
bekend, en laat het geen reden zijn om Configuratie uit te stellen of juist te haasten.
**Bijgewerkt 25-08-2026: die historie is bij de verhuizing achtergebleven.** `UmbrelApps` is als lege
repo begonnen met alleen de huidige toestand erin, op verzoek van de gebruiker die de historie niet
nodig had. Daarmee vervalt de vaststelling hierboven, maar **pas als de oude repo weg is**: zolang
`ElectrumTLS` op de Git-server staat, staat het domein daar nog in de historie. Dat weghalen is dus
geen opruimwerk maar het laatste stuk van deze beslissing. **Eigenaar:** gebruiker
5. **Mag de app-id later nog wijzigen?** - **Ja** (18-08-2026).
Er zijn geen andere installaties, dus achterwaartse compatibiliteit is geen eis. Een wijziging kost
één keer opnieuw installeren. Genoteerd omdat de prefix-regel anders zwaarder lijkt dan hij is: de
keuze `electrumtls-electrum-tls` mag herzien worden zolang dat vóór fase 6 gebeurt.
+193
View File
@@ -0,0 +1,193 @@
# Appstore - plan
> Ontwerp en afbakening. **Dit bestand lees je zelden**, alleen bij twijfel over scope of architectuur.
> Status staat in [TAKEN.md](TAKEN.md), geschiedenis in [PROGRESS.md](PROGRESS.md), onbesliste punten in
> [OPEN.md](OPEN.md).
## 1. Doel
De app draait nu als een met de hand neergezette docker-compose die umbrelOS niet kent. Gevolg: na een
herstart van de Umbrel, of als een app waar deze van afhangt omvalt, moet er met de hand
`docker compose down` en `up` gedaan worden. Dit plan maakt er een echte Umbrel-app van in een eigen
community app store: een tegel met icoon, die umbrelOS zelf installeert, start en na een herstart weer
opbrengt.
Als dit af is, is de repo tegelijk de app store: de URL erin plakken in umbrelOS is genoeg om de app te
installeren, en een `git push` is genoeg om een update uit te leveren.
## 2. Afbakening
- De repo omzetten naar de vorm die umbrelOS voor een community app store verwacht.
- `docker-compose.yml` omzetten naar de moderne vorm: `app_proxy`, geen zelfgebouwd netwerk, geen
handmatige host-poorten waar dat niet hoeft.
- De Electrum-backend via de afhankelijkheid aanspreken in plaats van via een hardgecodeerde
containernaam, zodat Electrs, Fulcrum en ElectrumX alle drie werken.
- Een image die gepind kan worden, in plaats van `alpine:latest` met `apk add` bij elke start.
- Het manifest compleet en eerlijk maken: eigen icoon, eigen gallery, kloppende velden.
- De oude `install.sh` en `uninstall.sh` weghalen.
De volledige spec waar dit tegenaan moet, met bronvermelding per feit, staat in
[Referenties/Umbrel-appstore-spec.md](../../../Referenties/Umbrel-appstore-spec.md). Die is bij het
schrijven van dit plan uitgezocht en hoeft niet opnieuw opgezocht te worden.
## 3. Niet-doelen
- **De hardgecodeerde waarden eruit halen.** Het domein `sync.kamenier-hamer.nl` en het Zoraxy-pad blijven
in dit plan staan zoals ze zijn. Dat is het plan **Configuratie**, en het apart houden is bewust: een
commit die tegelijk de structuur omgooit en de configuratie herontwerpt is niet meer na te lezen.
- **De web-UI eerlijk maken.** De pagina toont verzonnen status. Dat is het plan **Webinterface**. Hier
wordt de pagina alleen verhuisd en aan `app_proxy` gehangen, niet herschreven.
- **Meerdere apps in de store.** De store krijgt de vorm die meer apps toelaat, maar er komt er één in.
- **Indienen bij de officiële Umbrel App Store.** Een community store is er juist om dat niet te hoeven.
Als het later toch aantrekkelijk wordt, is de spec-eis grotendeels dezelfde, dus dit sluit niets af.
## 4. Ontwerp
### 4a. De repo-vorm
```
UmbrelApps/
├── umbrel-app-store.yml id: whatsnext
├── whatsnext-electrum-gate/
│ ├── umbrel-app.yml id: whatsnext-electrum-gate
│ ├── docker-compose.yml
│ ├── *.template
│ └── data/{certs,runtime}/.gitkeep
├── whatsnext-evolu-relay/ komt er bij het masterplan Umbrelapp
├── Docs/
├── tests/
└── README.md
```
De store-id is `whatsnext`. De prefix-eis is hard: mapnaam en manifest-`id` moeten gelijk zijn en allebei
met de store-id beginnen.
**Bijgewerkt op 25-08-2026**, toen de repo een store met meer dan één app werd. Hier stond nog de vorm van
18-08-2026 met store-id `electrumtls`; die was al achterhaald door fase 7. Wat de tweede app bewijst is dat
de keuze van 19-08 om de store naar de maker te noemen in plaats van naar deze ene app, klopte: er hoefde
niets voor te hernoemen.
### 4b. Backend-onafhankelijk, en waarom dat bijna niets kost
umbrelOS 1.3 heeft swappable dependencies. Fulcrum en ElectrumX declareren allebei `implements: [electrs]`
en hun `exports.sh` aliast `APP_ELECTRS_IP`, `APP_ELECTRS_NODE_IP` en `APP_ELECTRS_NODE_PORT` naar hun
eigen waarden. De gebruiker kiest de implementatie in de umbrelOS-instellingen; umbrelOS laadt de
`exports.sh` van de gekozen app.
Deze app hoeft daarvoor dus **geen keuzemechanisme te bouwen**. Het is dit:
```yaml
dependencies:
- electrs
```
en in de compose `${APP_ELECTRS_NODE_IP}:${APP_ELECTRS_NODE_PORT}` gebruiken.
Twee vallen om te vermijden. De eerste: de huidige compose zet `ELECTRS_HOST=${APP_ELECTRS_IP}`, en dat
is de **web-UI-container** van Electrs, niet de Electrum-server; dat moet `APP_ELECTRS_NODE_IP` worden.
De tweede: alleen `IP`, `NODE_IP` en `NODE_PORT` worden gealiast, dus alles wat Electrs-specifiek is
(zoals `APP_ELECTRS_RPC_HIDDEN_SERVICE`) mag hier niet gebruikt worden.
### 4c. De image: nginx `stream` in plaats van stunnel
Het huidige `alpine:latest` plus `apk add stunnel` bij elke start is op drie manieren fout: het is niet
te pinnen, het faalt zonder internet, en het maakt de starttijd afhankelijk van een Alpine-mirror. De
app-store-eis is een image gepind op de multi-arch index-digest.
Er zijn drie wegen, en de aanbeveling is de derde:
1. **Eigen image bouwen** met een `Dockerfile` en een workflow die multi-arch naar een registry duwt.
Correct, maar het voegt CI, een registry en een tweede uitleverstroom toe aan een app die verder uit
twee shellscripts bestaat.
2. **Een bestaande stunnel-image pinnen.** Er is geen onderhouden multi-arch stunnel-image die het
vertrouwen waard is. Afgevallen.
3. **De officiële `nginx`-image gebruiken en de `stream`-module de TLS-terminatie laten doen.** Die image
is multi-arch, wordt onderhouden en is gewoon te pinnen. Dan valt er meer weg dan alleen het
bouwprobleem:
- dezelfde container serveert de web-UI én termineert TLS, dus van drie containers blijft er één over.
**Bijgesteld 19-08-2026:** het zijn er weer twee, want er is een agent bijgekomen. De winst die hier
bedoeld werd blijft wel staan: geen Docker-socket, geen installatie bij het starten, en de
certificaatwissel is een reload. Zie het plan **Webinterface**, `PLAN.md` §4a0;
- een certificaatwissel wordt `nginx -s reload` **binnen** de container, dus de `cert-monitor` heeft de
Docker-socket niet meer nodig. Die socket is nu read-only gemonteerd, maar read-only op de
Docker-socket beschermt niets: wie de socket kan lezen kan containers starten en is daarmee root op
de host. Dat weghalen is de grootste beveiligingswinst in dit plan;
- een reload verbreekt bestaande verbindingen niet, een containerherstart wel.
**Te verifiëren voordat hierop gebouwd wordt:** dat de officiële `nginx:alpine` daadwerkelijk met
`--with-stream` en `--with-stream_ssl_module` gebouwd is. Dat is de aanname waar deze hele keuze op
rust en hij is in één commando te controleren (`nginx -V`). Klopt hij niet, dan valt dit terug op weg 1.
De `awk`-splitsing van de certificaat-chain uit `entrypoint.sh` blijft bruikbaar en wordt overgenomen.
### 4d. Poorten
`port:` in het manifest is de **web-UI-poort** van de tegel, niet de TLS-poort. Dat staat nu op 50002 en
is daarmee fout.
De TLS-poort blijft een gepubliceerde host-poort; daar helpt `app_proxy` niet, want dat is voor HTTP.
Welke poort dat wordt is een open punt in **Configuratie**: Fulcrum bezet host-poort 50002 en botst dus
met de huidige keuze.
### 4e. De eigen Git-server als app store
De repo staat op `https://sc.kamenier-hamer.nl/sysop/UmbrelApps.git` (tot 25-08-2026:
`.../ElectrumTLS.git`). umbreld valideert de URL alleen
met de `URL`-constructor en kloont met isomorphic-git; er is geen GitHub-eis. Wat er wél uit die aanroep
volgt, en op 18-08-2026 in orde is bevonden:
- **HTTPS, niet SSH.** In orde.
- **Anoniem kloonbaar.** In orde sinds 18-08-2026, maar het kostte moeite en de oorzaak was niet de
voor de hand liggende.
umbrelOS gaf `HTTP Error: 401 Unauthorized` bij het toevoegen van de store. De repo stond op public en
`REQUIRE_SIGNIN_VIEW` stond op `false`, en toch weigerde Gitea. De oorzaak was de zichtbaarheid van het
**account** `sysop`, die op "limited" stond. **Gitea staat niet toe dat een repo zichtbaarder is dan
zijn eigenaar**, dus de repo werd stilzwijgend teruggezet naar "intern", wat voor een niet-ingelogde
bezoeker hetzelfde is als privé. De knop "make public" leek te werken maar het label bleef op
"intern" staan, en dat is het enige zichtbare spoor.
Dit is eerst verkeerd beoordeeld, en de manier waaróp is het onthouden waard. Een `git ls-remote` vanaf
de werkmachine slaagde, ook met `GIT_TERMINAL_PROMPT=0`, en dat leek bewijs van anonieme toegang. Het
was het niet: Git Credential Manager stuurde de bij de push opgeslagen inloggegevens stilzwijgend mee.
`GIT_TERMINAL_PROMPT=0` onderdrukt alleen de **vraag** om een wachtwoord, niet het **aanleveren** ervan.
De test die het wel aantoont, zet de credential-helper leeg:
```
GIT_TERMINAL_PROMPT=0 git -c credential.helper= ls-remote <url>
```
Die faalt met `could not read Username`, en dat is de toestand die umbreld ziet.
- **SHA-1 als objectformaat.** In orde, na het opnieuw aanmaken van de repo. isomorphic-git kan geen
SHA-256; zie de naslag.
- **Geldig certificaat op `sc.kamenier-hamer.nl`.** Nog niet expliciet gecontroleerd vanaf de Umbrel.
- **Alles op de standaardbranch.** In orde: `main`, zowel lokaal als op de remote.
- **De URL is de identiteit van de store.** Wijzigt hij, dan ziet umbrelOS een andere store en moet hij
opnieuw toegevoegd worden.
## 5. Raakvlakken
**Configuratie** herschrijft dezelfde bestanden en wacht op dit plan. Twee dingen komen daarvandaan
terug: de TLS-poort (open punt daar, want Fulcrum bezet 50002) en het feit dat het domein na dit plan nog
steeds vast in de code staat.
**Webinterface** wacht op Configuratie en raakt hier alleen de verhuizing van `web/index.html`. Het
containerontwerp uit §4c is wel de reden dat dat plan zonder backend kan: de proxy en de webserver worden
één container, dus als de pagina geserveerd wordt, draait de proxy ook.
## 6. Verificatie
Er zijn geen tests in dit project en die zijn hier ook niet zinvol: de app is configuratie, geen code.
Wat er wél moet, en wat per se handmatig op het apparaat gebeurt:
- de store laat zich in umbrelOS toevoegen en de app verschijnt met icoon en tegel;
- installeren via de umbrelOS-interface werkt zonder SSH;
- **na `sudo reboot` komt de app vanzelf terug.** Dit is de aanleiding voor het hele plan en dus de
belangrijkste controle;
- de app komt ook terug nadat Electrs handmatig gestopt en gestart is;
- een Electrum-wallet verbindt over TLS en verifieert het certificaat;
- omschakelen naar Fulcrum in de umbrelOS-instellingen laat de app werken zonder aanpassing.
Wat automatisch gecontroleerd kan worden, en de moeite waard is omdat het de fouten vangt die je niet
ziet: dat de YAML geldig is, dat het `id` in het manifest gelijk is aan de mapnaam, en dat elke `image:`
een `@sha256:`-digest heeft.
@@ -0,0 +1,222 @@
# Voortgang - Appstore
> 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).
## 20-08-2026 - alles van de verse installatie nagekeken; dit plan zakt naar B
De hele checklist van de herinstallatie is bevestigd door de gebruiker: `data/` met `certs/` en `runtime/`
eronder, de pagina komt op zonder gekozen certificaat, `v0.0.9` staat achter de tagline, de keuzelijst voor
de Electrum-server verscheen bij het installeren, en daarna werkten kiezen én uploaden.
**Daarmee is dit plan in de kern af en gaat het van A naar B.** Alles waar het om begon is bewezen: de app
is een echte umbrelOS-app, hij komt op uit een schone installatie, en een wallet van buiten verbindt over
TLS. Wat er nog staat is niet te plannen (de herstartcontrole) of hoort bij het masterplan **Publicatie**.
**Webinterface** is daarmee tier A geworden en van 020 naar 005 hernummerd; dit plan houdt 010.
**Geraakt:** alleen documentatie. **Tests:** niet van toepassing.
## 20-08-2026 - verse installatie van 0.0.9, en die werkte
De gebruiker heeft de app gedeïnstalleerd en opnieuw geïnstalleerd in plaats van geüpdatet, zodat de
app-data schoon is. **Dat werkte, en het bewijst iets wat op een bestaande installatie niet te bewijzen
was:** de pagina komt omhoog op een installatie waar nog nooit een certificaat gekozen is. Dat is precies
de situatie waarin 0.0.3 stukliep, en de reparatie uit 0.0.4 was tot nu toe alleen getoetst op een
installatie die die keuze al had.
Wat er nog níet uit volgt: of de twee `.gitkeep`-bestanden hun werk deden. Een werkende app bewijst dat
niet, want Docker maakt een ontbrekende bind-mount-map zelf aan; het verschil zit alleen op schijf. Staat
als losse taak, want het is een eis voor het masterplan **Publicatie**.
**Geraakt:** alleen documentatie. **Tests:** niet van toepassing.
## 20-08-2026 - data onder data/, en een doel dat de maatstaf verandert
De gebruiker vroeg of het klopt dat alle runtime-bestanden in de installatiemap staan, want bij andere apps
ziet hij daar geen app-code. **Dat klopt, en het verschil zit niet in umbrelOS:** voor elke app wordt de
hele app-map naar `app-data` gekopieerd, maar andere apps hebben hun code in een image. Config uit
`app-data` mounten is wél een bestaand patroon; `electrs` doet zijn `torrc` precies zo, en `torrc` en
`*.template` staan met naam in de update-whitelist. Bijvangst: de invulling gebeurt met `envsubst`, en dat
is de onderbouwing van de architectuurregel over accolade-variabelen.
Waar deze app echt afweek was de plaats van de data, en dat is in **0.0.9** verholpen: `runtime/` en
`certs/` staan nu onder `data/`, met een `.gitkeep` per map. Aanleiding was het antwoord op de vervolgvraag:
**de gebruiker wil de app publiceren als standaard-app voor Umbrel.** De packaging-documentatie van umbrel
zegt woordelijk dat gebruikersstaat onder `${APP_DATA_DIR}/data/...` hoort, dus dit was geen smaak.
Dat doel verandert de maatstaf van "hij werkt hier" naar "iemand anders keurt het pakket goed", en dat is
een eigen plan geworden: **Publicatie**, als masterplan. Het meeste blijkt al goed; wat er nog moet is de
images pinnen, het app-id kaal maken en de manifestvelden op orde brengen. Het risico staat niet in die
lijst: deze app leest de certificaatmap van een andere app, en dat is precies waar een review over valt.
**Geraakt:** `docker-compose.yml`, `umbrel-app.yml` (0.0.9 en `backupIgnore`), twee `.gitkeep`-bestanden,
`Referenties/Umbrel-appstore-spec.md`, `OPEN.md` punt 7 en 9, nieuw
`Plannen/Masterplannen/Publicatie.PLAN.md`, `tests/test_server_start_zonder_certificaat.py`.
**Tests:** 48 goed 0 fout en 33 goed 0 fout, niets overgeslagen; de data-conventie is mutatie-getest.
## 20-08-2026 - de app werkt: pagina, keuze, TLS en een wallet van buiten
**De reparatie werkt.** Na de uitrol van 0.0.4 laadt het dashboard, met de melding "No certificate in use"
en de reden van de agent erbij. De agent vond **veertien certificaten in Zoraxy** en koos daarom niets; dat
is de weigering die zo bedoeld is, en het antwoord op de vraag die de log van 0.0.3 openliet.
Wat de gebruiker er meteen van zei: die reden somde alle veertien domeinnamen op, en dat is een muur tekst
die zegt wat de keuzelijst eronder al toont. **0.0.5** geeft alleen het aantal. De weigering zelf blijft.
**En daarna liep het hele pad.** Een certificaat kiezen op de pagina werkt: de agent nam de keuze aan, nginx
kwam met poort 50022 door, en na het aanpassen van de doorstuurregel in de router verbindt een wallet van
buiten. **Daarmee is fase 6 in de kern klaar** en is de app voor het eerst als umbrelOS-app af.
**Geraakt:** `agent.py.template` (`choose`), `umbrel-app.yml` (0.0.5), `tests/test_agent_certificates.py`,
`CHANGELOG.md`. **Tests:** 21 goed 0 fout en 15 goed 0 fout, niets overgeslagen; de ingekorte reden is
mutatie-getest. Nog open op de Umbrel: de herstartcontrole en het omschakelen naar Fulcrum.
## 20-08-2026 - 0.0.3 geinstalleerd, geen UI, en de oorzaak was het ontwerp
**De app is geinstalleerd en er kwam geen pagina.** De log van `app_proxy` meldde alleen dat de server niet
te bereiken was, en die van `server` herhaalde "Wachten tot de agent een certificaat gekozen heeft". Dat is
geen storing maar een klem in het ontwerp: het stream-blok met `listen 50022 ssl` includeerde de `cert.conf`
van de agent, nginx weigert te starten zonder dat certificaat, dus ook de pagina kwam niet omhoog. En de
pagina is precies waar je dat certificaat kiest.
**Verholpen in 0.0.4** door het TLS-deel naar `stream.conf.template` te verplaatsen; het `command`-blok legt
dat pas in `/var/lib/gate/tls/` als `cert.conf` bestaat, en `nginx.conf` haalt die map met een jokerteken op.
Meegenomen: een mislukte `nginx -s reload` brak de herlaadlus af, want die draait onder `set -e`.
Wat de log wél bewees: de agent start en luistert (`[gate] api listening on port 8000`), en Tor bootstrapt.
Wat de agent in de certificaatmappen vond, is nog onbekend; dat leest de pagina van 0.0.4 straks voor.
**Geraakt:** `nginx.conf.template`, `docker-compose.yml`, nieuw `stream.conf.template`, `umbrel-app.yml`
(0.0.4 en release notes), `CLAUDE.md`, `CHANGELOG.md`, nieuw
`tests/test_server_start_zonder_certificaat.py`. **Tests:** 21 goed 0 fout en 15 goed 0 fout, niets
overgeslagen. De reparatie zelf is **niet** geverifieerd: dat vraagt de uitrol op de Umbrel.
## 19-08-2026 - sessie afgesloten; dit plan is de enige tier A
Bij de prioriteitsherziening blijft **Appstore de enige tier A**, en de reden is dat er precies één
handeling openstaat waar al het andere achter wacht: de app installeren. **Webinterface is naar C gezakt**;
dat plan is af voor zover het zonder de Umbrel kan.
Wat er van de gebruiker moet, in deze volgorde: de doorstuurregel in de router naar 50022, dan de oude app
verwijderen, de store-URL opnieuw laten ophalen en `whatsnext-electrum-gate` installeren. Versie staat op
0.0.3 en de release notes kloppen, dus daar hoeft niets meer aan.
Ook opgemerkt en als taak vastgelegd: het plan **Configuratie** is grotendeels ingehaald door het werk van
vandaag. De agent doet de certificaatbronnen en de keuze al, en het hardgecodeerde domein is uit de compose
en uit `nginx.conf.template` verdwenen. Dat plan moet dus eerst opgeschoond worden voordat promotie nog
zin heeft, anders lijkt het groter dan het is.
**Geraakt:** alleen documentatie in deze entry.
**Tests:** 21 goed, 0 fout.
## 19-08-2026 - hernoemd naar Electrum Gate, fase 7 grotendeels af
De wallet-verbinding had de nacht doorstaan, dus de `proxy_timeout`-fix is bewezen en de storing waar de
sessie van gisteren mee begon is verklaard en verholpen.
De app heet nu **Electrum Gate**, met store-id `whatsnext` en app-id `whatsnext-electrum-gate`. Bij het
voorleggen van die keuze zat een fout in mijn eigen redenering: ik nam aan dat de repo-naam het store-id
bepaalt, omdat de store-URL de repo-URL is. Dat is niet zo, het store-id is gewoon een veld. Daardoor kon
het meteen goed en kan de repo-naam wachten tot er een publieke versie op GitHub komt.
Twee dingen die er vooruitlopend op andere plannen bij konden, omdat er tóch opnieuw geïnstalleerd wordt:
de TLS-poort is 50022 in plaats van 50002, wat de botsing met Fulcrum wegneemt, en de web-UI is
herbouwd. **Dat vraagt eenmalig een aanpassing van de doorstuurregel in de router**, anders komt een
wallet van buiten niet meer binnen.
De tagline en de beschrijving zijn Engels geworden en gaan nu over de afweging Tor tegenover snelheid, in
plaats van over TLS als middel.
**Geraakt:** `umbrel-app-store.yml`, de app-map (hernoemd), `umbrel-app.yml`, `docker-compose.yml`,
`nginx.conf.template`, `README.md` en de plannen.
**Tests:** dit project heeft geen suite. **Niets hiervan is op de Umbrel gedraaid**: de nieuwe app is nog
niet geïnstalleerd, en `version` staat nog op 2.0.1 omdat de gebruiker de UI eerst wilde zien.
## 18-08-2026 - storing na tien minuten, en de besluiten over naam en dashboard
Kort na de installatie viel de wallet-verbinding weg. De container bleef onafgebroken draaien
(`status=running`, `restarts=0`, schone nginx-log), wat de container als oorzaak uitsloot en één
verdachte overliet: `proxy_timeout` in een `stream`-blok staat standaard op tien minuten, en een
Electrum-wallet houdt een langlopende, grotendeels stille verbinding open. **Dit was een regressie van
diezelfde dag:** stunnel hanteerde twaalf uur, en dat verschil is bij de vertaling naar nginx niet
opgemerkt. Nu op twaalf uur, met `proxy_socket_keepalive`.
Meegenomen omdat ze bij het uitzoeken bovenkwamen: nginx draaide als achtergrondproces onder een shell,
die daardoor PID 1 was en signalen niet doorgaf, en het script eindigde met exitcode 0 als nginx omviel,
waardoor `restart: on-failure` niet zou ingrijpen. Nginx is nu met `exec` het hoofdproces.
De gebruiker vroeg of umbrelOS een update wel zou zien, en dat was de goede vraag: het `version`-veld
stond nog op 2.0.0, dus de fix was nooit uitgerold. Zonder melding en zonder fout. Na 2.0.1 kwam de
update binnen en werkte hij, wat meteen de hele uitleverketen aantoont.
Aan het eind besloten: de app gaat **Electrum Gateway** heten, want de oude naam beschreef het middel en
niet de waarde. En het dashboard krijgt alleen lokale gegevens; koersdata valt af omdat de browser van
elke bezoeker dan bij een derde partij aanklopt.
**Geraakt:** `docker-compose.yml`, `nginx.conf.template`, `umbrel-app.yml`, en de plannen.
**Tests:** niet van toepassing. **De `proxy_timeout`-fix is nog niet bewezen**: die brak pas na tien
minuten stilte, dus dat vraagt een langere observatie. Ook de herstart-controle staat nog open.
## 18-08-2026 - geinstalleerd op de Umbrel, wallet verbindt
De app is als Umbrel-app geïnstalleerd en een Electrum-wallet krijgt over TLS direct data terug. Dat
bewijst het hele pad in één keer: het `stream`-blok, het certificaat, en de verbinding naar de
Electrum-server via `APP_ELECTRS_NODE_IP`.
De weg erheen kostte drie omwegen die allemaal buiten de app zelf lagen. De Gitea-repo was als SHA-256
aangemaakt terwijl isomorphic-git alleen SHA-1 kan. Daarna weigerde Gitea anonieme toegang, en de oorzaak
bleek niet de repo maar de zichtbaarheid van het **account**: Gitea staat niet toe dat een repo
zichtbaarder is dan zijn eigenaar en zet hem dan zwijgend terug naar "intern". En de installatie faalde
drie keer op `Bind for 0.0.0.0:50002 failed: port is already allocated`, omdat de oude handmatige
container nog draaide. Dat laatste was de voorspelde en gewenste faalrichting: de bestaande dienst bleef
gewoon werken.
Eén les die het onthouden waard is: een `git ls-remote` vanaf de eigen machine bewees niets over anonieme
toegang, want de credential-helper stuurde de opgeslagen inloggegevens stilzwijgend mee. Dat leidde tot
een verkeerde diagnose die pas onderuitging met `-c credential.helper=`.
**Geraakt:** niets in de app; alleen documentatie en de configuratie van de Gitea-server.
**Tests:** niet van toepassing. Wallet-verbinding handmatig geverifieerd. **De herstart-controle staat
nog open**, en dat is de aanleiding van het hele plan.
## 18-08-2026 - fases 1 tot en met 5 gebouwd
De repo heeft de vorm van een community app store, de compose is omgezet naar
`app_proxy`, de backend loopt via de afhankelijkheid, en het manifest klopt met een eigen icoon.
Twee dingen die het uitzoekwerk opleverde en die het ontwerp veranderd hebben. De controle op de Umbrel
bevestigde dat `nginx:alpine` alle vier de stream-modules meebrengt, waardoor drie containers er één
werden en de Docker-socket kon vervallen; dat was de grootste beveiligingswinst en hij was gratis. En
umbreld blijkt bij een **update** alleen een whitelist te verversen (`docker-compose.yml`, `*.template`,
`exports.sh`, `torrc`, `hooks`, `umbrel-app.yml`), terwijl bij installatie de hele map wordt gekopieerd.
Daarom staat de nginx-configuratie in een `*.template` en niet in een los script: anders had een `git
push` stilzwijgend niets gedaan bij een bestaande installatie.
Ook bleek de `awk`-splitsing van de certificaatketen niet overgenomen te hoeven worden maar juist fout
te zijn: nginx wil de volledige keten in `ssl_certificate`, waar stunnel hem gesplitst wilde.
**Geraakt:** `umbrel-app-store.yml`, `electrumtls-electrum-tls/` (compose, manifest, `nginx.conf.template`,
`icon.png`), verwijderd zijn `entrypoint.sh`, `cert-watch.sh`, `install.sh` en `uninstall.sh`.
**Tests:** niet van toepassing, dit project heeft er geen. **Niets is op de Umbrel geïnstalleerd of
gedraaid**; dat is fase 6.
## 18-08-2026 - plan werd actief
Dit plan is als eerste actief geworden omdat het de aanleiding van de hele sessie oplost: de app draait
als een handmatig neergezette docker-compose die umbrelOS niet kent, en moet na elke herstart of na een
storing in een afhankelijkheid met de hand opgestart worden.
De repo is dezelfde dag onder versiebeheer gebracht en gepusht naar
`https://sc.kamenier-hamer.nl/sysop/ElectrumTLS.git`. Dat kostte één omweg: de Gitea-repo was als SHA-256
aangemaakt, en de push faalde met een melding die de oorzaak niet noemt. Bij het uitzoeken bleek het
probleem groter dan de push, want umbreld kloont met isomorphic-git en die kan uitsluitend SHA-1. De repo
is opnieuw aangemaakt als SHA-1.
Twee dingen die het uitzoekwerk opleverde en die het werk kleiner maken dan gedacht. umbrelOS doet géén
hostnaamcontrole op de store-URL, dus een eigen Gitea kan de app store zijn. En wisselen tussen Electrs,
Fulcrum en ElectrumX vraagt geen eigen mechanisme: die declareren `implements: [electrs]` en aliassen
zichzelf naar `APP_ELECTRS_*`, dus twee regels volstaan. Dat was oorspronkelijk een apart plan waard en
is nu fase 3.
**Geraakt:** promotie vanuit `Plannen/Masterplannen/Appstore.PLAN.md`; nog geen app-bestanden.
**Tests:** niet van toepassing, dit project heeft er geen. Er is nog niets op de Umbrel geverifieerd.
+174
View File
@@ -0,0 +1,174 @@
# Taken - Appstore
> Prioriteit: **B** | Afhankelijk van:
>
> **Van A naar B op 20-08-2026**, bij de prioriteitsherziening na de verse installatie van 0.0.9. Alles
> waar dit plan om begon is af: de app is een echte umbrelOS-app, hij komt op uit een schone installatie,
> en een wallet van buiten verbindt over TLS. Wat er nog staat is niet te plannen (de herstartcontrole
> wacht op een herstart die er toch komt) of hoort bij het masterplan **Publicatie**. Het plan houdt zijn
> nummer 010; alleen **Webinterface** kreeg een nieuw nummer bij de promotie naar A.
## Volgende stap
- [x] **De maphiërarchie na een verse installatie nagekeken. In orde (20-08-2026):** in
`~/umbrel/app-data/whatsnext-electrum-gate/` staat `data/` met `certs/` en `runtime/` eronder. Dat is
de vorm die de appstore-eis vraagt, en samen met de twee `.gitkeep`-bestanden in de repo is dat punt
van het masterplan **Publicatie** dus af. Wat deze controle niet onderscheidt is wie de mappen
aanmaakte, `rsync` of Docker; voor de eis maakt dat niet uit, want die gaat over wat er in de repo
staat
- [x] **0.0.9 opnieuw geïnstalleerd in plaats van geüpdatet. Gelukt (20-08-2026).** De gebruiker koos een
deïnstallatie plus verse installatie omdat de app-data dan schoon is, en dat werkte. Daarmee is
bewezen wat op een bestaande installatie niet te bewijzen was: **de pagina komt omhoog op een
installatie waar nog nooit een certificaat gekozen is.** Dat is precies de situatie waarin 0.0.3
stukliep
- [ ] **Na `sudo reboot` controleren dat de app vanzelf terugkomt.** Dit is de aanleiding voor het hele
plan en nu het enige wat er in de kern nog openstaat; zie fase 6. **Eigenaar: gebruiker, op een
moment dat het kan**
- [x] **De doorstuurregel in de router naar poort 50022 gezet (20-08-2026).** Nodig omdat de app niet meer
op 50002 luistert; zonder deze regel komt een wallet van buiten niet binnen
- [x] **Een certificaat kiezen op de pagina, en daarmee het hele pad. Gelukt (20-08-2026):** de keuze werd
aangenomen, nginx kwam met poort 50022 door, en een wallet van buiten verbindt. De app doet waarvoor
hij bestaat
- [x] **0.0.4 uitrollen en kijken of de pagina nu komt. Gelukt (20-08-2026).** De pagina laadt, de
melding "No certificate in use" staat er met de reden van de agent, en de veertien certificaten uit
Zoraxy staan als keuzelijst. Daarmee is de klem uit 0.0.3 bewezen verholpen
- [x] De oude app `electrumtls-electrum-tls` verwijderen in umbrelOS, de store-URL opnieuw laten ophalen,
en `whatsnext-electrum-gate` installeren. **Gedaan (20-08-2026), en het leverde meteen een fout op:**
er kwam geen UI. Oorzaak was geen installatiefout maar een ontwerpfout, verholpen in 0.0.4, zie
[PROGRESS.md](PROGRESS.md) en [CHANGELOG-electrum-gate.md](../../../CHANGELOG-electrum-gate.md)
Daarna, in deze volgorde:
- [x] `version` op **0.0.3** en de release notes herschreven (19-08-2026). Niet 3.0.0: de gebruiker heeft
de nummering opnieuw onder 1.0 gezet, omdat 1.0.0 en 2.0.x een rijpheid beweerden die er niet was.
De stap terug in het nummer kan omdat de oude app gedeïnstalleerd wordt en dit een nieuwe app-id is,
dus er is geen geïnstalleerd manifest om tegen te vergelijken. **Vanaf hier moet het nummer altijd
omhoog**; zie [CHANGELOG-electrum-gate.md](../../../CHANGELOG-electrum-gate.md)
- [x] Controleren of de wallet-verbinding de nacht heeft doorstaan. **Gelukt (19-08-2026):** de
verbinding stond er 's ochtends nog. Daarmee is de `proxy_timeout`-fix bewezen en de storing
verklaard en verholpen
- [x] Het plan **Webinterface** promoveren naar `Actief/`; het werk daaraan is begonnen
- [ ] Het plan **Configuratie** herzien vóórdat het gepromoveerd wordt. Bij het afsluiten van de sessie op
19-08-2026 bleek het grotendeels ingehaald: de agent doet §4e en §4f al, en het hardgecodeerde
domein is uit `docker-compose.yml` én uit `nginx.conf.template` verdwenen, dus fase 2 is op de
README na klaar. Wat er nog echt in zit, is kleiner dan het plan suggereert. Eerst opschonen, dan
beslissen of promotie nog nodig is
## Fase 1 - De repo-vorm
- [x] `umbrel-app-store.yml` aanmaken met `id: electrumtls` en een `name`
- [x] Map `electrumtls-electrum-tls/` aanmaken en de app-bestanden erheen verplaatsen
- [x] `id` in `umbrel-app.yml` op `electrumtls-electrum-tls` zetten, gelijk aan de mapnaam
- [x] `install.sh` en `uninstall.sh` verwijderen; umbreld beheert dit onder umbrelOS 1.x
- [x] Verplaatsen en inhoudelijk wijzigen in **twee** commits houden, anders is de verhuizing niet als
"alleen verplaatst" na te lezen
## Fase 2 - De compose
- [x] `app_proxy`-service toevoegen met `APP_HOST: electrumtls-electrum-tls_server_1`
- [x] Het externe `umbrel_main_network` en het top-level `networks:`-blok verwijderen
- [x] `version: "3.7"` weghalen; die sleutel is verouderd
- [x] Certificaatmount op `${UMBREL_ROOT}/app-data/zoraxy/...` in plaats van een absoluut pad
- [x] De handmatige `${APP_ELECTRUM_TLS_WEB_PORT}`-plaatshouder eruit; de web-UI loopt via `app_proxy`
- [x] **Uitzoeken hoe `entrypoint.sh`, `cert-watch.sh` en `web/` in `${APP_DATA_DIR}` terechtkomen.**
Bij installatie kopieert umbreld de hele app-map met `rsync --archive`, dus de mounts kloppen. Bij
een **update** wordt alleen een whitelist ververst; zie [OPEN.md](OPEN.md) punt 6
- [ ] Logica die later nog moet kunnen wijzigen uit `entrypoint.sh` halen en in de compose of in een
`*.template` zetten, anders levert een `git push` geen update op bij een bestaande installatie
## Fase 3 - Backend-onafhankelijk
- [x] `dependencies: [electrs]` in het manifest laten staan en controleren
- [x] `ELECTRS_HOST` van `${APP_ELECTRS_IP}` naar `${APP_ELECTRS_NODE_IP}` (nu wijst hij naar de
web-UI-container van Electrs, niet naar de Electrum-server)
- [x] `ELECTRS_PORT` van de vaste 50001 naar `${APP_ELECTRS_NODE_PORT}`
- [x] Controleren dat er nergens een Electrs-specifieke variabele gebruikt wordt; alleen `IP`, `NODE_IP`
en `NODE_PORT` worden door Fulcrum en ElectrumX gealiast
- [x] De terugval `electrs_electrs_1` in `entrypoint.sh` vervangen door hard stoppen met een melding;
een oude containernaam als standaard laat de app draaien terwijl hij naar niets wijst
- [ ] Op de Umbrel verifiëren: omschakelen naar Fulcrum en controleren dat het zonder aanpassing werkt
(staat ook in fase 6)
## Fase 4 - De image
- [x] Uitkomst van de "Volgende stap" verwerken: nginx `stream`, of terugvallen op een eigen image
- [ ] Image pinnen op de multi-arch index-digest, geverifieerd met `docker buildx imagetools inspect`
(kan alleen op de Umbrel; staat als TODO in de compose). **Sinds 20-08-2026 ook de grootste
openstaande eis voor het masterplan Publicatie**, want de officiële store eist
`repo:versie@sha256:<digest>` met beide architecturen erin. Blijft hier staan tot dat plan actief
wordt; een taak op twee plekken loopt uit elkaar
- [x] `apk add` bij het starten verwijderen
- [x] De `cert-monitor`-service samenvoegen met de proxy en de Docker-socket-mount schrappen
- [x] Certificaatwissel omzetten naar een reload binnen de container in plaats van een containerherstart
- [x] `entrypoint.sh` en `cert-watch.sh` verwijderen; de logica staat nu in de compose en in
`nginx.conf.template`, die allebei bij een update wél ververst worden
## Fase 5 - Het manifest
- [x] `port` op de web-UI-poort zetten in plaats van 50002
- [x] Eigen icoon toevoegen; verwijst nu naar het Electrs-icoon in andermans repo
- [x] `gallery` invullen of tot het minimum beperken; het wijst nu naar een screenshot van Electrs
- [x] `developer`, `website`, `repo`, `support`, `submitter` en `submission` kloppend maken
- [x] `releaseNotes` en `version` bijwerken
- [x] `tagline` en `description` bijwerken; die noemden stunnel, dat er niet meer is
- [x] Controleren dat Gitea `icon.png` als afbeelding serveert. **Ja**, na het omzetten van de
accountzichtbaarheid: 33,9 kB als `image/png`. De eerdere 401 en 404 kwamen van dezelfde oorzaak
als de mislukte kloon, dus er is geen `data:`-URI nodig
## Fase 6 - Installeren en verifiëren
- [x] De bestaande handmatige installatie stoppen; die hield poort 50002 vast en liet de installatie drie
keer falen. Stond in `~/umbrel/home/Containers/ElectrumTLS`
- [x] Store-URL toevoegen in umbrelOS en de app installeren
- [x] Verbinden met een Electrum-wallet over TLS. Werkt: de wallet krijgt direct data terug, wat het hele
pad bewijst, dus TLS-terminatie, certificaat en de verbinding naar de Electrum-server
- [ ] **Na `sudo reboot` controleren dat de app vanzelf terugkomt.** Dit is de aanleiding voor het plan
en de enige controle die er nog echt toe doet. **Uitgesteld op 18-08-2026:** de Umbrel is een
productiemachine en wordt niet op verzoek herstart. Zie [OPEN.md](OPEN.md) punt 7
- [ ] Vervanger die nu wél kan: de app stoppen en starten via umbrelOS. Dat gebruikt hetzelfde
`app-script start`-pad als het opstarten na een herstart, maar bewijst niet de volgorde ten
opzichte van Zoraxy
- [ ] Controleren dat de app terugkomt nadat Electrs gestopt en gestart is
- [ ] **De oude stunnel-container weghalen, vóór de Fulcrum-test.** Hij bindt poort 50002 en dat is de
poort die Fulcrum op de host wil, dus die test kan niet slagen zolang hij bestaat. Met
`docker compose -f ~/umbrel/home/Containers/ElectrumTLS/docker-compose.yml down`. Het externe
`umbrel_main_network` blijft daarbij staan; dat verwijdert compose nooit. **Eigenaar: gebruiker**
- [ ] Omschakelen naar Fulcrum in de umbrelOS-instellingen en controleren dat het zonder aanpassing werkt
- [ ] Pas ná een geslaagde herstart de oude map `~/umbrel/home/Containers/ElectrumTLS` opruimen; tot dan
is dat de terugweg. Let op de volgorde: de container mount zijn `entrypoint.sh` uit die map, dus
eerst de container weg en dan de map
## Fase 7 - Naam en identiteit
Toegevoegd 18-08-2026. De naam beschreef het middel (TLS) en niet wat je ermee kunt.
- [x] Naam wordt **Electrum Gate**. Bijgesteld op 19-08-2026; op 18-08-2026 stond hier nog Electrum
Gateway. TLS is uit de naam en uit de tagline verdwenen; die gaat nu over de afweging Tor tegenover
snelheid
- [x] Store-id `whatsnext`, app-id en mapnaam `whatsnext-electrum-gate`. Zie [OPEN.md](OPEN.md) punt 8
- [x] `developer` en `submitter` op `WhatsNext?` (19-08-2026)
- [x] `tagline` en `description` herschreven, in het Engels, met de Tor-afweging en de lijst met clients
waarvoor de app nuttig is
- [ ] Eigen icoon van de gebruiker inbouwen, in de kleuren van het design-systeem. Het huidige
`icon.png` staat er nog en is niet het definitieve
- [x] **De repo hernoemd naar `UmbrelApps`, met `icon`, `website`, `repo`, `support` en `submission` mee
(25-08-2026, in 0.0.15).** Niet uitgesteld tot GitHub, zoals hier stond, maar afgedwongen door Evolu
Relay: umbrelOS leest per store één repo, dus een tweede app maakte een naam naar deze ene app
onhoudbaar. Het **app-id** ging niet mee en dat hoefde ook niet; dat hangt aan het store-id en niet
aan de URL
- [ ] **In umbrelOS de oude store verwijderen en de nieuwe URL toevoegen.** Hier valt te zien of een
geïnstalleerde app een wisseling van store-URL overleeft, en dat is **niet uitgezocht**; ga er niet
van uit. Zie [OPEN.md](OPEN.md) punt 8. **Eigenaar: gebruiker**
- [ ] Pas daarna de repo `ElectrumTLS` op de Git-server weghalen. Dat is niet alleen opruimen: zolang hij
bestaat, staat het domein nog in een publieke historie. Zie [OPEN.md](OPEN.md) punt 3.
**Eigenaar: gebruiker**
## Geblokkeerd / wacht op
- [x] Keuze van de TLS-poort - **vervallen 19-08-2026**. Open punt 1 van het plan **Configuratie** is
beslist op 50022 en meteen doorgevoerd, omdat de app toch opnieuw geïnstalleerd wordt. Daarmee is
ook de botsing met Fulcrum weg en kan de omschakelcontrole in fase 3 en fase 6 echt gedaan worden