Files
UmbrelApps/whatsnext-evolu-relay/docker-compose.yml
T
HarmenandClaude Opus 5 96565085a5 umbreld pullt buiten compose om, dus pull_policy kon nooit werken
De installatie faalde, en de foutmelding was voorspelbaar maar de oorzaak niet:

  pull access denied for whatsnext/evolu-relay
      at /opt/umbreld/node_modules/docker-modem/lib/modem.js:382:17

Die stacktrace is het punt. De pull komt uit docker-modem, de Docker-client van
umbreld zelf, dus rechtstreeks op de Docker Engine API. Compose komt er niet aan
te pas en de compose wordt alleen gelezen om te zien welke images erin staan.
pull_policy is een sleutel van de Compose-specificatie en wordt dus nooit
bekeken. Mijn reparatie van de vorige commit kon per definitie niet werken; hij
is eruit, want een sleutel die niets doet met een commentaar dat beweert van wel
is erger dan geen sleutel.

Waar die fout vandaan kwam: ik las in app-script dat install een
`compose "${app}" pull` doet en nam aan dat dat het pad was. Dat bestand is de
legacy-compat-laag en niet wat umbrelOS 1.x loopt bij een installatie vanuit de
interface. Dat staat nu als waarschuwing in de naslag, want het is precies het
soort bron dat overtuigend leest en het verkeerde antwoord geeft.

De echte regel, nu op het apparaat vastgesteld in plaats van uit code afgeleid:
elke image in de compose van een app moet anoniem uit een register te halen zijn.
Een lokaal gebouwde tag werkt niet, hoe goed docker compose up er ook mee overweg
zou kunnen.

Het image-veld staat er nog en wijst nog steeds naar de lokale tag. Dat is
bewust: het commentaar erboven zegt nu dat het zo niet werkt en wat er moet
komen. Weghalen zou de app-map stiller maar niet beter maken, en de keuze voor
een register is aan de gebruiker.

Tests: 32 goed 0 fout, 54 goed 0 fout en 39 goed 0 fout, niets overgeslagen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 18:24:39 +02:00

128 lines
6.1 KiB
YAML

# ═══════════════════════════════════════════════════════════════════════════════
# 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.
PROXY_AUTH_ADD: "false"
relay:
# WERKT NIET ZOALS HET HIER STAAT, en dat is bewust zichtbaar gelaten tot de
# keuze voor een register gemaakt is. Deze tag komt uit
# tools/evolu-relay/build.sh en bestaat alleen in de lokale Docker-opslag van
# de machine waar gebouwd is.
#
# Op 25-08-2026 bleek bij de eerste installatiepoging dat dat niet genoeg is:
# umbreld haalt élke image op via de Docker Engine API (docker-modem), niet
# via compose, en faalt met "pull access denied" voordat er iets start. Een
# lokaal gebouwde image is dus onbereikbaar, en `pull_policy: never` helpt
# niet, want umbreld leest de compose niet om te pullen. Zie
# Docs/Referenties/Umbrel-appstore-spec.md.
#
# Wat hier moet komen: een tag in een register waar de Umbrel anoniem bij kan,
# met @sha256-digest erbij. Zie Docs/Referenties/Images-pinnen.md en het plan
# Umbrelapp.
image: whatsnext/evolu-relay:c03a204
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:
image: whatsnext/evolu-relay:c03a204
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