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>
101 lines
5.3 KiB
Markdown
101 lines
5.3 KiB
Markdown
# De huidige opzet: hoe het vandaag in elkaar zit
|
|
|
|
Naslag. Wat er ís, zodat een latere sessie het niet hoeft te reconstrueren. Wat er mis mee is en wat eraan
|
|
gebeurt staat in de plannen.
|
|
|
|
**Let op het onderscheid dat dit document maakt**, want het is op 19-08-2026 het belangrijkste feit over
|
|
deze app: er is verschil tussen wat er in de repo staat en wat er op de Umbrel draait. Dat verschil is
|
|
groot, en het per ongeluk gelijkstellen leidt tot conclusies die niet kloppen.
|
|
|
|
| | In de repo | Draait op de Umbrel |
|
|
|-|-|-|
|
|
| Versie | 0.0.3 | 2.0.1, en die app wordt gedeïnstalleerd |
|
|
| App-id | `whatsnext-electrum-gate` | `electrumtls-electrum-tls` |
|
|
| TLS-poort | 50022 | 50002 |
|
|
| Containers | `server` plus `agent` | alleen `server` |
|
|
| Certificaat | door de agent gekozen uit de gevonden mappen | vast pad naar `sync.kamenier-hamer.nl` |
|
|
| Dashboard | leest `status.json` | verzonnen waarden, hardgecodeerd domein |
|
|
|
|
Alles in de kolom "in de repo" is **ongetest buiten de unittests**. De vorige versie draait en een wallet
|
|
verbindt er over TLS mee; dat is bewezen. De nieuwe niet.
|
|
|
|
## 1. Wat het doet
|
|
|
|
Een Electrum-server spreekt onversleuteld TCP. Een wallet buiten het netwerk wil TLS. Deze app zet daar
|
|
nginx met de `stream`-module tussen: die accepteert TLS, termineert het, en praat plat door naar de
|
|
Electrum-server die de gebruiker in umbrelOS gekozen heeft.
|
|
|
|
```
|
|
Electrum-wallet ──TLS 50022──▶ nginx stream ──plat──▶ Electrs, Fulcrum of ElectrumX
|
|
▲
|
|
cert.conf, geschreven door de agent
|
|
```
|
|
|
|
Het certificaat komt van een reverse proxy die op dezelfde Umbrel al Let's Encrypt-certificaten beheert.
|
|
Deze app leest die mappen alleen; hij vraagt zelf niets aan en vernieuwt niets.
|
|
|
|
## 2. De twee containers
|
|
|
|
**`server`** (`nginx:alpine`) doet twee dingen. In het `http`-blok serveert hij het dashboard op poort 80,
|
|
achter de `app_proxy` van umbrelOS, plus `status.json` en een doorstuur naar de API van de agent. In het
|
|
`stream`-blok termineert hij TLS op 50022. Zijn `command` schrijft bij het starten het `log_format` voor de
|
|
sessielog weg, wacht tot de agent een certificaat gekozen heeft, en draait daarna een lus die nginx
|
|
herlaadt zodra de agent daarom vraagt.
|
|
|
|
**`agent`** (`python:3-alpine`) draait `agent.py` en doet elke minuut een ronde: de certificaatmappen
|
|
scannen, de keuze toepassen, de Electrum-server bevragen voor blokhoogte en reactietijd, de sessielog van
|
|
nginx uitlezen, en `status.json` schrijven. Daarnaast luistert hij op poort 8000 voor de certificaatkeuze
|
|
van het dashboard.
|
|
|
|
**Waarom de agent nginx niet zelf herlaadt.** Dat zou de Docker-socket vragen, en die is er bewust uit
|
|
gehaald: hij geeft root-toegang tot de host. In plaats daarvan schrijft de agent `cert.conf` plus een
|
|
vlagbestand, en herlaadt de nginx-container zichzelf. Een reload verbreekt bestaande wallet-verbindingen
|
|
niet; een containerherstart wel.
|
|
|
|
## 3. De gedeelde map
|
|
|
|
Beide containers hebben `${APP_DATA_DIR}/runtime` gemount op `/var/lib/gate`. Dat is het enige raakvlak
|
|
tussen de twee, en het is met opzet een map met bestanden en geen protocol.
|
|
|
|
| Bestand | Wie schrijft | Waarvoor |
|
|
|-|-|-|
|
|
| `status.json` | agent | alles wat het dashboard toont |
|
|
| `cert.conf` | agent | de `ssl_certificate`-regels die nginx includeert |
|
|
| `reload` | agent | vraagt nginx om een herlading; wordt `reload.done` |
|
|
| `stream-log.conf` | nginx | het `log_format`, hier omdat een dollarteken niet in een template kan |
|
|
| `stream.log` | nginx | een regel per afgesloten sessie, zonder client-adres |
|
|
| `config/selected-cert` | agent | de keuze van de gebruiker, overleeft een herstart |
|
|
|
|
## 4. Wat er nog hardgecodeerd is
|
|
|
|
Sinds 19-08-2026 bijna niets meer in de app zelf. De domeinnaam en het certificaatpad zijn uit
|
|
`docker-compose.yml` en `nginx.conf.template` verdwenen: de agent bepaalt ze.
|
|
|
|
Wat er nog staat, en waar:
|
|
|
|
- **de mounts van de certificaatbronnen** in `docker-compose.yml`, want een pad instellen naar iets wat
|
|
niet gemount is levert een map op die de container niet ziet. Nginx Proxy Manager staat er
|
|
uitgecommentarieerd bij, omdat het pad niet geverifieerd is;
|
|
- **de poortnummers** 50022 en 3850;
|
|
- **de vertaaltabel van backend-IP naar naam** in de agent, met `unknown` als terugval;
|
|
- **de repo-URL's** in `umbrel-app.yml`. Die horen daar; ze wijzen naar de repo.
|
|
|
|
Het plan **Configuratie** haalt de eerste twee naar een configuratiebestand.
|
|
|
|
## 5. Hoe het geïnstalleerd wordt
|
|
|
|
Als community app store: de gebruiker plakt de repo-URL in umbrelOS en installeert de app. umbreld kloont
|
|
anoniem met isomorphic-git, dus de repo moet publiek en SHA-1 zijn. Bij installatie wordt de hele app-map
|
|
gekopieerd; **bij een update alleen een whitelist**, en dat stuurt het hele ontwerp. Zie
|
|
[Umbrel-appstore-spec.md](Umbrel-appstore-spec.md).
|
|
|
|
## 6. Wat er goed aan is, en dat is het onthouden waard
|
|
|
|
- **geen Docker-socket**, dus geen root-toegang tot de host;
|
|
- **geen eigen image**, dus geen bouwstap, geen registry en geen multi-arch-gedoe. Beide containers
|
|
draaien op een officiële image met configuratie uit een template;
|
|
- **niets wordt bij het starten geïnstalleerd.** De vorige opzet deed `apk add stunnel` bij élke start;
|
|
- **de app vraagt geen certificaten aan.** ACME blijft bij de reverse proxy, en dat is de reden dat deze
|
|
app zo klein kan blijven;
|
|
- **een certificaatvernieuwing is een reload**, dus wallet-verbindingen blijven staan.
|