From 436613bfdec5ec43cd1866c40158543d925bb31a Mon Sep 17 00:00:00 2001 From: Adriano Dal Pastro Date: Fri, 15 May 2026 19:10:18 +0000 Subject: [PATCH] fix(traefik): sostituisci stripprefix con replacepathregex per evitare doppio root_path Bug: la dashboard NiceGUI mostrava "Your browser does not support ES modules" perche' le asset URL nell'HTML erano doppio-prefissate: /strategy_crypto_gui/strategy_crypto_gui/_nicegui/... Root cause: il middleware traefik.stripprefix aggiunge automaticamente X-Forwarded-Prefix header. uvicorn/Starlette legge il header e setta root_path automaticamente, raddoppiando con quello passato esplicitamente a ui.run(root_path="/strategy_crypto_gui"). Fix: traefik.replacepathregex strippa il prefix senza propagare il header. uvicorn vede solo il root_path da ui.run -> asset prefissati una sola volta. - replacepathregex.regex=^/strategy_crypto_gui(/.*|$) - replacepathregex.replacement=$1 Verifica end-to-end: - page: HTTP 200, asset prefix singolo - /strategy_crypto_gui/_nicegui/3.12.0/static/socket.io.min.js: 200 - / (root): 404 (atteso) NB: dopo cambio label, necessario `docker restart traefik-traefik-1` per forzare refresh discovery (problema noto Traefik con label durante recreate container nello stesso ciclo). Annotare per future modifiche middleware. Co-Authored-By: Claude Opus 4.7 (1M context) --- docker-compose.yml | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 9e80445..ee4dd42 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -36,7 +36,11 @@ x-swarm-env: &swarm-env # DB separati per dominio: GA_DB_PATH: /app/state/runs.db STRATEGY_CRYPTO_DB_PATH: /app/state/strategy_crypto.db - # Subpath sotto cui la dashboard NiceGUI e' esposta da Traefik + # Subpath sotto cui la dashboard NiceGUI e' esposta da Traefik. + # IMPORTANT: NON usare StripPrefix middleware con questo. NiceGUI/Starlette + # gestisce internamente il root_path su request path che ARRIVANO con prefix. + # StripPrefix causa doppio prefix negli asset URL (NiceGUI prefixa + uvicorn + # rilegge X-Forwarded-Prefix e prefixa di nuovo). DASHBOARD_ROOT_PATH: /strategy_crypto_gui services: @@ -109,10 +113,11 @@ services: - traefik.http.routers.strategy-crypto-gui.entrypoints=websecure - traefik.http.routers.strategy-crypto-gui.tls.certresolver=mytlschallenge - "traefik.http.services.strategy-crypto-gui.loadbalancer.server.port=${SWARM_DASHBOARD_PORT:-8080}" - # StripPrefix: rimuove /strategy_crypto_gui prima di girare al container. - # NiceGUI ha root_path=/strategy_crypto_gui per generare link assoluti corretti - # (lato browser), ma le route FastAPI interne restano "/", "/paper", ecc. — - # quindi il prefix esterno DEVE essere stripped dal proxy. - - "traefik.http.middlewares.strategy-crypto-stripprefix.stripprefix.prefixes=/strategy_crypto_gui" - - "traefik.http.routers.strategy-crypto-gui.middlewares=strategy-crypto-stripprefix" + # replacepathregex (NON stripprefix): strippa il prefix dalla request senza + # aggiungere X-Forwarded-Prefix header. uvicorn vede solo root_path da + # ui.run(root_path=...), quindi gli asset URL vengono prefissati una sola + # volta (no doppio prefix come succederebbe con stripprefix). + - "traefik.http.middlewares.strategy-crypto-replace.replacepathregex.regex=^/strategy_crypto_gui(/.*|$$)" + - "traefik.http.middlewares.strategy-crypto-replace.replacepathregex.replacement=$$1" + - "traefik.http.routers.strategy-crypto-gui.middlewares=strategy-crypto-replace" - com.centurylinklabs.watchtower.enable=true