# ============================================================ # Trading AI Secure - Docker Compose # ============================================================ # Démarrage : docker compose up -d # Arrêt : docker compose down # Logs : docker compose logs -f trading-api # Rebuild : docker compose build --no-cache trading-api # ============================================================ networks: trading-net: driver: bridge enable_ipv6: false volumes: trading-db-data: trading-redis-data: trading-jupyter-data: trading-grafana-data: trading-prometheus-data: services: # ---------------------------------------------------------- # BASE DE DONNÉES : TimescaleDB # PostgreSQL + extension time-series pour OHLCV, trades, positions # ---------------------------------------------------------- trading-db: image: timescale/timescaledb:latest-pg16 container_name: trading-db restart: unless-stopped environment: POSTGRES_USER: ${TRADING_DB_USER:-trading} POSTGRES_PASSWORD: ${TRADING_DB_PASSWORD:?TRADING_DB_PASSWORD requis dans .env} POSTGRES_DB: ${TRADING_DB_NAME:-trading_db} TZ: ${TZ:-Europe/Paris} volumes: - trading-db-data:/var/lib/postgresql/data - /etc/localtime:/etc/localtime:ro networks: - trading-net healthcheck: test: ["CMD-SHELL", "pg_isready -U ${TRADING_DB_USER:-trading} -d ${TRADING_DB_NAME:-trading_db}"] interval: 10s timeout: 5s retries: 5 start_period: 30s # ---------------------------------------------------------- # CACHE : Redis # Données marché temps réel, signaux, sessions # ---------------------------------------------------------- trading-redis: image: redis:7-alpine container_name: trading-redis restart: unless-stopped volumes: - trading-redis-data:/data networks: - trading-net healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 # ---------------------------------------------------------- # BACKEND : FastAPI # Orchestration, stratégies, backtesting, risk manager # Port exposé pour NPM : 8100 # ---------------------------------------------------------- trading-api: build: context: . dockerfile: docker/api/Dockerfile container_name: trading-api restart: unless-stopped ports: - "8100:8100" environment: DATABASE_URL: postgresql://${TRADING_DB_USER:-trading}:${TRADING_DB_PASSWORD}@trading-db:5432/${TRADING_DB_NAME:-trading_db} REDIS_URL: redis://trading-redis:6379 ML_SERVICE_URL: http://trading-ml:8200 ALPHA_VANTAGE_API_KEY: ${ALPHA_VANTAGE_API_KEY:-} TZ: ${TZ:-Europe/Paris} volumes: # Montage en développement - retirer en production - ./src:/app/src - ./config:/app/config networks: - trading-net depends_on: trading-db: condition: service_healthy trading-redis: condition: service_healthy # ---------------------------------------------------------- # SERVICE ML : FastAPI (microservice ML lourd) # Prédictions, détection régime, optimisation Optuna # Port exposé pour NPM : 8200 # ---------------------------------------------------------- trading-ml: build: context: . dockerfile: docker/ml/Dockerfile container_name: trading-ml restart: unless-stopped ports: - "8200:8200" environment: DATABASE_URL: postgresql://${TRADING_DB_USER:-trading}:${TRADING_DB_PASSWORD}@trading-db:5432/${TRADING_DB_NAME:-trading_db} REDIS_URL: redis://trading-redis:6379 TZ: ${TZ:-Europe/Paris} volumes: - ./src:/app/src - ./config:/app/config networks: - trading-net depends_on: trading-db: condition: service_healthy trading-redis: condition: service_healthy # ---------------------------------------------------------- # DASHBOARD : Streamlit # Interface de monitoring et contrôle # Port exposé pour NPM : 8501 # ---------------------------------------------------------- trading-dashboard: build: context: . dockerfile: docker/dashboard/Dockerfile container_name: trading-dashboard restart: unless-stopped ports: - "8501:8501" environment: API_URL: http://trading-api:8100 TZ: ${TZ:-Europe/Paris} volumes: - ./src:/app/src - ./config:/app/config networks: - trading-net depends_on: - trading-api # ---------------------------------------------------------- # JUPYTER LAB : Exploration ML & Data # Port exposé pour NPM : 8888 # ---------------------------------------------------------- trading-jupyter: build: context: . dockerfile: docker/jupyter/Dockerfile container_name: trading-jupyter restart: unless-stopped ports: - "8888:8888" environment: JUPYTER_TOKEN: ${JUPYTER_TOKEN:-} DATABASE_URL: postgresql://${TRADING_DB_USER:-trading}:${TRADING_DB_PASSWORD}@trading-db:5432/${TRADING_DB_NAME:-trading_db} REDIS_URL: redis://trading-redis:6379 TZ: ${TZ:-Europe/Paris} volumes: - ./src:/app/src - ./config:/app/config - trading-jupyter-data:/app/notebooks networks: - trading-net depends_on: trading-db: condition: service_healthy # ---------------------------------------------------------- # MONITORING : Prometheus # Collecte métriques depuis trading-api et trading-ml # ---------------------------------------------------------- trading-prometheus: image: prom/prometheus:latest container_name: trading-prometheus restart: unless-stopped volumes: - ./docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro - trading-prometheus-data:/prometheus networks: - trading-net depends_on: - trading-api - trading-ml # ---------------------------------------------------------- # MONITORING : Grafana # Dashboards temps réel P&L, drawdown, métriques système # Port exposé pour NPM : 3100 # ---------------------------------------------------------- trading-grafana: image: grafana/grafana:latest container_name: trading-grafana restart: unless-stopped ports: - "3100:3000" environment: GF_SECURITY_ADMIN_USER: ${GRAFANA_ADMIN_USER:-admin} GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD:?GRAFANA_ADMIN_PASSWORD requis dans .env} GF_SERVER_ROOT_URL: "%(protocol)s://%(domain)s/" TZ: ${TZ:-Europe/Paris} volumes: - trading-grafana-data:/var/lib/grafana networks: - trading-net depends_on: - trading-prometheus