# ═══════════════════════════════════════════════════════════════════════════════ # Evolu Relay - je eigen sync-server voor apps die op Evolu gebouwd zijn. # # Drie containers: de relay, een agent voor de statuspagina, en nginx die die # pagina serveert. Geen Postgres en geen quota-manager meer; die hoorden bij de # relay van Trezor, en die is als zelf-gehoste relay in de kern onbruikbaar omdat # de cliënt bij een eigen relay-URL nooit een eigenaar registreert. Zie het plan # Umbrelapp, OPEN.md punt 6, en de proef in PLAN.md §6a. # # De poortindeling is omgedraaid ten opzichte van 25-08-2026, en dat is de kern # van dit bestand: # # - de PAGINA hangt achter app_proxy, mét de inlog van umbrelOS. Vroeger stond de # relay daar en moest de inlog dus uit, waardoor een statuspagina net zo # onbeschermd zou zijn als de relay zelf; # - de RELAY publiceert zijn eigen poort, waar Zoraxy met TLS naartoe wijst. # een sync-cliënt is geen browser met een sessiecookie en zou achter de inlog # een inlogpagina krijgen in plaats van de relay. # # Dat is hetzelfde patroon als Electrum Gate in deze store: de web-UI via de # proxy, het protocol op een eigen poort. Zie PLAN.md §4h. # ═══════════════════════════════════════════════════════════════════════════════ services: # umbrelOS genereert deze service zelf; wij vullen alleen in waar hij heen moet # wijzen. De hostnaam heeft de vorm __1. # # PROXY_AUTH_ADD staat hier bewust NIET op "false". Dat stond er tot 0.0.2 wel, # toen de relay hierachter hing. Nu wijst dit naar de statuspagina, en die hoort # juist achter de inlog. Zet het niet terug zonder §4h te lezen. app_proxy: environment: APP_HOST: whatsnext-evolu-relay_server_1 APP_PORT: 80 # Alle drie de containers draaien dezelfde image, gebouwd uit tools/evolu-relay/ # door build.sh en geduwd naar het Gitea-register op dezelfde server als deze # store. Dat moet: umbreld haalt élke image op via de Docker Engine API en niet # via compose, dus een lokaal gebouwde tag is voor hem onbereikbaar en de # installatie faalt met "pull access denied". Op 25-08-2026 op het apparaat # vastgesteld. # # Tot 0.5.6 zat alleen de relay in die image en draaiden de agent en de pagina # als *.template op python:3-alpine en nginx:alpine. Sinds 0.6.0 zit alles erin; # zie het plan Eigenimage, PLAN.md §8. # # De digest hoort erbij en niet alleen de tag: een tag kan opnieuw geduwd worden # en dan draait er iets anders dan hier staat. Staan ze allebei, dan bepaalt de # digest wat er gehaald wordt en is de tag alleen leesbaarheid. Houd de tag # gelijk aan VERSION in build.sh (drie keer hier) en `version` in het manifest. # # De keerzijde bij een verhoging: een OUDE digest onder een NIEUWE tag levert # stilzwijgend de oude image. Bij 0.5.0 stond hier daarom even een tag zonder # digest, zodat het hard faalde tot de image bestond, in plaats van stil de # relay zonder tijdvenster te draaien. Doe dat weer zo bij elke verhoging: eerst # de digest weg, dan bouwen en duwen, dan de nieuwe erin. # # Gebouwd op de Umbrel zelf, dus één architectuur (amd64). Voor de officiele # store hoort er een multi-arch index-digest met arm64 in; zie het masterplan # Publicatie-Relay. relay: image: sc.kamenier-hamer.nl/sysop/evolu-relay:0.6.0@sha256:4dc56b8a35a1b79ca6e6a731eb520e20d05c25ad6bfc6c44b3e328f6f08b5b54 restart: on-failure # Als node en niet als root, zoals de image tot 0.5.6 zelf al deed met USER. # Nu de image ook nginx en de agent draagt, staat er geen USER meer in en # regelt de compose het per container; de relay is de enige die het niet # nodig heeft. De map data/relay is van deze gebruiker. user: node ports: # De relay zelf. Dit is de poort waar Zoraxy met TLS naartoe wijst, en de # enige die deze app publiceert; de pagina loopt via app_proxy. # # 3852 op de host en niet 4000: dat laatste is een veelgebruikte poort en # een botsing merk je pas als de app niet start. Dezelfde les als bij # Electrum Gate, dat om die reden 50022 gebruikt in plaats van 50002. # Binnen de container blijft het 4000, want dat is wat de relay verwacht. - "3852:4000" environment: RELAY_PORT: "4000" # Per schrijfactie en niet per eigenaar; zo is isOwnerWithinQuota bij Evolu # bedoeld. Eén labelwijziging is klein, dus een schrijfactie hierboven is # eerder een fout of misbruik dan normaal gebruik. Zie PLAN.md §4g. RELAY_MAX_WRITE_BYTES: "1048576" volumes: # De database van de relay én onze allowlist ernaast, in dezelfde map. Het # programma doet chdir naar `data`, net als de relay van Evolu zelf, dus dit # pad ligt vast. # # Onder data/ en niet in een naamloos Docker-volume: dit is wat umbrelOS # bewaart en meeneemt in de back-up. In een volume zou de synchronisatie een # herinstallatie van de app niet overleven. - ${APP_DATA_DIR}/data/relay:/app/data # De agent bedient de statuspagina. Hij beslist niets: hij leest wat het # relay-proces heeft opgeschreven en legt opdrachten in een postbus die de relay # zelf leegmaakt. Twee processen die in dezelfde allowlist schrijven is een # wedloop die je een keer per jaar treft en dan niet kunt reproduceren. agent: image: sc.kamenier-hamer.nl/sysop/evolu-relay:0.6.0@sha256:4dc56b8a35a1b79ca6e6a731eb520e20d05c25ad6bfc6c44b3e328f6f08b5b54 restart: on-failure command: - python3 - /app/agent.py environment: RELAY_STATE_DIR: /var/lib/relay # De versie uit het manifest, voor de kop van de pagina. Die stond tot 0.5.6 # rechtstreeks in de pagina, ingevuld door umbreld; nu de pagina in de image # zit, geeft de agent hem door via api/status. RELAY_APP_VERSION: ${APP_VERSION} # De volledige containernaam en niet de servicenaam 'relay'. Bij Electrum # Gate gaf de korte naam op het apparaat een geweigerde verbinding: de naam # loste wél op, maar naar een container van een andere app op hetzelfde # netwerk. De vorm __1 is uniek per app. RELAY_HOST: whatsnext-evolu-relay_relay_1 RELAY_PORT: "4000" # Alleen om op de pagina het adres te tonen dat je in je cliënt invult. # Moet gelijk zijn aan de hostpoort hierboven. RELAY_PUBLIC_PORT: "3852" RELAY_API_PORT: "8000" volumes: # Dezelfde map als de relay. De agent moet hier kunnen schrijven, want de # opdrachten van de pagina landen hier. - ${APP_DATA_DIR}/data/relay:/var/lib/relay # nginx met de pagina, uit dezelfde image. Geen mounts: pagina, configuratie en # icoon zitten in de image, en de pagina heeft geen eigen staat. server: image: sc.kamenier-hamer.nl/sysop/evolu-relay:0.6.0@sha256:4dc56b8a35a1b79ca6e6a731eb520e20d05c25ad6bfc6c44b3e328f6f08b5b54 restart: on-failure command: - nginx - -g - daemon off; # De agent moet er zijn voordat nginx start: de proxy_pass naar de agent wordt # bij het starten opgelost en een onbekende naam laat nginx afbreken. depends_on: - agent