version: "3.8" services: # ── Zookeeper (required for Kafka) ──────────────────────────────────────── zookeeper: image: confluentinc/cp-zookeeper:7.5.0 container_name: fraud_zookeeper environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 ports: - "2181:2181" # ── Kafka Broker ────────────────────────────────────────────────────────── kafka: image: confluentinc/cp-kafka:7.5.0 container_name: fraud_kafka depends_on: - zookeeper ports: - "9092:9092" environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" # ── FastAPI Scoring API ─────────────────────────────────────────────────── api: build: context: . dockerfile: Dockerfile.api container_name: fraud_api ports: - "8000:8000" volumes: - ./model:/app/model # mount trained model artifacts environment: MODEL_DIR: /app/model depends_on: - kafka restart: unless-stopped # ── React Frontend ──────────────────────────────────────────────────────── frontend: build: context: . dockerfile: Dockerfile.frontend args: REACT_APP_API_URL: http://localhost:8000 container_name: fraud_frontend ports: - "3000:3000" depends_on: - api restart: unless-stopped networks: default: name: fraud_network