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:
+32
-26
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user