version: "3.9" # ============================================================================= # Omnichannel Fact & Hallucination Intelligence System # HuggingFace Spaces compatible — single `docker compose up` deployment # Services: FastAPI (7860), Qdrant (6333), Memgraph (7687), Redpanda (9092), Redis Stack (6379) # ============================================================================= networks: fact-net: driver: bridge volumes: qdrant_storage: memgraph_data: redpanda_data: redis_data: services: # --------------------------------------------------------------------------- # QDRANT — Vector DB for claim embeddings (self-hosted, sub-ms HNSW search) # --------------------------------------------------------------------------- qdrant: image: qdrant/qdrant:v1.9.2 container_name: fact-qdrant restart: unless-stopped networks: [fact-net] ports: - "6333:6333" - "6334:6334" # gRPC volumes: - qdrant_storage:/qdrant/storage environment: QDRANT__SERVICE__GRPC_PORT: 6334 QDRANT__TELEMETRY_DISABLED: "true" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:6333/readyz"] interval: 10s timeout: 5s retries: 5 # --------------------------------------------------------------------------- # MEMGRAPH — In-memory graph DB for trust-score traversal (Cypher compatible) # 10-100x faster than Neo4j for real-time traversal since everything is in RAM # --------------------------------------------------------------------------- memgraph: image: memgraph/memgraph-platform:2.16.0 container_name: fact-memgraph restart: unless-stopped networks: [fact-net] ports: - "7687:7687" # Bolt - "3000:3000" # Memgraph Lab UI volumes: - memgraph_data:/var/lib/memgraph environment: MEMGRAPH_USER: memgraph MEMGRAPH_PASSWORD: memgraph123 healthcheck: test: ["CMD", "mg_client", "--host", "localhost", "--port", "7687", "--use-ssl=false", "-q", "RETURN 1;"] interval: 15s timeout: 10s retries: 5 # --------------------------------------------------------------------------- # REDPANDA — Kafka-compatible message queue (no JVM, no ZooKeeper, 10x lower # latency). Handles the omnichannel ingestion firehose from all producers. # --------------------------------------------------------------------------- redpanda: image: redpandadata/redpanda:v24.1.7 container_name: fact-redpanda restart: unless-stopped networks: [fact-net] ports: - "9092:9092" # Kafka API - "9644:9644" # Admin API - "8081:8081" # Schema registry volumes: - redpanda_data:/var/lib/redpanda/data command: - redpanda - start - --smp=1 - --memory=512M - --overprovisioned - --kafka-addr=PLAINTEXT://0.0.0.0:9092 - --advertise-kafka-addr=PLAINTEXT://redpanda:9092 - --pandaproxy-addr=0.0.0.0:8082 - --advertise-pandaproxy-addr=redpanda:8082 - --schema-registry-addr=0.0.0.0:8081 - --rpc-addr=redpanda:33145 - --advertise-rpc-addr=redpanda:33145 healthcheck: test: ["CMD", "rpk", "cluster", "health"] interval: 15s timeout: 10s retries: 5 # --------------------------------------------------------------------------- # REDIS STACK — Redis + RedisJSON + RedisSearch for structured claim caching # TTL: 6h for Green/Red verdicts, 15min for Yellow, no cache for Purple # --------------------------------------------------------------------------- redis-stack: image: redis/redis-stack:7.4.0-v0 container_name: fact-redis restart: unless-stopped networks: [fact-net] ports: - "6379:6379" # Redis - "8001:8001" # RedisInsight UI volumes: - redis_data:/data environment: REDIS_ARGS: "--maxmemory 256mb --maxmemory-policy allkeys-lru" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 # --------------------------------------------------------------------------- # BACKEND — FastAPI intelligence engine (HF Spaces listens on 7860) # Waits for all upstream services to be healthy before starting # --------------------------------------------------------------------------- backend: build: context: ./backend dockerfile: Dockerfile container_name: fact-backend restart: unless-stopped networks: [fact-net] ports: - "7860:7860" # HuggingFace Spaces default port depends_on: qdrant: condition: service_healthy memgraph: condition: service_healthy redpanda: condition: service_healthy redis-stack: condition: service_healthy environment: # LLM providers — set in HF Space secrets GROQ_API_KEY: ${GROQ_API_KEY:-} ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-} X_BEARER_TOKEN: ${X_BEARER_TOKEN:-} # Infrastructure endpoints (internal Docker network) QDRANT_HOST: qdrant QDRANT_PORT: 6333 MEMGRAPH_HOST: memgraph MEMGRAPH_PORT: 7687 MEMGRAPH_PASSWORD: memgraph123 REDPANDA_BROKERS: redpanda:9092 REDIS_URL: redis://redis-stack:6379 # App config PORT: 7860 LOG_LEVEL: INFO DEMO_MODE: ${DEMO_MODE:-false} # true = use mock data, skip external APIs volumes: - ./backend:/app command: ["uv", "run", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860", "--reload"]