2026-08-25 17:18:22 +02:00
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
2026-08-28 11:49:15 +02:00
|
|
|
# Evolu Relay - je eigen sync-server voor apps die op Evolu gebouwd zijn.
|
2026-08-25 17:18:22 +02:00
|
|
|
#
|
2026-08-28 11:22:32 +02:00
|
|
|
# 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.
|
2026-08-28 11:49:15 +02:00
|
|
|
# een sync-cliënt is geen browser met een sessiecookie en zou achter de inlog
|
|
|
|
|
# een inlogpagina krijgen in plaats van de relay.
|
2026-08-28 11:22:32 +02:00
|
|
|
#
|
|
|
|
|
# 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.
|
2026-08-25 17:18:22 +02:00
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
|
|
|
|
|
|
services:
|
2026-08-28 11:22:32 +02:00
|
|
|
# umbrelOS genereert deze service zelf; wij vullen alleen in waar hij heen moet
|
|
|
|
|
# wijzen. De hostnaam heeft de vorm <app-id>_<compose-service>_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.
|
2026-08-25 17:18:22 +02:00
|
|
|
app_proxy:
|
|
|
|
|
environment:
|
2026-08-28 11:22:32 +02:00
|
|
|
APP_HOST: whatsnext-evolu-relay_server_1
|
|
|
|
|
APP_PORT: 80
|
2026-08-25 17:18:22 +02:00
|
|
|
|
2026-09-08 16:36:30 +02:00
|
|
|
# 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.
|
2026-08-25 17:18:22 +02:00
|
|
|
relay:
|
2026-09-08 16:59:54 +02:00
|
|
|
image: sc.kamenier-hamer.nl/sysop/evolu-relay:0.6.0@sha256:4dc56b8a35a1b79ca6e6a731eb520e20d05c25ad6bfc6c44b3e328f6f08b5b54
|
2026-08-25 17:18:22 +02:00
|
|
|
restart: on-failure
|
2026-09-08 16:36:30 +02:00
|
|
|
# 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
|
2026-08-28 11:22:32 +02:00
|
|
|
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"
|
2026-08-25 17:18:22 +02:00
|
|
|
environment:
|
|
|
|
|
RELAY_PORT: "4000"
|
2026-08-28 11:22:32 +02:00
|
|
|
# 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"
|
2026-08-25 17:18:22 +02:00
|
|
|
volumes:
|
2026-08-28 11:22:32 +02:00
|
|
|
# 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.
|
|
|
|
|
#
|
2026-08-25 17:18:22 +02:00
|
|
|
# Onder data/ en niet in een naamloos Docker-volume: dit is wat umbrelOS
|
2026-08-28 11:22:32 +02:00
|
|
|
# bewaart en meeneemt in de back-up. In een volume zou de synchronisatie een
|
2026-08-25 17:18:22 +02:00
|
|
|
# herinstallatie van de app niet overleven.
|
2026-08-28 11:22:32 +02:00
|
|
|
- ${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:
|
2026-09-08 16:59:54 +02:00
|
|
|
image: sc.kamenier-hamer.nl/sysop/evolu-relay:0.6.0@sha256:4dc56b8a35a1b79ca6e6a731eb520e20d05c25ad6bfc6c44b3e328f6f08b5b54
|
2026-08-28 11:22:32 +02:00
|
|
|
restart: on-failure
|
2026-09-08 16:36:30 +02:00
|
|
|
command:
|
|
|
|
|
- python3
|
|
|
|
|
- /app/agent.py
|
2026-08-28 11:22:32 +02:00
|
|
|
environment:
|
|
|
|
|
RELAY_STATE_DIR: /var/lib/relay
|
2026-09-08 16:36:30 +02:00
|
|
|
# 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}
|
2026-08-28 11:22:32 +02:00
|
|
|
# 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 <app-id>_<service>_1 is uniek per app.
|
|
|
|
|
RELAY_HOST: whatsnext-evolu-relay_relay_1
|
|
|
|
|
RELAY_PORT: "4000"
|
2026-08-28 11:49:15 +02:00
|
|
|
# Alleen om op de pagina het adres te tonen dat je in je cliënt invult.
|
2026-08-28 11:22:32 +02:00
|
|
|
# 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
|
|
|
|
|
|
2026-09-08 16:36:30 +02:00
|
|
|
# nginx met de pagina, uit dezelfde image. Geen mounts: pagina, configuratie en
|
|
|
|
|
# icoon zitten in de image, en de pagina heeft geen eigen staat.
|
2026-08-28 11:22:32 +02:00
|
|
|
server:
|
2026-09-08 16:59:54 +02:00
|
|
|
image: sc.kamenier-hamer.nl/sysop/evolu-relay:0.6.0@sha256:4dc56b8a35a1b79ca6e6a731eb520e20d05c25ad6bfc6c44b3e328f6f08b5b54
|
2026-08-28 11:22:32 +02:00
|
|
|
restart: on-failure
|
2026-09-08 16:36:30 +02:00
|
|
|
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.
|
2026-08-28 11:22:32 +02:00
|
|
|
depends_on:
|
|
|
|
|
- agent
|