# ═══════════════════════════════════════════════════════════════════════════════ # 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: # TODO pinnen. Deze tag komt uit tools/evolu-relay/build.sh en bestaat # voorlopig alleen in de lokale Docker-opslag van de machine waar gebouwd is. # Daarom staat er geen @sha256: er is nog geen register. Compose haalt niets # op zolang de image lokaal bestaat; zodra de tag naar een register wijst, # hoort de digest erbij. Zie Docs/Referenties/Images-pinnen.md. 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