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:
commit
85d85a1295
63 files changed
+13987
No files matched your search
Whitespace-only changes.
Whitespace-only changes.
@@ -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 |
@@ -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
|
||||
Reference in new issue
Block a user