# ═══════════════════════════════════════════════════════════ # MAC — Control Node (PC1) # This PC runs: API server, DB, Redis, Nginx, Qdrant, SearXNG # Worker GPU nodes connect to this control node via enrollment tokens. # # Usage: docker compose -f docker-compose.control-node.yml up -d # ═══════════════════════════════════════════════════════════ services: # ── MAC API Server ────────────────────────────────────── mac: build: . container_name: mac-api ports: - "8000:8000" env_file: .env environment: - DATABASE_URL=postgresql+asyncpg://mac:mac_password@postgres:5432/mac_db - REDIS_URL=redis://redis:6379/0 - QDRANT_URL=http://qdrant:6333 - SEARXNG_URL=http://searxng:8080 - IS_CONTROL_NODE=true - MAX_RESOURCE_PCT=85 # vLLM URLs are dynamically resolved via node_service # based on enrolled worker nodes depends_on: postgres: condition: service_healthy redis: condition: service_healthy restart: unless-stopped networks: - mac-net # ── PostgreSQL ───────────────────────────────────────── postgres: image: postgres:16-alpine container_name: mac-postgres environment: POSTGRES_USER: mac POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-mac_password} POSTGRES_DB: mac_db ports: - "5432:5432" volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U mac -d mac_db"] interval: 5s timeout: 5s retries: 5 restart: unless-stopped networks: - mac-net # ── Redis ────────────────────────────────────────────── redis: image: redis:7-alpine container_name: mac-redis ports: - "6379:6379" volumes: - redisdata:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 5s retries: 5 restart: unless-stopped networks: - mac-net # ── Nginx ────────────────────────────────────────────── nginx: image: nginx:alpine container_name: mac-nginx ports: - "80:80" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./frontend:/usr/share/nginx/html:ro depends_on: - mac restart: unless-stopped networks: - mac-net # ── Qdrant (Vector DB for RAG) ───────────────────────── qdrant: image: qdrant/qdrant:latest container_name: mac-qdrant ports: - "6333:6333" volumes: - qdrantdata:/qdrant/storage restart: unless-stopped networks: - mac-net # ── SearXNG (Web Search) ────────────────────────────── searxng: image: searxng/searxng:latest container_name: mac-searxng ports: - "8888:8080" environment: - SEARXNG_BASE_URL=http://localhost:8888/ volumes: - searxngdata:/etc/searxng restart: unless-stopped networks: - mac-net volumes: pgdata: redisdata: qdrantdata: searxngdata: networks: mac-net: driver: bridge