From 9ca71ae92fee5abf72db1bd523ed6b30d4467af4 Mon Sep 17 00:00:00 2001 From: Schalli Date: Tue, 11 Aug 2026 15:34:49 +0200 Subject: [PATCH] fix(compose): point the browser at a reachable API address in prod NEXT_PUBLIC_API_URL is read by the browser, not by the web container, so http://api:3001 could never work outside Docker. The test server had been corrected by hand long ago; the fix never came back here, so the file we would ship to a customer was the broken one. Also adopts the server's TESSERA_FORCE_CHANGE default of true, so a fresh install requires the initial admin password to be changed. Co-Authored-By: Claude Opus 5 (1M context) --- ...-08-11-compose-datei-auf-server-driftet.md | 29 +++++++++++++++++++ docker-compose.prod.yml | 7 +++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/.planning/todos/pending/2026-08-11-compose-datei-auf-server-driftet.md b/.planning/todos/pending/2026-08-11-compose-datei-auf-server-driftet.md index 8609c79..b79a3af 100644 --- a/.planning/todos/pending/2026-08-11-compose-datei-auf-server-driftet.md +++ b/.planning/todos/pending/2026-08-11-compose-datei-auf-server-driftet.md @@ -56,3 +56,32 @@ erst ins Repository, sonst bricht Weg 1 oder 2 den laufenden Betrieb. Eine Sicherung der aktuellen Server-Datei liegt als `/opt/tessera/docker-compose.yml.bak.20260811` daneben. + +## Zwischenstand 2026-08-11: Drift abgeglichen, Mechanik weiter offen + +Die beiden Dateien sind jetzt identisch. Verglichen wurden sie erst an diesem +Tag zum ersten Mal — es gab genau drei Unterschiede: + +| Einstellung | Server | Repository | Uebernommen | +|---|---|---|---| +| `NEXT_PUBLIC_API_URL` | `${APP_URL}` | `http://api:3001` | Server-Fassung ins Repository | +| `TESSERA_FORCE_CHANGE` | Standard `true` | Standard `false` | Server-Fassung ins Repository | +| `TESSERA_ENCRYPTION_KEY` | kein Abbruch | `:?`-Abbruch | Repository-Fassung auf den Server | + +Der erste Punkt war der ernste: `http://api:3001` existiert nur im +Compose-Netz. Der Browser eines Kunden sitzt ausserhalb und haette die API nie +erreicht — die Repository-Fassung war fuer eine echte Installation unbrauchbar, +und niemand haette es vor dem ersten Kundentermin gemerkt. Die Korrektur lebte +seit unbekannter Zeit nur auf alpha. + +Ablauf: Sicherung als `/opt/tessera/docker-compose.yml.bak.20260811-1530`, +danach die Repository-Fassung auf den Server kopiert und mit +`docker compose config` geprueft (gueltig, alle Variablen aufloesbar). Das +Neuerzeugen der Container bleibt Sache des Users. + +**Was den Zettel offen haelt:** abgeglichen ist ein Zustand, keine Loesung. Die +naechste Aenderung an `docker-compose.prod.yml` driftet genauso, weil +`/opt/tessera` weiterhin keine Arbeitskopie ist und der Deploy weiterhin nur +Images holt. Die Entscheidung zwischen den drei Wegen oben steht also +unveraendert an — die Frage nach host-eigenen Anpassungen ist inzwischen +beantwortet: es gab keine, nur zwei Korrekturen, die ins Repository gehoerten. diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 27457ff..a089d71 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -6,7 +6,10 @@ services: - "3000:3000" environment: HOSTNAME: "0.0.0.0" - NEXT_PUBLIC_API_URL: http://api:3001 + # Read by the browser, not by the web container, so it must be an address + # that resolves outside Docker. http://api:3001 only exists on the compose + # network and leaves the UI unable to reach the API. + NEXT_PUBLIC_API_URL: ${APP_URL:-http://localhost:3001} API_INTERNAL_URL: "http://api:3001" JWT_SECRET: ${JWT_SECRET} networks: @@ -33,7 +36,7 @@ services: TESSERA_ADMIN_USER: ${TESSERA_ADMIN_USER:-admin} TESSERA_ADMIN_EMAIL: ${TESSERA_ADMIN_EMAIL} TESSERA_ADMIN_PASSWORD: ${TESSERA_ADMIN_PASSWORD} - TESSERA_FORCE_CHANGE: ${TESSERA_FORCE_CHANGE:-false} + TESSERA_FORCE_CHANGE: ${TESSERA_FORCE_CHANGE:-true} TESSERA_SMTP_HOST: ${TESSERA_SMTP_HOST:-} TESSERA_SMTP_PORT: ${TESSERA_SMTP_PORT:-587} TESSERA_SMTP_SECURE: ${TESSERA_SMTP_SECURE:-false}