Files
UmbrelApps/whatsnext-evolu-relay/docker-compose.yml
T
HarmenandClaude Opus 5 e4b0aa5df9 Relay 0.7.1: de twee eigenaarskaders opgeruimd
Vier punten van de gebruiker na een dag met 0.7.0. Drie zijn woordkeuze:
"Accepted owners" en "Waiting list" heten "Accepted" en "Waiting", de badge
"Waiting" is weg en de regel onder het adres is weg. De badge kon eruit zonder
verlies, want het onderscheid waarvoor hij er was blijft staan: een
geblokkeerde eigenaar is nu precies de regel met badge.

Het vierde punt was echt werk: elke rij is nu even hoog. Een rij werd hoger op
het moment dat je hem een naam gaf, want het label duwde het id naar een derde
regel. Nu deelt het id de onderregel met de tijden, afgekapt met een puntje en
volledig in de tooltip. Een vaste hoogte in CSS laat witruimte achter onder een
rij zonder label en leest dan als een weergavefout.

Nagekeken in voorbeeld/: vijf rijen, alle vijf 68px, ook tijdens het labelen.
Op het apparaat nog ongezien, want er is geen image: VERSION, het manifest en
de compose staan op 0.7.1 zonder digest.

Suite groen: 42, 90, 36, 22, 54 en 68 goed, 0 fout.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-10 09:54:22 +02:00

138 lines
7.2 KiB
YAML

# ═══════════════════════════════════════════════════════════════════════════════
# 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 <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.
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.7.1
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.7.1
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 <app-id>_<service>_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.7.1
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