services: db: image: ankane/pgvector:latest container_name: pmflow-db restart: unless-stopped environment: POSTGRES_DB: ${POSTGRES_DB:-pmflow} POSTGRES_USER: ${POSTGRES_USER:-pmflow} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-pmflow_pass} ports: - "${DB_PORT:-5435}:5432" volumes: - pg_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-pmflow} -d ${POSTGRES_DB:-pmflow}"] interval: 5s timeout: 5s retries: 20 redis: image: redis:7-alpine container_name: pmflow-redis restart: unless-stopped command: [ "redis-server", "--appendonly", "yes", "--requirepass", "${REDIS_PASSWORD:-pmflow_redis_pass}", "--maxmemory", "512mb", "--maxmemory-policy", "allkeys-lru" ] ports: - "${REDIS_PORT:-6379}:6379" volumes: - redis_data:/data healthcheck: test: ["CMD-SHELL", "redis-cli -a ${REDIS_PASSWORD:-pmflow_redis_pass} ping | grep PONG"] interval: 5s timeout: 3s retries: 20 backend: build: context: . dockerfile: backend/Dockerfile container_name: pmflow-backend restart: unless-stopped depends_on: db: condition: service_healthy redis: condition: service_healthy environment: DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-pmflow}:${POSTGRES_PASSWORD:-pmflow_pass}@db:5432/${POSTGRES_DB:-pmflow} REDIS_URL: redis://:${REDIS_PASSWORD:-pmflow_redis_pass}@redis:6379/0 CORS_ORIGINS: ${CORS_ORIGINS:-http://localhost:5174,http://127.0.0.1:5174} LLM_PROVIDER: ${LLM_PROVIDER:-openai} LLM_FALLBACK_PROVIDER: ${LLM_FALLBACK_PROVIDER:-ollama} OPENAI_BASE_URL: ${OPENAI_BASE_URL:-http://openclaw:18789/v1} OPENCLAW_ROUTING_ENABLED: ${OPENCLAW_ROUTING_ENABLED:-true} OPENCLAW_ROUTING_RULES_PATH: ${OPENCLAW_ROUTING_RULES_PATH:-/app/backend/.openclaw/pmflow-routing-rules.json} LLM_MIXED_ROUTING_ENABLED: ${LLM_MIXED_ROUTING_ENABLED:-false} LLM_LOW_TO_HIGH_ESCALATION_ENABLED: ${LLM_LOW_TO_HIGH_ESCALATION_ENABLED:-true} LLM_ROUTING_LOW_PROVIDER: ${LLM_ROUTING_LOW_PROVIDER:-glm} LLM_ROUTING_LOW_MODEL: ${LLM_ROUTING_LOW_MODEL:-GLM-4.7} LLM_ROUTING_HIGH_PROVIDER: ${LLM_ROUTING_HIGH_PROVIDER:-openai} LLM_ROUTING_HIGH_MODEL: ${LLM_ROUTING_HIGH_MODEL:-MiniMax-M2.5} LLM_ROUTING_SAFETY_PROVIDER: ${LLM_ROUTING_SAFETY_PROVIDER:-glm} LLM_ROUTING_SAFETY_MODEL: ${LLM_ROUTING_SAFETY_MODEL:-GLM-4.7} LLM_DIRECT_EMERGENCY_ENABLED: ${LLM_DIRECT_EMERGENCY_ENABLED:-false} LLM_REQUEST_TIMEOUT: ${LLM_REQUEST_TIMEOUT:-90} AUTO_CREATE_TABLES: "true" GLM_API_KEY: ${GLM_API_KEY:-} GLM_BASE_URL: ${GLM_BASE_URL:-https://open.bigmodel.cn/api/paas/v4} GLM_MODEL: ${GLM_MODEL:-GLM-4.7} OPENAI_API_KEY: ${OPENAI_API_KEY:-} OPENAI_MODEL: ${OPENAI_MODEL:-MiniMax-M2.5} DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-} OLLAMA_HOST: ${OLLAMA_HOST:-http://host.docker.internal:11434} OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-http://host.docker.internal:11434} OLLAMA_MODEL: ${OLLAMA_MODEL:-llama3:latest} ports: - "${BACKEND_PORT:-8000}:8000" volumes: - ./logs:/app/logs healthcheck: test: ["CMD-SHELL", "curl -fsS http://localhost:8000/healthz >/dev/null || exit 1"] interval: 10s timeout: 5s retries: 15 frontend: build: context: ./frontend dockerfile: Dockerfile container_name: pmflow-frontend restart: unless-stopped depends_on: backend: condition: service_healthy ports: - "${FRONTEND_PORT:-5174}:80" volumes: pg_data: redis_data: