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
#
# 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
# (scripts/run_paper_trading.py)
# * multi-swarm-dashboard — Streamlit dashboard esposta da Traefik
# su https://swarm.${DOMAIN_NAME:-tielogic.xyz}
# * strategy-crypto-paper — paper-trading runner long-running
# (scripts/run_paper_trading.py)
# * strategy-crypto-gui — NiceGUI dashboard esposta da Traefik su
# https://swarm.${DOMAIN_NAME:-tielogic.xyz}/strategy_crypto_gui
#
# Entrambi joinano la rete external `traefik` cosi' il client Cerbero
# risolve direttamente l'host `cerbero-mcp` (porta 9000) senza passare
# 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:
# ./data cache OHLCV intermedia
# ./series cache parquet per timeframe/symbol
# ./state contiene runs.db (+ WAL/SHM)
# ./strategies btc_*.json / eth_*.json letti dal paper runner
# ./data cache OHLCV intermedia
# ./series cache parquet per timeframe/symbol
# ./state contiene runs.db (GA) + strategy_crypto.db (paper) + WAL/SHM
# ./src/strategy_crypto/strategy_crypto/strategies JSON freezate (ro)
#
# 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:
traefik:
@@ -31,15 +33,19 @@ x-swarm-env: &swarm-env
# Override: path container per persistenza
DATA_DIR: /app/data
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:
multi-swarm-paper:
strategy-crypto-paper:
build:
context: .
dockerfile: Dockerfile
image: multi-swarm:dev
container_name: multi-swarm-paper
image: multi-swarm-coevolutive:dev
container_name: strategy-crypto-paper
restart: unless-stopped
networks: [traefik]
env_file: .env
@@ -49,7 +55,7 @@ services:
- ./data:/app/data
- ./series:/app/series
- ./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`
# e ai log per la liveness del runner.
command:
@@ -64,26 +70,26 @@ services:
labels:
- com.centurylinklabs.watchtower.enable=true
multi-swarm-dashboard:
image: multi-swarm:dev
strategy-crypto-gui:
image: multi-swarm-coevolutive:dev
build:
context: .
dockerfile: Dockerfile
container_name: multi-swarm-dashboard
container_name: strategy-crypto-gui
restart: unless-stopped
networks: [traefik]
env_file: .env
environment:
<<: *swarm-env
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
- ./data:/app/data:ro
- ./series:/app/series:ro
entrypoint:
- python
- -m
- multi_swarm.dashboard.nicegui_app
- strategy_crypto.frontend.nicegui_app
command: []
healthcheck:
test:
@@ -98,9 +104,9 @@ services:
labels:
- traefik.enable=true
- traefik.docker.network=traefik
- "traefik.http.routers.multi-swarm-dashboard.rule=Host(`swarm.${DOMAIN_NAME:-tielogic.xyz}`)"
- traefik.http.routers.multi-swarm-dashboard.tls=true
- traefik.http.routers.multi-swarm-dashboard.entrypoints=websecure
- traefik.http.routers.multi-swarm-dashboard.tls.certresolver=mytlschallenge
- "traefik.http.services.multi-swarm-dashboard.loadbalancer.server.port=${SWARM_DASHBOARD_PORT:-8080}"
- "traefik.http.routers.strategy-crypto-gui.rule=Host(`swarm.${DOMAIN_NAME:-tielogic.xyz}`) && PathPrefix(`/strategy_crypto_gui`)"
- traefik.http.routers.strategy-crypto-gui.tls=true
- 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}"
- com.centurylinklabs.watchtower.enable=true