# ============================================================ # QMDSearch — 部署 compose(相对路径,可任意目录部署) # ------------------------------------------------------------ # 数据库数据 / 配置 / 代码 / 前端 全部从本地目录挂载, # 日常更新(改代码或前端)只需改文件 + `docker compose restart app`, # 无需重新 build 镜像。 # # 说明: # - 相对路径相对于本 compose 文件所在目录(即项目根目录)解析, # 因此直接把整个项目目录放到 NAS(或任意主机)即可部署。 # - app 服务复用已构建的 qmdsearch-app 镜像作为「带依赖的运行时」 # (Python 依赖装在镜像内,代码与前端构建产物走挂载)。 # - 仅当 Python 依赖(pyproject.toml)变化时,才需 `docker build -t qmdsearch-app .` 一次。 # - 数据目录默认 ./data,可通过 .env 的 NAS_DATA_DIR 覆盖到其他磁盘。 # ============================================================ services: app: # 不再 build 项目代码,改用已含依赖的运行时镜像;代码与前端均走下方挂载 image: qmdsearch-app:latest 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: # ---- 代码(本地,改后 restart 即生效,免 build)---- - ./app:/app/app - ./scripts:/app/scripts # ---- 前端构建产物(本地 frontend/dist,改前端后 build 到此目录 + restart)---- - ./frontend/dist:/app/app/static/admin # ---- 配置(显式文件映射,只读)---- - ./.env:/app/.env:ro # ---- 数据 / 日志(持久化)---- - ${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=3 - OLLAMA_NUM_THREADS=16 - OLLAMA_KV_CACHE_TYPE=q8_0 # 首次启动自动拉取所需模型(qwen3:1.7b 总结 + bge-m3 嵌入 + qwen3-reranker 重排), # 下载完成后转交常驻 ollama serve。已存在时仅做健康检查。 entrypoint: /bin/bash command: - -c - | ollama serve & SERVE_PID=$$! sleep 6 ollama pull qwen3:1.7b ollama pull bge-m3 ollama pull qwen3-reranker:0.6b wait $$SERVE_PID networks: - qmdsearch networks: qmdsearch: driver: bridge