services: # umbrelOS genereert deze service zelf; wij vullen alleen in waar hij heen moet # wijzen. De hostnaam heeft de vorm __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 KNOWLEDGE.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 __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