UmbrelApps: community app store whatsnext

Electrum Gate, Evolu Relay en Atreides Assets, met de image-recepten in tools/ en de tests in tests/. Begonnen zonder voorgeschiedenis op 09-10-2026.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
HarmenandClaude Opus 5.5 committed 2026-10-09 10:40:25 +02:00
commit 85d85a1295
63 files changed
+13987

No files matched your search

Whitespace-only changes.
Whitespace-only changes.
+136
View File
@@ -0,0 +1,136 @@
services:
# umbrelOS genereert deze service zelf; wij vullen alleen in waar hij heen moet
# wijzen. De hostnaam heeft de vorm <app-id>_<compose-service>_1.
app_proxy:
environment:
APP_HOST: whatsnext-electrum-gate_server_1
APP_PORT: 80
# Beide containers draaien dezelfde image, gebouwd door tools/electrum-gate/
# build.sh. Wat erin zit staat in de Dockerfile daar: nginx met de pagina en het
# stream-blok, en python3 met de agent. Tot 0.0.29 stonden die bestanden hier
# als *.template en draaiden ze op python:3-alpine en nginx:alpine; waarom dat
# veranderd is staat in het plan Eigenimage, PLAN.md §3.
#
# De tag hoort gelijk te zijn aan VERSION in build.sh, en er hoort een digest
# achter zodra de image geduwd is. Let op de valstrik uit Kennis.md: een
# oude digest onder een nieuwe tag levert stilzwijgend de oude image, dus laat
# de digest er even van af zolang de nieuwe niet geduwd is.
# De agent. Hij schrijft status.json, leest de certificaten, bevraagt de
# Electrum-server en neemt de certificaatkeuze aan.
#
# Waarom een tweede container en niet een lus in de server hieronder: dit werk
# is een programma. Een certificaatdatum uitlezen, een JSON-RPC-verzoek doen,
# een geschiedenis bijhouden en een keuze valideren zijn geen dingen die je met
# openssl en nc aan elkaar knoopt zonder dat het stil verkeerde antwoorden gaat
# geven.
agent:
image: sc.kamenier-hamer.nl/sysop/electrum-gate:0.1.0@sha256:97fee09ba8004c2f0cf55e03cb612474f0a4b24724f9186a4e6769cebb7cfd8f
restart: on-failure
command:
- python3
- /app/agent.py
environment:
# Het adres van de Electrum-server die de gebruiker in umbrelOS gekozen
# heeft. umbrelOS vult dit in op grond van de afhankelijkheid hieronder,
# dus dit werkt met Electrs, Fulcrum en ElectrumX.
GATE_ELECTRUM_HOST: ${APP_ELECTRS_NODE_IP}
GATE_ELECTRUM_PORT: ${APP_ELECTRS_NODE_PORT}
GATE_TLS_PORT: "50022"
# De versie uit het manifest, voor de kop van de pagina. Die stond tot
# 0.0.29 rechtstreeks in de pagina, ingevuld door umbreld; nu de pagina in
# de image zit, geeft de agent hem door via status.json.
GATE_APP_VERSION: ${APP_VERSION}
# De zelfcontrole: de agent verbindt met de TLS-poort van de server
# hieronder en maakt de handdruk af. Niet localhost: dat is een andere
# container en dus een andere netwerk-namespace.
#
# De volledige containernaam en niet de servicenaam 'server'. Dat stond er
# eerst, en op het apparaat gaf het `[Errno 111] Connection refused`
# (27-08-2026). Die fout is veelzeggend: geweigerd betekent dat de naam wél
# oploste, alleen niet naar ons. 'server' is een naam die meer apps op deze
# machine gebruiken, en op een gedeeld netwerk is het dus een gok wie je
# krijgt. De vorm <app-id>_<service>_1 is uniek per app; het is niet toevallig
# dezelfde vorm die umbrelOS hierboven van APP_HOST verlangt.
GATE_TLS_HOST: whatsnext-electrum-gate_server_1
# Niet elke ronde meten, want elke meting is voor nginx een gewone sessie
# en levert dus een regel in het activiteitenlog op. Vijf minuten is vaak
# genoeg voor een waarde die zelden verandert; na een certificaatwissel
# wordt er sowieso gemeten.
GATE_SELF_CHECK_INTERVAL: "300"
GATE_INTERVAL: "60"
GATE_API_PORT: "8000"
GATE_STATE_DIR: /var/lib/gate
# Bron-naam=map. Een bron die niet gemount is, bestaat niet en wordt
# overgeslagen; dat is de normale toestand voor een reverse proxy die de
# gebruiker niet draait.
GATE_CERT_SOURCES: "Zoraxy=/certs/zoraxy,Own folder=/certs/own"
# De enige beschrijfbare bron, en dus de map waarin een upload van de
# pagina landt. Expliciet en niet afgeleid uit de lijst hierboven: welke
# bron beschrijfbaar is, hoort te staan naast de mount die dat toestaat.
# Leeg zetten schakelt uploaden uit.
GATE_UPLOAD_DIR: /certs/own
volumes:
# De gedeelde toestand: status.json, cert.conf, de herlaadvlag en de
# gekozen certificaat-id. Beide containers zitten hierin.
#
# Onder data/, want dat is wat andere apps doen: electrs mount
# ${APP_DATA_DIR}/data/electrs, mempool ${APP_DATA_DIR}/data. Verplaatst op
# 20-08-2026 met het oog op publicatie in de officiele store.
- ${APP_DATA_DIR}/data/runtime:/var/lib/gate
# De certificaatbronnen. Zoraxy alleen lezen: dat zijn de certificaten van
# een andere app en die raakt deze app niet aan.
- ${UMBREL_ROOT}/app-data/zoraxy/data/config/conf/certs:/certs/zoraxy:ro
# De eigen map is de enige die beschrijfbaar is, want hier landt een upload
# van de pagina. Alleen de agent; de nginx-container houdt hem alleen-lezen,
# want die hoeft er nooit iets neer te zetten.
- ${APP_DATA_DIR}/data/certs:/certs/own
#
# Nginx Proxy Manager hoort hier als derde bron bij en staat er bewust nog
# niet in. Het pad hieronder is een gok en niet geverifieerd, en een
# bind-mount naar een pad dat niet bestaat laat Docker het aanmaken. Dat zou
# een lege maphierarchie neerzetten in de app-data van een app die
# misschien niet eens geinstalleerd is, en die rommel blijft daar staan.
# Eerst op de Umbrel controleren waar NPM zijn certificaten neerzet, dan
# deze regel aanzetten en de naam toevoegen aan GATE_CERT_SOURCES.
#
# - ${UMBREL_ROOT}/app-data/nginx-proxy-manager/data/letsencrypt/live:/certs/npm:ro
# nginx: de pagina op poort 80 achter de app_proxy, en de TLS-poort 50022 zodra
# de agent een certificaat gekozen heeft. Het startscript is entrypoint.sh in de
# image; tot 0.0.29 stond dat hier als command-blok van ruim honderd regels, met
# elk dollarteken verdubbeld. Wat het doet staat daar uitgelegd.
server:
image: sc.kamenier-hamer.nl/sysop/electrum-gate:0.1.0@sha256:97fee09ba8004c2f0cf55e03cb612474f0a4b24724f9186a4e6769cebb7cfd8f
restart: on-failure
# De agent moet er zijn voordat nginx start, want de proxy_pass naar de agent
# wordt bij het starten opgelost en een onbekende naam laat nginx afbreken.
# Op de cert.conf van de agent wordt niet gewacht: de pagina komt hoe dan ook
# omhoog, zie entrypoint.sh.
depends_on:
- agent
ports:
# De TLS-poort voor Electrum-wallets. Dit is de enige poort die deze app
# zelf publiceert; de web-UI loopt via app_proxy.
#
# 50022 en niet de conventionele 50002, omdat Fulcrum die op de host
# bezet: met Fulcrum als backend zou de container niet starten, en dat is
# precies het omschakelen dat deze app moet ondersteunen. De poort naar
# buiten is toch al een andere, want die staat in de router doorgestuurd.
# Beslist 19-08-2026, open punt 1 van het plan Configuratie.
- "50022:50022"
environment:
# Dezelfde twee als bij de agent. entrypoint.sh vult ze in het stream-blok
# in, want nginx kan in een proxy_pass geen omgevingsvariabele lezen. Tot
# 0.0.29 deed umbreld dat via stream.conf.template.
GATE_ELECTRUM_HOST: ${APP_ELECTRS_NODE_IP}
GATE_ELECTRUM_PORT: ${APP_ELECTRS_NODE_PORT}
volumes:
# Dezelfde gedeelde toestand als de agent. nginx leest hier cert.conf en
# status.json, en schrijft de sessielog.
- ${APP_DATA_DIR}/data/runtime:/var/lib/gate
# De certificaten zelf moeten ook hier gemount zijn: de agent bepaalt
# welk pad in cert.conf komt, maar nginx moet het bestand kunnen openen.
- ${UMBREL_ROOT}/app-data/zoraxy/data/config/conf/certs:/certs/zoraxy:ro
- ${APP_DATA_DIR}/data/certs:/certs/own:ro
Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

