chore(deploy): 三机部署 compose 拆分 + NATS 3 节点集群

126=MinIO(已部署)、128=基础设施、132=应用。

- deploy/128-infra:NATS 3 节点集群(独立卷+cluster routes,暴露4222/4223/4224)+PG/Redis/
  Milvus(自带etcd+自带内部minio,不复用126)/Neo4j/Jaeger;端口对局域网暴露、卷持久化。
- deploy/nats-cluster/nats{1,2,3}.conf:max_payload 一致 + jetstream + cluster。
- deploy/132-app:仅 gateway(3000:8080)+dispatcher+mcp-go+mcp-py,无 admin nginx;env 指向
  126/128;mcp-go 补齐 MINIO env(本会话 blob 遗漏);NATS_STREAM_REPLICAS=3;.env.example 模板。
- docker-compose.prod.yml(单机):删 admin 服务(已内嵌)、mcp-go 补 MINIO env。
- 三个 compose 均 docker compose config 校验通过;.env 已 gitignore、.env.example 可提交。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Blizzard
2026-07-18 14:45:24 +08:00
parent 2e02a12260
commit 6b45adbbd2
8 changed files with 313 additions and 8 deletions
+4
View File
@@ -0,0 +1,4 @@
# 基础设施机 128 的库密码。cp .env.example .env 后填写。
# 这两个密码必须与 132 应用机 .env 里的 POSTGRES_PASSWORD / NEO4J_PASSWORD 一致。
POSTGRES_PASSWORD=change-me-postgres
NEO4J_PASSWORD=change-me-neo4j
+134
View File
@@ -0,0 +1,134 @@
# sundynix-agentix · 基础设施机 192.168.100.128
#
# cd deploy/128-infra && cp .env.example .env # 填库密码
# docker compose up -d
#
# 说明:
# - 对象存储 MinIO 已单独部署在 192.168.100.126,本机不含业务 MinIO
# 这里的 milvus-minio 仅供 Milvus 自己存段文件(内部网络,不对外)。
# - 端口对局域网暴露(0.0.0.0),供应用机 192.168.100.132 连接。
# ⚠️ Redis / Milvus / NATS 无认证,务必用防火墙只放行 132/126 网段,勿对公网开放。
# - NATS 三节点集群(JetStream Raft):单机多容器,各自独立卷;对 132 暴露 4222/4223/4224。
# 应用侧设 NATS_STREAM_REPLICAS=3durable 流才有 quorum 容错。
# - 全部卷持久化 + restart:unless-stopped,容器损坏/重启不丢数据。
services:
# ---------- NATS 3 节点集群 ----------
nats1:
image: nats:2-alpine
command: ["-c", "/etc/nats/nats-server.conf"]
restart: unless-stopped
volumes:
- ../nats-cluster/nats1.conf:/etc/nats/nats-server.conf:ro
- nats1_data:/data/jetstream
ports: ["4222:4222", "8222:8222"] # 客户端 + 监控
nats2:
image: nats:2-alpine
command: ["-c", "/etc/nats/nats-server.conf"]
restart: unless-stopped
volumes:
- ../nats-cluster/nats2.conf:/etc/nats/nats-server.conf:ro
- nats2_data:/data/jetstream
ports: ["4223:4222"]
nats3:
image: nats:2-alpine
command: ["-c", "/etc/nats/nats-server.conf"]
restart: unless-stopped
volumes:
- ../nats-cluster/nats3.conf:/etc/nats/nats-server.conf:ro
- nats3_data:/data/jetstream
ports: ["4224:4222"]
# ---------- 关系库 / 缓存 ----------
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: sundynix
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?需在 .env 设置}
POSTGRES_DB: sundynix
volumes: ["pg_data:/var/lib/postgresql/data"]
ports: ["5432:5432"]
healthcheck:
test: ["CMD-SHELL", "pg_isready -U sundynix"]
interval: 5s
timeout: 5s
retries: 10
redis:
image: redis:7-alpine
restart: unless-stopped
volumes: ["redis_data:/data"]
ports: ["6379:6379"]
# ---------- 向量库 Milvus(自带 etcd + 自带内部 minio,不复用 126----------
milvus-etcd:
image: quay.io/coreos/etcd:v3.5.14
restart: unless-stopped
environment:
ETCD_AUTO_COMPACTION_MODE: revision
ETCD_AUTO_COMPACTION_RETENTION: "1000"
ETCD_QUOTA_BACKEND_BYTES: "4294967296"
ETCD_SNAPSHOT_COUNT: "50000"
command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
volumes: ["milvus_etcd:/etcd"]
milvus-minio:
image: minio/minio:RELEASE.2023-03-20T20-16-18Z
restart: unless-stopped
environment:
MINIO_ACCESS_KEY: minioadmin # Milvus 段存储专用,内部网络不对外
MINIO_SECRET_KEY: minioadmin
command: minio server /minio_data
volumes: ["milvus_minio_data:/minio_data"]
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
milvus:
image: milvusdb/milvus:v2.4.13
command: ["milvus", "run", "standalone"]
restart: unless-stopped
environment:
ETCD_ENDPOINTS: milvus-etcd:2379
MINIO_ADDRESS: milvus-minio:9000
volumes: ["milvus_data:/var/lib/milvus"]
ports: ["19530:19530"] # 供 132 的 mcp-go 连接
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
interval: 15s
timeout: 10s
retries: 10
depends_on: [milvus-etcd, milvus-minio]
# ---------- 图谱库 ----------
neo4j:
image: neo4j:5-community
restart: unless-stopped
environment:
NEO4J_AUTH: neo4j/${NEO4J_PASSWORD:?需在 .env 设置}
volumes: ["neo4j_data:/data"]
ports: ["7687:7687", "7474:7474"] # bolt + 浏览器
# ---------- 链路追踪(可选,不需要可删)----------
jaeger:
image: jaegertracing/all-in-one:1.60
restart: unless-stopped
environment:
COLLECTOR_OTLP_ENABLED: "true"
ports: ["16686:16686", "4318:4318"] # UI + OTLP/HTTP 接收
volumes:
nats1_data:
nats2_data:
nats3_data:
pg_data:
redis_data:
milvus_etcd:
milvus_minio_data:
milvus_data:
neo4j_data: