version: "3.9" # Spins up: Qdrant, Memgraph, Redpanda, Redis Stack # Usage: docker compose up -d # Backend: uvicorn main:app --host 0.0.0.0 --port 7860 services: # ── Qdrant: High-performance vector database ────────────────────────────── qdrant: image: qdrant/qdrant:v1.12.0 container_name: fact_qdrant ports: - "6333:6333" # REST API - "6334:6334" # gRPC API volumes: - qdrant_data:/qdrant/storage environment: QDRANT__SERVICE__HTTP_PORT: 6333 QDRANT__SERVICE__GRPC_PORT: 6334 QDRANT__LOG_LEVEL: INFO healthcheck: test: ["CMD", "curl", "-f", "http://localhost:6333/healthz"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped # ── Memgraph: In-memory graph database (Cypher-compatible) ─────────────── memgraph: image: memgraph/memgraph:2.19.0 container_name: fact_memgraph ports: - "7687:7687" # Bolt protocol (same as Neo4j) - "7444:7444" # Memgraph Lab UI volumes: - memgraph_data:/var/lib/memgraph command: > --storage-mode=IN_MEMORY_TRANSACTIONAL --log-level=WARNING --query-execution-timeout-sec=30 healthcheck: test: ["CMD", "echo", "RETURN 1;" , "|", "mgconsole"] interval: 15s timeout: 5s retries: 5 restart: unless-stopped # ── Redpanda: Kafka-compatible streaming platform (no JVM) ─────────────── redpanda: image: redpandadata/redpanda:v24.2.0 container_name: fact_redpanda ports: - "9092:9092" # Kafka API - "9644:9644" # Admin API - "8081:8081" # Schema registry - "8082:8082" # HTTP Proxy volumes: - redpanda_data:/var/lib/redpanda/data command: - redpanda start - --kafka-addr internal://0.0.0.0:9092,external://0.0.0.0:9093 - --advertise-kafka-addr internal://redpanda:9092,external://localhost:9093 - --pandaproxy-addr internal://0.0.0.0:8082,external://0.0.0.0:18082 - --schema-registry-addr internal://0.0.0.0:8081,external://0.0.0.0:18081 - --rpc-addr redpanda:33145 - --advertise-rpc-addr redpanda:33145 - --smp 1 - --memory 1G - --mode dev-container - --overprovisioned healthcheck: test: ["CMD-SHELL", "rpk cluster health | grep -E 'Healthy:.+true'"] interval: 15s timeout: 10s retries: 10 restart: unless-stopped # ── Redis Stack: Redis + RedisJSON + RedisSearch ────────────────────────── redis: image: redis/redis-stack:7.4.0-v0 container_name: fact_redis ports: - "6379:6379" # Redis - "8001:8001" # RedisInsight UI volumes: - redis_data:/data environment: REDIS_ARGS: "--save 60 1 --loglevel warning" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped # ── Fact Engine Backend ─────────────────────────────────────────────────── backend: build: context: . dockerfile: Dockerfile container_name: fact_backend ports: - "7860:7860" environment: - REDIS_URL=redis://redis:6379 - QDRANT_URL=http://qdrant:6333 - MEMGRAPH_HOST=memgraph - MEMGRAPH_PORT=7687 - REDPANDA_BROKERS=redpanda:9092 - GROQ_API_KEY=${GROQ_API_KEY} - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} - X_BEARER_TOKEN=${X_BEARER_TOKEN} - PORT=7860 depends_on: qdrant: condition: service_healthy redis: condition: service_healthy restart: unless-stopped volumes: qdrant_data: memgraph_data: redpanda_data: redis_data: