diff --git a/agent/legacy-rag/scripts/start.sh b/agent/legacy-rag/scripts/start.sh index 6093ccc..9f42ecc 100755 --- a/agent/legacy-rag/scripts/start.sh +++ b/agent/legacy-rag/scripts/start.sh @@ -9,7 +9,8 @@ ENTRY="${2:-app}" ENV_FILE="${LEGACY_ENV_FILE:-$AGENT_ROOT/env/prod.env}" LOG_FILE="${LEGACY_LOG_FILE:-/tmp/plantai-agent-legacy-$PORT.log}" PID_FILE="$AGENT_ROOT/run/legacy-$PORT.pid" -PYTHON="${LEGACY_PYTHON:-/home/xzq/5090/teamWorkspace/zh/plantai-rag-new-venv/bin/python}" +PYTHON="${LEGACY_PYTHON:-$AGENT_ROOT/../venv/bin/python}" +[[ -x "$PYTHON" ]] || PYTHON="/home/xzq/5090/teamWorkspace/zh/plantai-rag-new-venv/bin/python" BIND="${LEGACY_API_HOST:-127.0.0.1}" case "$ENTRY" in diff --git a/agent/methodology/scripts/start.sh b/agent/methodology/scripts/start.sh index 77240b0..7b1e40f 100755 --- a/agent/methodology/scripts/start.sh +++ b/agent/methodology/scripts/start.sh @@ -7,7 +7,8 @@ PORT="${1:-8092}" # 终态端口 ENV_FILE="${METHODOLOGY_ENV_FILE:-$AGENT_ROOT/env/prod.env}" LOG_FILE="${METHODOLOGY_LOG_FILE:-/tmp/plantai-agent-methodology-$PORT.log}" PID_FILE="$AGENT_ROOT/run/methodology-$PORT.pid" -PYTHON="${METHODOLOGY_PYTHON:-/home/xzq/5090/teamWorkspace/zh/plantai-rag-new-venv/bin/python}" +PYTHON="${METHODOLOGY_PYTHON:-$AGENT_ROOT/../venv/bin/python}" +[[ -x "$PYTHON" ]] || PYTHON="/home/xzq/5090/teamWorkspace/zh/plantai-rag-new-venv/bin/python" BIND="${METHODOLOGY_API_HOST:-127.0.0.1}" mkdir -p "$AGENT_ROOT/run" diff --git a/agent/qa/scripts/start.sh b/agent/qa/scripts/start.sh index 95714af..8908c1e 100755 --- a/agent/qa/scripts/start.sh +++ b/agent/qa/scripts/start.sh @@ -7,7 +7,8 @@ PORT="${1:-8091}" # 终态端口 ENV_FILE="${QA_ENV_FILE:-$AGENT_ROOT/env/prod.env}" LOG_FILE="${QA_LOG_FILE:-/tmp/plantai-agent-qa-$PORT.log}" PID_FILE="$AGENT_ROOT/run/qa-$PORT.pid" -PYTHON="${QA_PYTHON:-/home/xzq/5090/teamWorkspace/zh/plantai-rag-new-venv/bin/python}" +PYTHON="${QA_PYTHON:-$AGENT_ROOT/../venv/bin/python}" +[[ -x "$PYTHON" ]] || PYTHON="/home/xzq/5090/teamWorkspace/zh/plantai-rag-new-venv/bin/python" mkdir -p "$AGENT_ROOT/run" [[ -x "$PYTHON" ]] || { echo "QA Python 不可执行: $PYTHON" >&2; exit 1; } diff --git a/docs/DEPLOY_FLOW.md b/docs/DEPLOY_FLOW.md index 83d4843..a607398 100644 --- a/docs/DEPLOY_FLOW.md +++ b/docs/DEPLOY_FLOW.md @@ -19,6 +19,7 @@ | 打包产物目录 | `tooling/build//install/`(VERSION 默认读 `tooling/tooling.env`,当前 2.0.0) | | 已就绪辅助脚本 | `deploy/ollama_restart.sh`(本地嵌入模型拉起)、`vstore/vstore_restart.sh`(路径自推导重启)已入包 | | nginx 代理模板 | `deploy/nginx/plantai.conf`(SSE 长连接 + 大文件上传适配,随安装包发布到 `install/nginx/`) | +| 176 已部署 | **2026-09-09 按本标准完成 176 部署**(隧道B 接入,`/srv/plantai` 布局:install + qa-db + data + docgen;nginx 80 唯一入口;无 GPU、无 docker、无生信) | | QA 数据库裸进程 | **systemd 裸进程为最终部署标准**(无 docker):qdrant v1.18.3 + neo4j 5.15.0-community,全部 127.0.0.1;**端口 27433/27434 + 19888/19885**;数据在 `<部署根>/qa-db/`;安装脚本 `install/qa-db/install_qdrant.sh`、`install_neo4j.sh`(均免编译:官方静态二进制/tarball,支持本地 bin/ 离线分发);175 上 docker 容器(27333/19788)为其他项目共享服务、不动 | ## 1. 编译阶段(构建机) @@ -143,18 +144,30 @@ sudo bash qa-db/replace_db.sh neo4j <新data目录> ### 5.1 环境准备 ```bash -# - 安装 py3.12 venv(或复用构建机 venv 的 rsync 拷贝),安装依赖(sdk/pyproject.toml 与 vstore/pyproject.toml 的 dependencies) -# - 编辑 .env:sdk/.env(DOCGEN_LLM_* 与 VSTORE_BASE_URL)、vstore/.env(VSTORE_KEY、VSTORE_ROOT、VSTORE_EMBED_URL、VSTORE_EMBED_MODEL=bge-m3:567m) +# - 安装 py3.12 venv 到 <安装根>/venv(start.sh/start_all.sh 均按 $ROOT/venv/bin/python 解析;175 旧路径为回退不再新建) +# - 依赖安装:pip install torch==2.13.0 --index-url https://download.pytorch.org/whl/cpu 先行(PyPI 无 +cpu 构建), +# 其余依赖用构建机 venv 的 pip freeze 清单安装 +# - 编辑 .env(176 实战模板): +# sdk/.env = DOCGEN_LLM_*、VSTORE_BASE_URL=http://127.0.0.1:8094、BIOFLOW_ENABLED=false、 +# BFF_NEO4J_URI_NORMALIZED=bolt://127.0.0.1:19888(裸进程机必填!默认值是 docker 口 19788) +# vstore/.env= VSTORE_KEY、VSTORE_ROOT=<部署根>/docgen、VSTORE_EMBED_URL=http://127.0.0.1:11434、VSTORE_EMBED_MODEL=bge-m3:567m +# 并复制一份到 <安装根>/.env(vstore_restart.sh 从安装根 source) +# qa|methodology|legacy-rag/env/prod.env = 路径类键(*_ROOT/PYTHONPATH/reranker/data)改目标机布局,密钥原样 +# - methodology/legacy-rag 的 data 目录(data/evaluation/*、data/pc、data/split)是运行时依赖,须随部署复制 # - KB 密钥(若 SKIP_KB=0):把 kb.key 放到目标机并 chmod 600 cd /srv/plantai/install bash ollama_restart.sh # 本地嵌入模型(已运行则跳过;缺失模型会提示 ollama pull bge-m3:567m) -bash start_all.sh # 四服务 + BFF;start_all.sh 内已先拉起 ollama +bash start_all.sh # 五服务(QA/methodology/legacy/vstore/BFF);start_all.sh 内先拉 ollama、BFF 前 source sdk/.env # 生信(可选): docker load -i /tmp/plantai-bioflow-images.tar # 创建 bioflow_service 部署树 + .env(DOCGEN_LLM_*、BIOFLOW_IMAGE_MAP_PATH 指向 bioflow_kernel/assets 内的 stage_image_map.json)+ bash bioflow_service/restart.sh ``` +- **Ollama 离线携带(目标机连不上 ollama.com 时唯一路径)**:只拷二进制不够——完整布局为 `/opt/ollama/bin/ollama`(实体)+ `/usr/local/bin/ollama`(symlink 指回它)+ `/opt/ollama/lib/ollama/`(llama-server 与 ggml/cuda runner;缺失时报 `llama-server binary not found`)。模型拷 `~/.ollama/models/`(bge-m3:567m 需 manifests + 对应 blob 两个文件,约 1.2G)。无 GPU 机器嵌入为 CPU 推理(单次约 50s,功能正常)。 +- **下载源可达性(2026-09-09 实测)**:pypi/github/gh-proxy.com/ghfast.top/download.pytorch.org/apt 可达;ollama.com、registry.ollama.ai、dist.neo4j.org、objects.githubusercontent.com 不可达——neo4j 用 `qa-db/bin/` 离线 tarball(已入包),qdrant 下载走 gh-proxy 回退。 +- **内网直连传输**:两机同内网时用目标机 26518 端口 + 专用密钥(如 `id_ed25519_p2p`)直连 rsync,不经跳板机;`/srv/plantai` 须先在目标机建好并 chown 部署用户。 + ## 5b. nginx 安装与 80 端口代理(目标机,从零开始) > 目标机此前没有 nginx。本节让 80 端口成为唯一客户入口;8090 等全部服务只回环可达。 diff --git a/tooling/build_all.sh b/tooling/build_all.sh index 1c2445f..6a2a799 100755 --- a/tooling/build_all.sh +++ b/tooling/build_all.sh @@ -123,6 +123,7 @@ cp "$PROJECT_ROOT/vstore/.env.example" "$RELEASE_ROOT/vstore/.env.example" 2>/de # env 模板 for t in qa methodology legacy-rag; do + mkdir -p "$RELEASE_ROOT/$t/env" cp "$PROJECT_ROOT/agent/$t/env/prod.env.example" "$RELEASE_ROOT/$t/env/prod.env.example" 2>/dev/null || true done cp "$PROJECT_ROOT/sdk/.env.example" "$RELEASE_ROOT/sdk/.env.example" 2>/dev/null || true @@ -136,14 +137,22 @@ cat > "$RELEASE_ROOT/start_all.sh" <<'DEPLOY' set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BIND="${1:-127.0.0.1}" +# Python 解析:安装包内 venv 优先(install/venv,可链到部署根),缺失退回 PATH python3 +PYBIN="${PLANTAI_PYTHON:-$ROOT/venv/bin/python}" +[[ -x "$PYBIN" ]] || PYBIN="$(command -v python3)" echo "== 启动 PlantAI-rag-new 四服务 ==" # 向量化本地模型(bge-m3 嵌入):先拉起 Ollama(已运行则跳过),模型缺失只告警不阻断 bash "$ROOT/ollama_restart.sh" 2>/dev/null || echo "[ollama] 拉起失败,向量化降级(不阻断其余服务)" bash "$ROOT/qa/scripts/start.sh" 8091 || true bash "$ROOT/methodology/scripts/start.sh" 8092 || true bash "$ROOT/legacy-rag/scripts/start.sh" 8093 app || true +bash "$ROOT/vstore_restart.sh" || echo "[vstore] 拉起失败,向量化不可用(不阻断其余服务)" sleep 3 -( cd "$ROOT/sdk" && setsid python -m uvicorn app.main:app --host "$BIND" --port 8090 \ +# BFF env:sdk/.env 含 DOCGEN_LLM_*、VSTORE_BASE_URL、BFF_NEO4J_*(无此 env BFF 上游不可用) +set -a +[ -f "$ROOT/sdk/.env" ] && . "$ROOT/sdk/.env" +set +a +( cd "$ROOT/sdk" && setsid "$PYBIN" -m uvicorn app.main:app --host "$BIND" --port 8090 \ > /tmp/plantai-sdk.log 2>&1 < /dev/null & ) echo "BFF 启动中(8090),5 秒后自检:" sleep 5