Tre fix di deploy emersi al primo build/up del nuovo compose:
1. Dockerfile: rimosso PYTHONPATH=/app/src
Con layout uv workspace doppio-nest, PYTHONPATH=/app/src faceva ombra
alla venv risolvendo le member-dir (multi_swarm_core/, strategy_crypto/)
come namespace packages PEP 420 senza i sub-package del codice
(cerbero, persistence, frontend, ecc.). I package sono installati come
editable dal `uv sync --frozen` nella venv: niente PYTHONPATH necessario.
2. pyproject root: aggiunto [project] dependencies = [multi-swarm-core, strategy-crypto]
I due member workspace erano in [dependency-groups.dev], escluse da
`uv sync --frozen --no-dev` del builder Docker -> "ModuleNotFoundError:
No module named multi_swarm_core". Spostati come dipendenze runtime del
deployable app root; dev group ora contiene solo pytest/ruff/mypy.
uv.lock rigenerato.
3. docker-compose.yml: aggiunto Traefik middleware StripPrefix
NiceGUI con root_path="/strategy_crypto_gui" assume che il proxy
strippi il prefix prima di girare al container (FastAPI route restano
"/", "/paper", ecc.). Senza StripPrefix, NiceGUI riceveva
"/strategy_crypto_gui/" e rispondeva 404. Aggiunte 2 label:
- strategy-crypto-stripprefix middleware
- router.middlewares = strategy-crypto-stripprefix
Verifica end-to-end:
- https://swarm.tielogic.xyz/strategy_crypto_gui/ -> HTTP 200 (31KB)
- https://swarm.tielogic.xyz/ -> HTTP 404 (root libera, atteso)
- paper run phase3-baseline-001 (fcf271d0...) tick=1 OK, $1000 equity
- state/strategy_crypto.db creato con 5 tabelle paper_trading_*
NB: permission fix per `src/strategy_crypto/strategy_crypto/strategies/`
fatto manualmente (chown 1000:1000) — i JSON migrati da git mv erano
root:root, container gira come uid 1000. Annotare per future strategies.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Dockerfile multi-stage (python:3.13-slim + uv) e docker-compose con due
servizi che condividono l'immagine:
- multi-swarm-paper: runner long-running scripts/run_paper_trading.py
- multi-swarm-dashboard: Streamlit su https://swarm.${DOMAIN_NAME}
Cerbero raggiunto via rete docker interna (http://cerbero-mcp:9000)
saltando il giro pubblico traefik+TLS. Persistenza via bind mount su
data/, series/, state/ (runs.db con WAL), strategies/ in read-only.
.env.example aggiornato con DOMAIN_NAME, SWARM_DASHBOARD_PORT (porta
interna parametrizzabile) e i PAPER_* per override del command.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>