+236
View File
@@ -0,0 +1,236 @@
# De veldvolgorde hieronder is niet vrij: de packaging-documentatie van de
# officiele appstore schrijft hem voor. Zie de tabel in
# HomeGit/Docs/Referenties/UmbrelApps/Umbrel-appstore-spec.md, en de toets in
# tests/test_server_start_zonder_certificaat.py die hem vasthoudt.
#
# Wat de spec niet noemt, staat onderaan dit bestand en niet ertussen. Dan is de
# voorgeschreven kop letterlijk goed en hoeft er bij inlevering alleen iets weg.
manifestVersion: 1
id: whatsnext-electrum-gate
category: bitcoin
name: Electrum Gate
version: "0.1.0"
tagline: Your own node from anywhere, without waiting for Tor
description: >-
The privacy win is already yours: you run the Electrum server. A public one gets asked for
the history of every address in your wallet, and that tells it which addresses and which
balance belong to one person. Your own server never reports back.
What is left is a trade. Tor is the more private way in, and every wallet below speaks it.
But it adds hundreds of milliseconds to every request, it drops when a phone sleeps or
changes network, and plenty of networks block it outright. Electrum Gate is the other side
of that trade: a TLS front door on your node. Fast, no fingerprint to type over, and it
works on any network you happen to be on.
It reuses the Let's Encrypt certificate your reverse proxy already manages, so there is
nothing to request and nothing to renew. A renewal is picked up on its own, without
dropping connections that are already open. You can also upload a certificate you manage
yourself, if you do not run a reverse proxy on this machine.
Nothing in the middle. The connection runs from your wallet straight to your own node,
encrypted with a certificate you already own, for a domain you already control. There is no
account to create, no tunnel service that terminates your traffic along the way, and no
client to install on every device you use: the wallets below already speak TLS, they only
need an address. What it does ask of you is one forwarded port on your router.
Useful for wallets connecting from outside your home: Trezor Suite, Electrum, Sparrow,
BlueWallet, Nunchuk, Blockstream and BitBoxApp. Apps on the Umbrel itself do not need
it, they already reach the Electrum server directly.
The dashboard hands you the exact line each of those wallets asks for, and shows how long
your certificate is still good for and whether your Electrum server is answering. Electrs,
Fulcrum and ElectrumX all work, switchable in the umbrelOS settings.
What it does not do: hide that the traffic exists. Your domain is public in the certificate
transparency logs. If that matters more to you than speed, use Tor instead.
# Eén verhaal over deze versie, dan één regel per eerdere versie. Niet meer dan
# dat, en dat staat hier omdat het drie versies achter elkaar fout ging: bij elke
# release kwam er een nieuwe kop bovenop terwijl de oude tekst eronder bleef
# staan. In 0.0.9 stond er daardoor drie keer "Earlier releases" en twee keer
# dezelfde 0.0.4-regel. De toets let er nu op.
releaseNotes: >-
The app now ships as its own image instead of mounting its program files into two stock images. Nothing
changes in what it does; what changes is where the code lives. The app data folder now holds only your
data: the certificate you chose, the one you uploaded, and the status the page reads. The startup logic
that used to be a hundred lines of shell inside the compose file is a plain script inside the image, and
the app icon updates along with everything else, which it could not before.
Everything in 0.0.29:
The glow behind the page is gone. It arrived in 0.0.25 and it did what it was meant to do, but a status
page is something you glance at, and a coloured wash over the whole window is a lot of decoration for a
glance. The panels keep their edge, their shadow and their top light, so they still read as panels; only
the light behind them is off. The switch is still in the page for anyone who wants it back.
Everything in 0.0.28:
The block height tile is gone. This app is a front door for your Electrum server; what the chain is
doing is not its news to report, and every wallet and block explorer you own already tells you. Four
tiles are left, all of them about this gateway: which server your traffic goes to, whether it answers
and how fast, how long your certificate is still good for, and whether the front door itself is up.
How old the readings are now sits under the response time, where it used to sit under the height.
Everything in 0.0.27:
Fixes the Status card reading "Not answering" for five minutes after every restart or update, with
a connection error underneath, while the gateway itself was working fine the whole time. The check
runs from inside the app and it ran before the part it checks had started, so the very first
measurement of every restart was bound to fail, and nothing looked again for five minutes. It now
says Checking on that first round and takes a real measurement a minute later, and a failed
measurement is repeated within a minute instead of after five.
Everything in 0.0.26:
Two adjustments to the refresh. The Status card reads in the accent colour again when it says
Running, and on a phone the page drops back to the flat look: the glow is wider than a phone screen,
so it stopped being a gradient and became a haze over everything.
Earlier releases:
0.0.25 was a visual refresh shared with the other app in this store: translucent cards with a light edge
and a shadow, one corner radius for every framed element, and a glow behind the page. That glow is the
one this release switches off; the rest of it is still there.
0.0.24 added an "About this app" item to the menu, and changed the Status card from "Answering" with
"answered in 7 ms, from inside the app" underneath to "Running" with the measurement below it. The
caveat moved into that dialog, where there is room to state it: the check runs inside the app, so a
router that no longer forwards the port still reads as Running here.
0.0.23 fixed a page that could go blank or show stale values once another app from the same store was
installed. The page reached its helper by a short name that a second app happened to use as well, so
roughly half of its requests ended up at the wrong one.
0.0.22 gave panels in light mode an outline as well as a shadow. A soft shadow on white gives depth but
no edge, so where a panel ended was a matter of looking closely. Dark mode was unchanged.
0.0.21 put every tile value at the same size, so a block height no longer looked more important than a
server name beside it, and gave the dialog a cross to close instead of the word "Close".
0.0.20 made the five tiles a little taller, so their titles and values are no longer crowded together.
0.0.19 moved the text under each tile down to the bottom, level with the response graph beside it, and
put the arrow on "Setting up your wallet" to the left of the title where the browser would have put it.
0.0.18 fixed the Status tile reporting "Not answering" on a gateway that was working fine: the check was
connecting to the wrong container. It also made the menu three plain dots instead of a button, renamed
its first item to "Settings", opened the dialog in the middle of the screen instead of the top left,
made the tiles taller with their values along the bottom, swapped response time and block height, and
halved the height of the activity log.
0.0.17 rebuilt the dashboard around five small tiles, moved choosing and uploading certificates into a
dialog behind the menu at the top right, put the activity log across the full width, and collapsed
"Setting up your wallet" into a much shorter panel with two copy buttons instead of one per wallet.
0.0.16 taught the app to check its own front door: it connects to its own TLS port, completes the
handshake, and compares the certificate it gets back with the one you picked. That catches a
certificate change that never actually took effect, which looks fine from the outside and fails at your
wallet. It does not tell you whether your gateway can be reached from outside; the check runs inside the
app.
0.0.15 moved the app store this app comes from to a new address, and pointed every link in this listing
there. If you added the store at its old address, remove it in umbrelOS and add the new one.
0.0.14 stopped calling a scan from the internet a refusal. Those now read "probe", in grey, and red
is kept for a session that did carry traffic and then broke. The panels also got more room between
them.
0.0.13 made the certificate panel and the activity log grow and shrink together, so opening the
upload section no longer leaves a gap under the button.
0.0.12 tightened the spacing in the certificate panel, and dropped a line claiming certificates
are read from Nginx Proxy Manager.
0.0.11 lined up the copy buttons along the right edge on a phone, and moved the upload section
above the certificate picker.
0.0.10 made the dashboard work on a phone, and dropped the tile counting the days left on your
certificate.
0.0.9 moved everything the app writes into the "data" folder inside the app folder, which is
where the App Store expects an app to keep its state.
0.0.8 gave the dashboard the same line as this listing, instead of describing TLS as a means.
0.0.7 added uploading your own certificate, with the key checked against the certificate before
anything is stored.
0.0.6 made a connected wallet visible while it is connected, turned the certificate picker into
a dropdown, and rewrote the session line in the activity log.
0.0.5 shortened the message you get when more than one certificate was found.
0.0.4 fixed an install that showed no dashboard at all.
developer: "WhatsNext?"
website: https://sc.kamenier-hamer.nl/sysop/UmbrelApps
dependencies:
- electrs
repo: https://sc.kamenier-hamer.nl/sysop/UmbrelApps
support: https://sc.kamenier-hamer.nl/sysop/UmbrelApps/issues
# De poort waarop umbrelOS de web-UI van deze app aanbiedt, niet de TLS-poort.
# Die staat in docker-compose.yml en is 50022.
port: 3850
# Leeg laten bij een nieuw pakket; de plaatjes doet het store-team zelf.
gallery: []
path: ""
submitter: "WhatsNext?"
submission: https://sc.kamenier-hamer.nl/sysop/UmbrelApps
# ── Hieronder staat wat de voorgeschreven volgorde niet noemt ────────────────
#
# defaultUsername en defaultPassword stonden hier met een lege waarde en zijn
# eruit. Deze app heeft geen eigen inlog; de app_proxy van umbrelOS zet er zijn
# eigen voor. Een leeg veld zegt niets en suggereert dat er iets te vullen valt.
# Wat niet in de back-up hoeft. Paden zijn relatief aan de app-datamap en
# ondersteunen een jokerteken; nagekeken in app.ts van umbreld op 20-08-2026.
#
# Alleen de twee die groeien of elke minuut veranderen. Wat er bewust NIET bij
# staat is data/runtime/config: daar zit de certificaatkeuze van de gebruiker, en
# die is het enige in deze map dat niet opnieuw te bedenken is.
backupIgnore:
- data/runtime/stream.log
- data/runtime/status.json
# Het icoon hoort bij een eigen store en moet bij inlevering in de officiele
# store juist weg: die host iconen apart. Daarom staat het als laatste, want dan
# is dit de enige regel die eruit moet en blijft de rest letterlijk op orde.
icon: https://sc.kamenier-hamer.nl/sysop/UmbrelApps/raw/branch/main/whatsnext-electrum-gate/icon.png