- git mv 保留历史:ui/(Vue3+Vite)、sdk/(BFF 中间层)
- 路径语义修正:db_path/figures_cache 改相对 sdk/(BFF cwd),
历史库 sdk/backend/data 迁移至 sdk/data/(会话/图片缓存无损)
- 引用修复 ~15 处:config.py、deploy/*.sh、vitest/playwright 配置、
单测导入路径、docs、README、gitignore、.env.example
- 骨架:agent/{qa,methodology,legacy-rag,vendor}、knowledge/manifest.yaml、
tooling/{compile,kb,crypto,assemble,audit,tools,scripts} + README
- 门禁验证:sdk pytest 125 通过、ui vitest 158 通过、
生产 BFF 脚本重启四上游全绿 + 静态托管 + 会话库无损
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
93 lines
3.8 KiB
Bash
93 lines
3.8 KiB
Bash
#!/bin/bash
|
||
# deploy/neo4j_recreate.sh —— Neo4j 容器重建扩容(方案 4,2026-08-26)
|
||
# 在远端执行:ssh -p 26518 8.163.92.8 'bash ~/5090/teamWorkspace/zh/PlantAI-rag-new/deploy/neo4j_recreate.sh'
|
||
#
|
||
# 背景:neo4j-plant-srt-direct-v1-full 是手工 docker run 创建的(无 compose 管理、
|
||
# 创建命令已丢失),heap 4G/12G、pagecache 24G。16.4M 关系的多跳遍历实测
|
||
# 108-147s,是问答延迟的最大瓶颈。docker update 改不了 Env,必须 stop+同名重建。
|
||
#
|
||
# 改动清单(与旧容器的差异):
|
||
# heap initial 4G -> 8G
|
||
# heap max 12G -> 24G
|
||
# pagecache 24G -> 24G(保持:数据目录仅 14G 已全缓存)
|
||
# transaction.total.max 未设(默认 70% heap) -> 显式 16G
|
||
# 不动:端口映射(18788/18575)、restart 策略、4 个 bind mount 数据目录。
|
||
#
|
||
# 停机窗口:QA 服务中断约 3-5 分钟(停 QA → 重建 → 数据校验 → 起 QA)。
|
||
set -uo pipefail
|
||
|
||
CONTAINER="neo4j-plant-srt-direct-v1-full"
|
||
IMAGE="neo4j:5.15.0-community"
|
||
DATA_ROOT="/home/xzq/home/wutx/gene-family-mas-v2/data/neo4j_plant_srt_direct_v1_docker"
|
||
RAG_DIR="/home/xzq/5090/PlanAI-cooperate/RAG/rag-develop"
|
||
ENV_FILE="/home/xzq/5090/teamWorkspace/zh/PlantAI-rag-new/sdk/.env"
|
||
|
||
# 1. 从 sdk/.env 读真实密码(容器 Env 里的初始值是 password,运行时已改,必须用真实的)
|
||
NEO4J_PASSWORD=$(grep -oE "^BFF_NEO4J_PASSWORD_DIRECT=.*" "$ENV_FILE" | cut -d= -f2)
|
||
if [ -z "$NEO4J_PASSWORD" ]; then
|
||
echo "ERROR: 未在 $ENV_FILE 找到 BFF_NEO4J_PASSWORD_DIRECT"
|
||
exit 1
|
||
fi
|
||
|
||
echo "=== 前置检查 ==="
|
||
docker inspect "$CONTAINER" >/dev/null 2>&1 || { echo "ERROR: 容器 $CONTAINER 不存在"; exit 1; }
|
||
[ -d "$DATA_ROOT/data" ] || { echo "ERROR: 数据目录 $DATA_ROOT/data 不存在,拒绝继续"; exit 1; }
|
||
echo "数据目录大小: $(du -sh "$DATA_ROOT/data" 2>/dev/null | cut -f1)"
|
||
echo "密码来源: $ENV_FILE(已读取,不显示)"
|
||
|
||
echo
|
||
echo "=== 1. 停止 QA 服务(官方脚本)==="
|
||
(cd "$RAG_DIR" && bash start_plantAI_RAG.sh stop) || { echo "ERROR: 停 QA 失败,中止"; exit 1; }
|
||
|
||
echo
|
||
echo "=== 2. 停止并删除旧容器(数据在 bind mount,安全)==="
|
||
docker stop "$CONTAINER" || true
|
||
docker rm "$CONTAINER" || true
|
||
|
||
echo
|
||
echo "=== 3. 同名重建(内存扩容)==="
|
||
docker run -d --name "$CONTAINER" \
|
||
--restart unless-stopped \
|
||
-p 127.0.0.1:18788:7687 \
|
||
-p 127.0.0.1:18575:7474 \
|
||
-e "NEO4J_AUTH=neo4j/${NEO4J_PASSWORD}" \
|
||
-e NEO4J_server_memory_heap_initial__size=8G \
|
||
-e NEO4J_server_memory_heap_max__size=24G \
|
||
-e NEO4J_server_memory_pagecache_size=24G \
|
||
-e NEO4J_dbms_memory_transaction_total_max=16G \
|
||
-v "${DATA_ROOT}/data:/data" \
|
||
-v "${DATA_ROOT}/logs:/logs" \
|
||
-v "${DATA_ROOT}/plugins:/plugins" \
|
||
-v "${DATA_ROOT}/import:/var/lib/neo4j/import" \
|
||
"$IMAGE"
|
||
|
||
echo
|
||
echo "=== 4. 等待 Bolt 就绪(最多 180s,首次启动含恢复)==="
|
||
for i in $(seq 1 90); do
|
||
sleep 2
|
||
if docker exec "$CONTAINER" bash -c 'echo > /dev/tcp/127.0.0.1/7687' 2>/dev/null; then
|
||
echo "Bolt 就绪(${i}x2s)"
|
||
break
|
||
fi
|
||
if [ "$i" -eq 90 ]; then
|
||
echo "ERROR: Bolt 180s 未就绪,看容器日志:"
|
||
docker logs --tail 30 "$CONTAINER"
|
||
exit 1
|
||
fi
|
||
done
|
||
|
||
echo
|
||
echo "=== 5. 数据完整性校验 ==="
|
||
sleep 5 # 等数据库完全上线
|
||
docker exec "$CONTAINER" cypher-shell -u neo4j -p "$NEO4J_PASSWORD" \
|
||
"MATCH (e:SRT2CanonicalEntity) RETURN count(e) AS entities; MATCH (a:SRT2CanonicalAssertion) RETURN count(a) AS assertions;" \
|
||
2>&1 | head -10 || { echo "ERROR: 校验查询失败"; exit 1; }
|
||
|
||
echo
|
||
echo "=== 6. 起回 QA(官方脚本)==="
|
||
(cd "$RAG_DIR" && bash start_plantAI_RAG.sh start)
|
||
|
||
echo
|
||
echo "=== 完成。内存配置(容器内 conf)==="
|
||
docker exec "$CONTAINER" bash -c 'grep -E "heap|pagecache|transaction.total" /var/lib/neo4j/conf/neo4j.conf | grep -v "^#"' 2>/dev/null
|