forked from zhyese/grid-qa
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
288 lines (270 loc) · 9.38 KB
/
Copy pathdocker-compose.yml
File metadata and controls
288 lines (270 loc) · 9.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
# 电网运维 RAG 智能问答系统 - 全栈编排
# S1: mysql + minio | S5: + etcd + milvus-minio + milvus | S11: + backend + frontend
# 一键启动: docker compose up -d --build
services:
# ---------- MySQL:结构化元数据 ----------
mysql:
image: mysql:8.0
container_name: grid-mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123456}
MYSQL_DATABASE: ${MYSQL_DATABASE:-grid_qa}
MYSQL_USER: ${MYSQL_USER:-grid}
MYSQL_PASSWORD: ${MYSQL_PASSWORD:-grid123456}
TZ: Asia/Shanghai
ports:
- "3307:3306" # 宿主机 3307,避开本机 MySQL
volumes:
- mysql-data:/var/lib/mysql
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
--default-authentication-plugin=mysql_native_password
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p${MYSQL_ROOT_PASSWORD:-root123456}"]
interval: 10s
timeout: 5s
retries: 12
start_period: 30s
# ---------- MinIO:源文档对象存储 ----------
minio:
image: minio/minio:latest
container_name: grid-minio
restart: unless-stopped
environment:
MINIO_ROOT_USER: ${MINIO_ACCESS_KEY:-minioadmin}
MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY:-minioadmin}
ports:
- "9000:9000"
- "9001:9001"
volumes:
- ./data/minio:/data
command: server /data --console-address ":9001"
# ---------- etcd:Milvus 元数据依赖 ----------
etcd:
image: quay.io/coreos/etcd:v3.5.5
container_name: grid-etcd
restart: unless-stopped
environment:
ETCD_AUTO_COMPACTION_MODE: revision
ETCD_AUTO_COMPACTION_RETENTION: "1000"
ETCD_QUOTA_BACKEND_BYTES: "4294967296"
ETCD_SNAPSHOT_COUNT: "50000"
volumes:
- ./data/etcd:/etcd
command: etcd -advertise-client-urls=http://etcd:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
healthcheck:
test: ["CMD", "etcdctl", "endpoint", "health"]
interval: 30s
timeout: 20s
retries: 3
# ---------- Milvus 专用对象存储 ----------
milvus-minio:
image: minio/minio:latest
container_name: grid-milvus-minio
restart: unless-stopped
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
volumes:
- ./data/milvus-minio:/minio_data
command: minio server /minio_data
# ---------- Milvus 2.4 向量库 ----------
milvus:
image: milvusdb/milvus:v2.4.10
container_name: grid-milvus
command: ["milvus", "run", "standalone"]
restart: unless-stopped
depends_on:
- etcd
- milvus-minio
environment:
ETCD_ENDPOINTS: etcd:2379
MINIO_ADDRESS: milvus-minio:9000
ports:
- "19530:19530"
- "9091:9091"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
interval: 30s
start_period: 90s
timeout: 20s
retries: 3
# ---------- Redis:热点问答缓存 ----------
redis:
image: redis:7-alpine
container_name: grid-redis
restart: unless-stopped
ports:
- "6379:6379"
volumes:
- ./data/redis:/data
command: redis-server --appendonly yes --maxmemory 300mb --maxmemory-policy allkeys-lru --maxmemory-samples 10
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 3s
retries: 5
# ---------- Neo4j:知识图谱(设备-故障-处置 多跳推理)----------
neo4j:
image: neo4j:5-community
container_name: grid-neo4j
restart: unless-stopped
environment:
NEO4J_AUTH: neo4j/${NEO4J_PASSWORD:-neo4j123456}
ports:
- "7474:7474" # Neo4j Browser
- "7687:7687" # Bolt 协议
volumes:
- ./data/neo4j:/data
# ---------- Ollama:本地应急 LLM(云端 qwen/deepseek/doubao 全部不可用时的兜底,非强依赖)----------
# LLM_FALLBACK_CHAIN 末位新增 ollama;首次启动自动拉取模型(7B q4 量化,约 4.5GB,CPU 可推理)。
# mem_limit/cpus 防止真实触发兜底、开始推理时把 mysql/milvus/redis/neo4j 挤爆(OOM/CPU 饥饿);
# 按部署机器实际配置调整数值。
ollama:
image: ollama/ollama:latest
container_name: grid-ollama
restart: unless-stopped
ports:
- "11434:11434"
volumes:
- ./data/ollama:/root/.ollama
entrypoint: ["/bin/sh", "-c"]
command:
- "ollama serve & sleep 3 && ollama pull ${OLLAMA_MODEL:-qwen2.5:7b-instruct-q4_K_M} && wait"
mem_limit: 10g
cpus: 4
# ---------- Nacos:配置中心(可选,CONFIG_SOURCE=nacos 时启用;默认 env 不依赖)----------
# 启动: docker compose up -d nacos ;管理台 http://localhost:8848/nacos (默认 nacos/nacos)
nacos:
image: nacos/nacos-server:v2.4.3
container_name: grid-nacos
restart: unless-stopped
environment:
MODE: standalone
ports:
- "8848:8848"
- "9848:9848"
volumes:
- ./data/nacos:/home/nacos/data
# ---------- 后端 ----------
backend:
build:
context: ./backend
args:
- HTTP_PROXY=http://host.docker.internal:7897
- HTTPS_PROXY=http://host.docker.internal:7897
container_name: grid-backend
restart: unless-stopped
depends_on:
- mysql
- minio
- milvus
- redis
- neo4j
- ollama
env_file: .env
environment:
# 容器内用 service name + 内部端口连接(覆盖 .env 的 localhost)
DATABASE_URL: mysql+aiomysql://grid:grid123456@mysql:3306/grid_qa?charset=utf8mb4
REDIS_URL: redis://redis:6379/0
MINIO_ENDPOINT: minio:9000
MILVUS_HOST: milvus
NEO4J_URI: bolt://neo4j:7687
MCP_SERVERS: '[{"name":"mock_scada","url":"http://mock-scada:9100"}]' # N2 启动发现 mock SCADA → 注册 query_telemetry 到 agent ToolRegistry
# 容器直连外网:云API(dashscope/deepseek/doubao 国内可达) + bge 走 hf-mirror 国内镜像。
# 注:宿主机代理 7897 仅监听 127.0.0.1(未开 Allow LAN),容器经 host.docker.internal 连不上,
# 故不设 HTTPS_PROXY——否则 httpx/requests 把所有出站(含 hf-mirror、云API)都发往不可达代理。
HF_ENDPOINT: https://hf-mirror.com
HF_HUB_OFFLINE: "1" # 离线模式:用挂载的宿主机 HF 缓存,避免联网下载受阻
TRANSFORMERS_OFFLINE: "1"
extra_hosts:
- "host.docker.internal:host-gateway"
ports:
- "8001:8001"
volumes:
- grid-backend-data:/app/data # 持久化 data/(运行日志 + 数据备份 .sql),容器重建不丢
- C:/Users/Administrator/.cache/huggingface/hub:/root/.cache/huggingface/hub:ro # 宿主机 bge 缓存(离线加载,免下载)
# ---------- Mock SCADA MCP Server(N2 MCP 总线外部 SCADA 数据源,侧车)----------
# 复用 backend 镜像跑 mock_scada_server(真实 SCADA 接入时换连接器即可)。
# backend 经 MCP_SERVERS=http://mock-scada:9100 发现并注册 query_telemetry 等工具到 agent ToolRegistry。
mock-scada:
image: rag-backend:latest
build:
context: ./backend
container_name: grid-mock-scada
restart: unless-stopped
command: python -m app.mcp.mock_scada_server
ports:
- "9100:9100"
# ---------- 前端(nginx)----------
frontend:
build:
context: ./frontend
args:
- HTTP_PROXY=http://host.docker.internal:7897
- HTTPS_PROXY=http://host.docker.internal:7897
container_name: grid-frontend
restart: unless-stopped
depends_on:
- backend
ports:
- "5173:80"
# ---------- Prometheus 指标采集 ----------
# 注:采集本地 uvicorn(host.docker.internal:8001),不依赖 backend 容器
prometheus:
image: prom/prometheus:latest
container_name: grid-prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
- ./data/prometheus:/prometheus
# ---------- Grafana 可视化仪表盘(好看的开箱监控界面)----------
grafana:
image: grafana/grafana:latest
container_name: grid-grafana
restart: unless-stopped
ports:
- "3000:3000"
environment:
GF_SECURITY_ADMIN_USER: admin
GF_SECURITY_ADMIN_PASSWORD: admin
volumes:
- ./data/grafana:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning:ro
depends_on:
- prometheus
# ---------- Langfuse:LLM trace 可视化(N4)----------
langfuse:
image: langfuse/langfuse:latest
container_name: grid-langfuse
restart: unless-stopped
depends_on:
- postgres-langfuse
environment:
DATABASE_URL: postgresql://langfuse:langfuse@postgres-langfuse:5432/langfuse
NEXTAUTH_SECRET: ${LANGFUSE_NEXTAUTH_SECRET:-langfuse-secret-2026}
NEXTAUTH_URL: http://localhost:3001
SALT: ${LANGFUSE_SALT:-langfuse-salt-2026}
NEXT_PUBLIC_SIGNUP_DISABLED: "false"
ports:
- "3001:3000" # Langfuse UI(避开 Grafana 的 3000)
volumes:
- ./data/langfuse:/data
# ---------- Langfuse 专用 PostgreSQL ----------
postgres-langfuse:
image: postgres:15-alpine
container_name: grid-langfuse-db
restart: unless-stopped
environment:
POSTGRES_USER: langfuse
POSTGRES_PASSWORD: langfuse
POSTGRES_DB: langfuse
volumes:
- ./data/langfuse-db:/var/lib/postgresql/data
volumes:
mysql-data:
grid-backend-data: