refactor(compose): rinomina servizi + Traefik subpath + dual-DB + bind strategies dal package

Rinomina servizi (era multi-swarm-paper / multi-swarm-dashboard):
- strategy-crypto-paper  — paper runner (container + service + image name)
- strategy-crypto-gui    — NiceGUI dashboard

Routing Traefik:
- Rule: Host(swarm.\${DOMAIN_NAME}) && PathPrefix(/strategy_crypto_gui)
- NESSUN StripPrefix middleware: NiceGUI gestisce root_path internamente
- URL prod: https://swarm.tielogic.xyz/strategy_crypto_gui/
- Root del dominio libera per future GUI di altre strategie

Env block x-swarm-env aggiornato:
- DB_PATH=/app/state/runs.db rimosso
- GA_DB_PATH=/app/state/runs.db (universale GA)
- STRATEGY_CRYPTO_DB_PATH=/app/state/strategy_crypto.db (paper crypto)
- DASHBOARD_ROOT_PATH=/strategy_crypto_gui (passato a ui.run(root_path=...))

Volumi:
- bind strategies dal package: ./src/strategy_crypto/strategy_crypto/strategies:/app/strategies:ro
- image rinominata: multi-swarm:dev → multi-swarm-coevolutive:dev (allineato a wheel)

Entrypoint dashboard: python -m strategy_crypto.frontend.nicegui_app
                      (era multi_swarm.dashboard.nicegui_app)

Verifica: docker compose config parse OK; 2 servizi presenti.

NOTA OPERATIVA: in produzione aggiornare il file .env reale (non in repo)
                per allinearsi a GA_DB_PATH/STRATEGY_CRYPTO_DB_PATH/DASHBOARD_ROOT_PATH.
                Backcompat: DB_PATH legacy ancora letto come alias di GA_DB_PATH.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Adriano Dal Pastro
