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) <noreply@anthropic.com>
This commit is contained in:
Adriano Dal Pastro
2026-05-15 19:10:18 +00:00
parent f55e4f00c5
commit 436613bfde
+12 -7
View File
@@ -36,7 +36,11 @@ x-swarm-env: &swarm-env
# DB separati per dominio: # DB separati per dominio:
GA_DB_PATH: /app/state/runs.db GA_DB_PATH: /app/state/runs.db
STRATEGY_CRYPTO_DB_PATH: /app/state/strategy_crypto.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 DASHBOARD_ROOT_PATH: /strategy_crypto_gui
services: services:
@@ -109,10 +113,11 @@ services:
- traefik.http.routers.strategy-crypto-gui.entrypoints=websecure - traefik.http.routers.strategy-crypto-gui.entrypoints=websecure
- traefik.http.routers.strategy-crypto-gui.tls.certresolver=mytlschallenge - traefik.http.routers.strategy-crypto-gui.tls.certresolver=mytlschallenge
- "traefik.http.services.strategy-crypto-gui.loadbalancer.server.port=${SWARM_DASHBOARD_PORT:-8080}" - "traefik.http.services.strategy-crypto-gui.loadbalancer.server.port=${SWARM_DASHBOARD_PORT:-8080}"
# StripPrefix: rimuove /strategy_crypto_gui prima di girare al container. # replacepathregex (NON stripprefix): strippa il prefix dalla request senza
# NiceGUI ha root_path=/strategy_crypto_gui per generare link assoluti corretti # aggiungere X-Forwarded-Prefix header. uvicorn vede solo root_path da
# (lato browser), ma le route FastAPI interne restano "/", "/paper", ecc. — # ui.run(root_path=...), quindi gli asset URL vengono prefissati una sola
# quindi il prefix esterno DEVE essere stripped dal proxy. # volta (no doppio prefix come succederebbe con stripprefix).
- "traefik.http.middlewares.strategy-crypto-stripprefix.stripprefix.prefixes=/strategy_crypto_gui" - "traefik.http.middlewares.strategy-crypto-replace.replacepathregex.regex=^/strategy_crypto_gui(/.*|$$)"
- "traefik.http.routers.strategy-crypto-gui.middlewares=strategy-crypto-stripprefix" - "traefik.http.middlewares.strategy-crypto-replace.replacepathregex.replacement=$$1"
- "traefik.http.routers.strategy-crypto-gui.middlewares=strategy-crypto-replace"
- com.centurylinklabs.watchtower.enable=true - com.centurylinklabs.watchtower.enable=true