# ═══════════════════════════════════════════════════════════════════════════════ # Evolu Relay - de sync-server van Trezor Suite op je eigen Umbrel. # # Drie containers, twee images. De relay en de quota-manager komen uit dezélfde # image met een ander `command`: bovenstrooms is het één codebase met meerdere # startscripts. Dat is nagetrokken in de Dockerfile en de README van Trezor; zie # Docs/Referenties/Upstream-evolu-relay.md §2. # ═══════════════════════════════════════════════════════════════════════════════ services: app_proxy: environment: APP_HOST: whatsnext-evolu-relay_relay_1 APP_PORT: 4000 # Trezor Suite is geen browser met een sessiecookie. Achter de inlog van # umbrelOS zou het een inlogpagina krijgen in plaats van de relay, en dat # is niet op te lossen aan onze kant. # # Dit is geen omweg: het is het patroon dat de eigen nostr-relay-app van # Umbrel gebruikt, om precies dezelfde reden. Ook Gitea en Budibase in de # officiele store doen het zo. # # De prijs staat er wel bij: wie deze poort kan bereiken, bereikt de relay # zonder aanmelding. Wat de schade beperkt is dat de relay zelf elke # eigenaar weigert die geen limietenrij in de database heeft. Zet deze app # dus niet zonder meer open naar het internet; zie het masterplan # Bereikbaarheid. # # En let op de tweede weg naar binnen, die je niet ziet in deze compose: # umbrelOS maakt per app een Tor hidden service. Zonder inlog betekent dat # bereikbaar vanaf het internet, alleen beschermd doordat het .onion-adres # onraadbaar is. Bij Electrum Gate is dat geen bezwaar, want daar zit de # inlog van umbrelOS ervoor; hier is die er juist uit. Zet de hidden service # dus uit in umbrelOS tenzij je hem bewust wilt. Op 25-08-2026 stond hij bij # de eerste installatie gewoon aan. PROXY_AUTH_ADD: "false" relay: # Gebouwd uit de broncode van Trezor door tools/evolu-relay/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 (docker-modem) en niet # via compose, dus een lokaal gebouwde tag is voor hem onbereikbaar en # `pull_policy` wordt nooit gelezen. Op 25-08-2026 op het apparaat # vastgesteld; zie Docs/Referenties/Umbrel-appstore-spec.md. # # De digest hoort erbij en niet alleen de tag: een tag kan opnieuw geduwd # worden en dan draait er iets anders dan hier staat. # # Let op: dit is de digest van één architectuur (amd64), want er is alleen # amd64 geduwd. Voor de officiele store moet het een multi-arch index-digest # zijn met arm64 erin; zie het masterplan Publicatie-Relay. image: sc.kamenier-hamer.nl/sysop/evolu-relay:c03a204@sha256:2fe1e9e90e5cbc12d5ea6363df03bb132fddec0150283063b9103a09bdbe853a restart: on-failure depends_on: db: condition: service_healthy # Bovenstrooms staat `CMD ["yarn", "start"]` in de Dockerfile, met daarbij een # eigen commentaar dat het misschien een van de twee specifieke scripts had # moeten zijn. Daarom hier expliciet, en niet vertrouwen op de standaard. command: ["yarn", "start-evolu-relay"] environment: RELAY_PORT: "4000" HEALTH_PORT: "4002" # dev of prod. Volgens .env.sample zet prod authenticatie aan; in de code # bepaalt die vlag alleen het logniveau en staan de autorisatiecontroles # onvoorwaardelijk aan. Een van de twee is achterhaald en dat is nog niet # uitgezocht. Hier staat prod, want dat is de veilige kant van die # onduidelijkheid: als het iets aanzet, willen we dat het aanstaat. SERVER_ENV: prod POSTGRES_GATE_HOST: whatsnext-evolu-relay_db_1 POSTGRES_GATE_PORT: "5432" POSTGRES_GATE_USER: suite-sync POSTGRES_GATE_DB: suite-sync-gate # Door umbrelOS per installatie afgeleid. Nooit een letterlijke waarde: # deze repo is publiek. POSTGRES_GATE_PASSWORD: ${APP_PASSWORD} POSTGRES_GATE_SSL: "false" quota-manager: # Zelfde image als relay, ander commando. Tag en digest moeten dus gelijk # blijven aan die hierboven. image: sc.kamenier-hamer.nl/sysop/evolu-relay:c03a204@sha256:2fe1e9e90e5cbc12d5ea6363df03bb132fddec0150283063b9103a09bdbe853a restart: on-failure depends_on: db: condition: service_healthy command: ["yarn", "start-quota-manager"] # Waarom deze container er is, terwijl hij bij Trezor bij hun betaalde # hosting hoort: de relay weigert elke eigenaar zonder rij in de # limietentabel, en dit is wat die rijen aanmaakt. Er is geen HTTP-koppeling # tussen de twee; ze delen alleen de database. Zie Upstream-evolu-relay.md §3. environment: QUOTA_MANAGER_PORT: "4001" HEALTH_PORT: "4012" SERVER_ENV: prod POSTGRES_GATE_HOST: whatsnext-evolu-relay_db_1 POSTGRES_GATE_PORT: "5432" POSTGRES_GATE_USER: suite-sync POSTGRES_GATE_DB: suite-sync-gate POSTGRES_GATE_PASSWORD: ${APP_PASSWORD} POSTGRES_GATE_SSL: "false" db: # TODO pinnen op de multi-arch index-digest, met # `docker buildx imagetools inspect postgres:17-alpine`. Kan alleen op een # machine met Docker; staat als taak in het plan Umbrelapp. # # Niet `postgres` kaal zoals de compose van Trezor doet: dat is `latest` en # dus niet reproduceerbaar, en een grote-versiesprong van Postgres migreert # zijn datamap niet vanzelf. Dan start de database niet meer en is de data # alleen met handwerk terug te halen. image: postgres:17-alpine restart: on-failure environment: POSTGRES_USER: suite-sync POSTGRES_DB: suite-sync-gate POSTGRES_PASSWORD: ${APP_PASSWORD} # Een submap en niet de wortel van de mount. Postgres weigert een datamap # die al iets anders bevat, en een mount heeft op sommige bestandssystemen # een lost+found. PGDATA: /var/lib/postgresql/data/pgdata volumes: # 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 database een # herinstallatie van de app niet overleven. - ${APP_DATA_DIR}/data/postgres:/var/lib/postgresql/data healthcheck: # Op de eigen database en gebruiker, niet op `-d postgres` zoals # bovenstrooms: die database bestaat hier niet en dan is de controle groen # terwijl het verkeerde antwoord gegeven wordt. test: ["CMD-SHELL", "pg_isready -U suite-sync -d suite-sync-gate"] interval: 10s timeout: 5s retries: 10 start_period: 30s