2026-05-15 18:02:21 +00:00
parent 8caa526727
commit 30add35906
+32 -26
View File
@@ -1,25 +1,27 @@
# docker-compose.yml — Multi-Swarm Coevolutive # docker-compose.yml — Multi-Swarm Coevolutive
# #
# Due servizi che condividono la stessa immagine `multi-swarm:dev`: # Due servizi della strategia crypto, condividono la stessa immagine
# `multi-swarm-coevolutive:dev` buildata dal Dockerfile root (uv workspace):
# #
# * multi-swarm-paper — paper-trading runner long-running # * strategy-crypto-paper — paper-trading runner long-running
# (scripts/run_paper_trading.py) # (scripts/run_paper_trading.py)
# * multi-swarm-dashboard — Streamlit dashboard esposta da Traefik # * strategy-crypto-gui — NiceGUI dashboard esposta da Traefik su
# su https://swarm.${DOMAIN_NAME:-tielogic.xyz} # https://swarm.${DOMAIN_NAME:-tielogic.xyz}/strategy_crypto_gui
# #
# Entrambi joinano la rete external `traefik` cosi' il client Cerbero # Entrambi joinano la rete external `traefik` cosi' il client Cerbero
# risolve direttamente l'host `cerbero-mcp` (porta 9000) senza passare # risolve direttamente l'host `cerbero-mcp` (porta 9000) senza passare
# dal gateway pubblico ne' dal TLS. # dal gateway pubblico ne' dal TLS.
# #
# Pattern N strategie future: aggiungere strategy-<asset>-paper + strategy-<asset>-gui
# con PathPrefix(/strategy_<asset>_gui) e DASHBOARD_ROOT_PATH dedicato.
#
# Dati persistenti via bind mount dalla cartella del repo: # Dati persistenti via bind mount dalla cartella del repo:
# ./data cache OHLCV intermedia # ./data cache OHLCV intermedia
# ./series cache parquet per timeframe/symbol # ./series cache parquet per timeframe/symbol
# ./state contiene runs.db (+ WAL/SHM) # ./state contiene runs.db (GA) + strategy_crypto.db (paper) + WAL/SHM
# ./strategies btc_*.json / eth_*.json letti dal paper runner # ./src/strategy_crypto/strategy_crypto/strategies JSON freezate (ro)
# #
# Secrets (token Cerbero + OpenRouter): caricati da .env via env_file. # Secrets (token Cerbero + OpenRouter): caricati da .env via env_file.
# Le variabili sotto `environment:` sovrascrivono solo i valori che
# devono cambiare dentro il container (URL interno, path container).
networks: networks:
traefik: traefik:
@@ -31,15 +33,19 @@ x-swarm-env: &swarm-env
# Override: path container per persistenza # Override: path container per persistenza
DATA_DIR: /app/data DATA_DIR: /app/data
SERIES_DIR: /app/series SERIES_DIR: /app/series
DB_PATH: /app/state/runs.db # 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
DASHBOARD_ROOT_PATH: /strategy_crypto_gui
services: services:
multi-swarm-paper: strategy-crypto-paper:
build: build:
context: . context: .
dockerfile: Dockerfile dockerfile: Dockerfile
image: multi-swarm:dev image: multi-swarm-coevolutive:dev
container_name: multi-swarm-paper container_name: strategy-crypto-paper
restart: unless-stopped restart: unless-stopped
networks: [traefik] networks: [traefik]
env_file: .env env_file: .env
@@ -49,7 +55,7 @@ services:
- ./data:/app/data - ./data:/app/data
- ./series:/app/series - ./series:/app/series
- ./state:/app/state - ./state:/app/state
- ./strategies:/app/strategies:ro - ./src/strategy_crypto/strategy_crypto/strategies:/app/strategies:ro
# Niente HTTP da controllare: ci affidiamo a `restart: unless-stopped` # Niente HTTP da controllare: ci affidiamo a `restart: unless-stopped`
# e ai log per la liveness del runner. # e ai log per la liveness del runner.
command: command:
@@ -64,26 +70,26 @@ services:
labels: labels:
- com.centurylinklabs.watchtower.enable=true - com.centurylinklabs.watchtower.enable=true
multi-swarm-dashboard: strategy-crypto-gui:
image: multi-swarm:dev image: multi-swarm-coevolutive:dev
build: build:
context: . context: .
dockerfile: Dockerfile dockerfile: Dockerfile
container_name: multi-swarm-dashboard container_name: strategy-crypto-gui
restart: unless-stopped restart: unless-stopped
networks: [traefik] networks: [traefik]
env_file: .env env_file: .env
environment: environment:
<<: *swarm-env <<: *swarm-env
volumes: volumes:
# Dashboard legge solo runs.db: mount in read-only # Dashboard legge entrambi i DB: state/ in read-only (WAL: vedi nota)
- ./state:/app/state:ro - ./state:/app/state:ro
- ./data:/app/data:ro - ./data:/app/data:ro
- ./series:/app/series:ro - ./series:/app/series:ro
entrypoint: entrypoint:
- python - python
- -m - -m
- multi_swarm.dashboard.nicegui_app - strategy_crypto.frontend.nicegui_app
command: [] command: []
healthcheck: healthcheck:
test: test:
@@ -98,9 +104,9 @@ services:
labels: labels:
- traefik.enable=true - traefik.enable=true
- traefik.docker.network=traefik - traefik.docker.network=traefik
- "traefik.http.routers.multi-swarm-dashboard.rule=Host(`swarm.${DOMAIN_NAME:-tielogic.xyz}`)" - "traefik.http.routers.strategy-crypto-gui.rule=Host(`swarm.${DOMAIN_NAME:-tielogic.xyz}`) && PathPrefix(`/strategy_crypto_gui`)"
- traefik.http.routers.multi-swarm-dashboard.tls=true - traefik.http.routers.strategy-crypto-gui.tls=true
- traefik.http.routers.multi-swarm-dashboard.entrypoints=websecure - traefik.http.routers.strategy-crypto-gui.entrypoints=websecure
- traefik.http.routers.multi-swarm-dashboard.tls.certresolver=mytlschallenge - traefik.http.routers.strategy-crypto-gui.tls.certresolver=mytlschallenge
- "traefik.http.services.multi-swarm-dashboard.loadbalancer.server.port=${SWARM_DASHBOARD_PORT:-8080}" - "traefik.http.services.strategy-crypto-gui.loadbalancer.server.port=${SWARM_DASHBOARD_PORT:-8080}"
- com.centurylinklabs.watchtower.enable=true - com.centurylinklabs.watchtower.enable=true