2026-08-25 16:27:57 +02:00
|
|
|
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
|
|
|
|
|
|
2026-09-07 20:20:42 +02:00
|
|
|
# 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.
|
|
|
|
|
|
2026-08-25 16:27:57 +02:00
|
|
|
# De agent. Hij schrijft status.json, leest de certificaten, bevraagt de
|
|
|
|
|
# Electrum-server en neemt de certificaatkeuze aan.
|
|
|
|
|
#
|
2026-09-07 20:20:42 +02:00
|
|
|
# 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.
|
2026-08-25 16:27:57 +02:00
|
|
|
agent:
|
2026-09-07 20:20:42 +02:00
|
|
|
image: sc.kamenier-hamer.nl/sysop/electrum-gate:0.1.0
|
2026-08-25 16:27:57 +02:00
|
|
|
restart: on-failure
|
2026-09-07 20:20:42 +02:00
|
|
|
command:
|
|
|
|
|
- python3
|
|
|
|
|
- /app/agent.py
|
2026-08-25 16:27:57 +02:00
|
|
|
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"
|
2026-09-07 20:20:42 +02:00
|
|
|
# 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}
|
2026-08-27 15:24:24 +02:00
|
|
|
# De zelfcontrole: de agent verbindt met de TLS-poort van de server
|
2026-08-27 16:04:13 +02:00
|
|
|
# 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
|
2026-08-27 15:24:24 +02:00
|
|
|
# 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"
|
2026-08-25 16:27:57 +02:00
|
|
|
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.
|
|
|
|
|
#
|
2026-09-07 20:20:42 +02:00
|
|
|
# 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.
|
2026-08-25 16:27:57 +02:00
|
|
|
- ${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
|
|
|
|
|
|
2026-09-07 20:20:42 +02:00
|
|
|
# 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.
|
2026-08-25 16:27:57 +02:00
|
|
|
server:
|
2026-09-07 20:20:42 +02:00
|
|
|
image: sc.kamenier-hamer.nl/sysop/electrum-gate:0.1.0
|
2026-08-25 16:27:57 +02:00
|
|
|
restart: on-failure
|
2026-09-07 20:20:42 +02:00
|
|
|
# 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.
|
2026-08-25 16:27:57 +02:00
|
|
|
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"
|
2026-09-07 20:20:42 +02:00
|
|
|
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}
|
2026-08-25 16:27:57 +02:00
|
|
|
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
|