Files
sundynix-agentix/deploy/132-app/docker-compose.yml
T
Blizzard c1420b5665 fix(rag): 全文索引在容器里根本没持久化 —— 补 /data 卷 + BLEVE_PATH
排查「fulltext 路 0 命中」时发现的真问题,比原以为的分词器问题严重得多。

现状:mcp-go 容器**没有任何 volume**,也没设 BLEVE_PATH,于是索引落到相对
CWD 的 .data/bleve。而运行阶段没有 WORKDIR(CWD=/)、进程又是非 root(uid 10001),
两种结局都糟:
  - 在 / 下建不了目录 → openBleve 静默退回内存索引,重启即清零;
  - 就算建得了,也只是写进容器可写层,每次发版重建容器一样清零。
更糟的是它不报错:混合检索少一路只表现为召回变差,看不出故障。

改动:
  - Dockerfile:建 /data 并 chown 给 app,WORKDIR 设为 /data;
  - 两份 compose:BLEVE_PATH=/data/bleve + 挂持久卷(132 那份此前连
    顶层 volumes 段都没有);
  - .env.example:写清默认相对路径相对的是**启动目录**——本地从仓库根起
    和从 sundynix-mcp-go/ 起会写出两份互不相干的索引,排查时极易被坑。

附带澄清:中文分词本身没问题。直接开落盘索引验证过,mapping 里 text 字段
确实是 cjk,实测「星间链」命中 4 条、「海关监管」命中 104 条,BM25 打分正常。
a4852c3 那次修复是有效的,之前怀疑分词器的判断作废。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 13:40:31 +08:00

96 lines
4.8 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# sundynix-agentix · 应用机 192.168.100.132
#
# cd deploy/132-app && cp .env.example .env # 填密钥/密码/MinIO 凭据
# docker compose up -d --build # 在 132 本地构建并运行(Gitea 自动部署也走这条)
#
# 说明:
# - 对外只暴露 gateway:3000frp 映射)。gateway 已内嵌 admin 控制台(同源 serve UI+API),
# 无需单独 admin nginx 容器。dispatcher/mcp-go/mcp-py 只走 NATS,无对外端口。
# - 基础设施在 128PG/NATS集群/Redis/Milvus/Neo4j),对象存储在 126MinIO),env 全部指向它们。
# - 构建上下文为仓库根(../..,因 Go 服务 replace ../sundynix-shared)。
# - NATS_STREAM_REPLICAS=3durable 流走 128 三节点集群,有 Raft quorum 容错。
services:
gateway:
build: { context: ../.., dockerfile: sundynix-gateway/Dockerfile }
image: sundynix/gateway:${TAG:-latest}
restart: unless-stopped
environment:
APP_ENV: production
GATEWAY_ADDR: ":8080"
NATS_URL: nats://192.168.100.128:4222,nats://192.168.100.128:4223,nats://192.168.100.128:4224
NATS_STREAM_REPLICAS: "3"
POSTGRES_DSN: postgres://sundynix:${POSTGRES_PASSWORD:?}@192.168.100.128:5432/sundynix?sslmode=disable
REDIS_ADDR: 192.168.100.128:6379
MINIO_ENDPOINT: 192.168.100.126:9000
MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:?}
MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:?}
MINIO_BUCKET: ${MINIO_BUCKET:-sundynix-docs}
SUNDYNIX_SECRET_KEY: ${SUNDYNIX_SECRET_KEY:?}
JWT_SECRET: ${JWT_SECRET:?}
ADMIN_USER_IDS: ${ADMIN_USER_IDS:-}
CORS_ALLOW_ORIGIN: ${CORS_ALLOW_ORIGIN:-*}
OTEL_EXPORTER_OTLP_ENDPOINT: http://192.168.100.128:4318
ports: ["3000:8080"] # frp 外网 → 132:3000 → 容器 8080
volumes:
# 微信支付证书(商户私钥 + 微信支付公钥):宿主机 132 的目录只读挂进容器。
# ⚠️ admin「系统配置 → 支付」里填的路径必须是**容器内路径**/etc/sundynix/wechat-cert/...),
# 不是宿主机路径——容器看不到宿主机的 /home/workspace/...。私钥不进镜像、不进 git。
- /home/workspace/wechat-pay-cert:/etc/sundynix/wechat-cert:ro
dispatcher:
build: { context: ../.., dockerfile: sundynix-dispatcher/Dockerfile }
image: sundynix/dispatcher:${TAG:-latest}
restart: unless-stopped
environment:
APP_ENV: production
NATS_URL: nats://192.168.100.128:4222,nats://192.168.100.128:4223,nats://192.168.100.128:4224
NATS_STREAM_REPLICAS: "3"
SUNDYNIX_SECRET_KEY: ${SUNDYNIX_SECRET_KEY:?}
OTEL_EXPORTER_OTLP_ENDPOINT: http://192.168.100.128:4318
DISPATCHER_CONCURRENCY: ${DISPATCHER_CONCURRENCY:-8}
TASK_TOKEN_BUDGET: ${TASK_TOKEN_BUDGET:-200000}
mcp-go:
build: { context: ../.., dockerfile: sundynix-mcp-go/Dockerfile }
image: sundynix/mcp-go:${TAG:-latest}
restart: unless-stopped
environment:
APP_ENV: production
NATS_URL: nats://192.168.100.128:4222,nats://192.168.100.128:4223,nats://192.168.100.128:4224
NATS_STREAM_REPLICAS: "3"
POSTGRES_DSN: postgres://sundynix:${POSTGRES_PASSWORD:?}@192.168.100.128:5432/sundynix?sslmode=disable
REDIS_ADDR: 192.168.100.128:6379
MILVUS_ADDR: 192.168.100.128:19530
NEO4J_URI: neo4j://192.168.100.128:7687
NEO4J_USER: neo4j
NEO4J_PASS: ${NEO4J_PASSWORD:?}
# 报告源/产物 + KB 正文对象存储(本会话新加 blob)——指向 126,勿漏,否则 fallback localhost 连不上。
MINIO_ENDPOINT: 192.168.100.126:9000
MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:?}
MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:?}
MINIO_BUCKET: ${MINIO_BUCKET:-sundynix-docs}
SUNDYNIX_SECRET_KEY: ${SUNDYNIX_SECRET_KEY:?}
OTEL_EXPORTER_OTLP_ENDPOINT: http://192.168.100.128:4318
# 全文(bleve)索引落盘位置。不设则相对 CWD,写进容器可写层 → 每次发版重建容器就清零,
# 而混合检索只是静默少一路召回、不报错,很难发现。必须配合下面的持久卷。
BLEVE_PATH: /data/bleve
volumes:
- mcp-go-data:/data
mcp-py:
build: { context: ../../sundynix-mcp-py, dockerfile: Dockerfile }
image: sundynix/mcp-py:${TAG:-latest}
restart: unless-stopped
environment:
NATS_URL: nats://192.168.100.128:4222,nats://192.168.100.128:4223,nats://192.168.100.128:4224
# secure_sandbox(代码隔离执行)需访问宿主 Docker 拉一次性容器。安全敏感:等于把 132 宿主
# Docker 暴露给该服务(可逃逸);不需要代码执行工具可注释掉这两行。mcp-py 无对外端口。
volumes:
- /var/run/docker.sock:/var/run/docker.sock
# 全文索引持久化:随容器重建保留(向量在 Milvus、图谱在 Neo4j,都在 128
# 只有 bleve 是跟着 mcp-go 走的本地索引,唯独它需要这个卷)。
volumes:
mcp-go-data: