services: app: build: . container_name: qmdsearch-app restart: unless-stopped ports: - "${APP_PORT:-8000}:8000" environment: - QDRANT_HOST=qdrant - QDRANT_PORT=6333 - REDIS_URL=redis://redis:6379/0 - OLLAMA_BASE_URL=http://ollama:11434 # 针对 16 线程 / 61GB 内存的 NAS 调优:放宽入库并发 - INGEST_MAX_CONCURRENCY=${INGEST_MAX_CONCURRENCY:-4} env_file: - .env depends_on: qdrant: condition: service_started redis: condition: service_healthy ollama: condition: service_started volumes: - ${NAS_DATA_DIR:-./data}/logs:/app/logs - ${NAS_DATA_DIR:-./data}/uploads:/app/uploads networks: - qmdsearch qdrant: image: qdrant/qdrant:latest container_name: qmdsearch-qdrant restart: unless-stopped ports: - "${QDRANT_PORT:-6333}:6333" - "${QDRANT_DASHBOARD_PORT:-6334}:6334" volumes: - ${NAS_DATA_DIR:-./data}/qdrant:/qdrant/storage # 官方 qdrant 镜像不含 curl/wget,内部 healthcheck 无法执行 HTTP 探测; # 改用 service_started 依赖(qdrant 启动即就绪),由 app 的 restart 策略兜底。 networks: - qmdsearch redis: image: redis:7-alpine container_name: qmdsearch-redis restart: unless-stopped # 仅内部网络访问,不对外暴露主机端口(避免与 NAS 已有 redis 的 6379 冲突) volumes: - ${NAS_DATA_DIR:-./data}/redis:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 networks: - qmdsearch ollama: image: ollama/ollama:latest container_name: qmdsearch-ollama restart: unless-stopped ports: - "${OLLAMA_PORT:-11434}:11434" volumes: - ${NAS_DATA_DIR:-./data}/ollama:/root/.ollama environment: # 针对 Ryzen 9 7940HS(16 线程)的 CPU 推理调优: # 并行推理任务数、常驻模型数、单请求线程上限、KV 缓存量化以省内存 - OLLAMA_NUM_PARALLEL=4 - OLLAMA_MAX_LOADED_MODELS=2 - OLLAMA_NUM_THREADS=16 - OLLAMA_KV_CACHE_TYPE=q8_0 # 首次启动自动拉取所需模型(qwen2.5:1.5b 总结 + bge-m3 嵌入), # 下载完成后转交常驻 ollama serve。已存在时仅做健康检查。 entrypoint: /bin/bash command: - -c - | ollama serve & SERVE_PID=$$! sleep 6 ollama pull qwen2.5:1.5b ollama pull bge-m3 wait $$SERVE_PID networks: - qmdsearch networks: qmdsearch: driver: bridge