# Docker Compose for Agent Evolution Dashboard + Research API (mount-driven, no-rebuild) # Usage: # docker compose -f agent-evolution/docker-compose.yml up -d # # Edit any file on host → instant reflection in containers # # Dashboard: http://localhost:3003 # # API: http://localhost:3004 # services: evolution-dashboard: image: python:3.12-alpine container_name: apaw-evolution ports: - "3003:80" volumes: # Mount the generated standalone HTML to the container's web root - ./index.standalone.html:/app/index.html:ro # Mount real-fit standalone report - ./real-fit.html:/app/real-fit.html:ro # Mount data directory for any additional assets - ./data:/app/data:ro # Mount .kilo directory for live config access - ../.kilo:/app/kilo:ro working_dir: /app command: ["python3", "-m", "http.server", "80"] environment: - NODE_ENV=production - TZ=UTC restart: unless-stopped healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:80/"] interval: 30s timeout: 10s retries: 3 start_period: 10s networks: - evolution-network labels: - "com.apaw.service=evolution-dashboard" - "com.apaw.description=Agent Evolution Dashboard" evolution-api: image: python:3.12-alpine container_name: apaw-evolution-api ports: - "3004:8000" volumes: # API source code - ./api.py:/app/api.py:ro - ./requirements.txt:/app/requirements.txt:ro # Data directory (read-write for job state and reports) - ./data:/app/data:rw # real-fit-engine.py script - ../scripts/real-fit-engine.py:/app/scripts/real-fit-engine.py:ro # Agent definitions and metadata - ../.kilo/agents:/app/agents:ro - ../kilo-meta.json:/app/kilo-meta.json:ro working_dir: /app command: > sh -c "pip install --no-cache-dir -r requirements.txt && uvicorn api:app --host 0.0.0.0 --port 8000" environment: - TZ=UTC - PYTHONUNBUFFERED=1 - JOB_STATE_PATH=/app/data/research-jobs.json - REPORT_PATH=/app/data/real-fit-report.json - META_PATH=/app/kilo-meta.json - EVOLUTION_PATH=/app/data/evolution.json - ENGINE_PATH=/app/scripts/real-fit-engine.py - REAL_FIT_DB=/app/data/real-fit.db restart: unless-stopped healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8000/api/models"] interval: 30s timeout: 10s retries: 3 start_period: 15s networks: - evolution-network labels: - "com.apaw.service=evolution-api" - "com.apaw.description=Agent Evolution Research API" # Optional: Nginx reverse proxy with SSL evolution-nginx: image: nginx:alpine container_name: apaw-evolution-nginx profiles: - nginx ports: - "80:80" - "443:443" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro - ./ssl:/etc/nginx/ssl:ro depends_on: - evolution-dashboard - evolution-api networks: - evolution-network networks: evolution-network: driver: bridge