version: "3.8" services: # ── Prolog Logic Engine ────────────────────────────────────────────────────── logic-engine: image: swipl/swipl:stable container_name: marketscope-logic ports: - "8080:8080" volumes: - ./packages/prolog-rules:/rules:ro - ./apps/logic-engine/server.pl:/app/server.pl:ro command: > swipl /app/server.pl --port 8080 --rules-dir /rules healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 10s timeout: 5s retries: 3 networks: - marketnet # ── Rust Ingestor ─────────────────────────────────────────────────────────── ingestor: build: context: ./apps/ingestor dockerfile: Dockerfile container_name: marketscope-ingestor ports: - "3001:3001" environment: - PLASMA_GATE_KEY=${PLASMA_GATE_KEY} - REDIS_URL=redis://redis:6379 - LOGIC_ENGINE_URL=http://logic-engine:8080 - WORM_ENDPOINT=http://auditor:8090 depends_on: - logic-engine - redis - auditor healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3001/health"] interval: 10s timeout: 5s retries: 3 networks: - marketnet # ── Quant Engine (Python) ─────────────────────────────────────────────────── quant-engine: build: context: ./apps/quant-engine dockerfile: Dockerfile container_name: marketscope-quant ports: - "8081:8081" environment: - WORM_ENDPOINT=http://auditor:8090 - LOGIC_ENGINE_URL=http://logic-engine:8080 depends_on: - logic-engine - auditor healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8081/health"] interval: 10s timeout: 5s retries: 3 networks: - marketnet # ── Auditor (WORM Chain) ──────────────────────────────────────────────────── auditor: build: context: ./apps/auditor dockerfile: Dockerfile container_name: marketscope-auditor ports: - "8090:8090" volumes: - worm-data:/worm healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8090/health"] interval: 10s timeout: 5s retries: 3 networks: - marketnet # ── Council UI (Next.js) ──────────────────────────────────────────────────── council-ui: build: context: ./apps/council-ui dockerfile: Dockerfile container_name: marketscope-ui ports: - "3000:3000" environment: - INGESTOR_URL=http://ingestor:3001 - QUANT_URL=http://quant-engine:8081 - AUDITOR_URL=http://auditor:8090 depends_on: - ingestor - quant-engine - auditor networks: - marketnet # ── Redis (Feature Cache) ─────────────────────────────────────────────────── redis: image: redis:7-alpine container_name: marketscope-redis ports: - "6379:6379" volumes: - redis-data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 3 networks: - marketnet # ── DuckDB (Feature Store) ────────────────────────────────────────────────── duckdb: image: cynerd/duckdb:latest container_name: marketscope-duckdb ports: - "19275:19275" volumes: - duckdb-data:/data networks: - marketnet volumes: worm-data: redis-data: duckdb-data: networks: marketnet: driver: bridge