Files
jerryandClaude Fable 5 4071b29520 Python 统一 U0-U4:venv py3.12.13 + 四树 cp312 重编译 + 端口互换 8091/8092/8093 + 旧服务停而不删
- U0:新建 plantai-rag-new-venv(3.12.13,130 包),torch 2.13.0+cpu/cython 3.2.8/faiss 1.14.3/openai 3.3.1,requirements.lock 固化
- U1:四树全 venv 重编译(sdk 15/qa 45/methodology 28/legacy 283 .so 全 cp312),audit 双审计过
- U2:备用端口影子对照:金标 search evidence 30/30 与生产一致、SDK pytest 125 过、五上游绿
- U3:统一树切终态 8091/8092/8093 + BFF 8090(venv),停旧服务(容器/进程不删,30 天窗)
- U4:minerupy311→minerupy312 断链修复、GF_PYTHON_ENV 回退统一、start-dev/run/bff_restart 去 conda、server.env/README 更新

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-01 12:23:37 +08:00
..

PlantAI + RAG 服务端保护流程

本目录只放服务端构建、加密与授权工具。供应商私钥、私钥口令和版本主密钥不得复制到客户机。

新的阶段顺序

阶段 A 现在执行完整的代码硬化链:

  1. 从 server.env 读取 PLANTAI_SOURCE 和 RAG_SOURCE。
  2. Cython 生成 C 扩展。
  3. GCC 使用 -fvisibility=hidden 编译。
  4. strip --strip-unneeded 删除普通符号表和调试信息。
  5. ELF 工具把除 PyInit_* 外的已定义动态符号标记为 hidden,并逐个复核。
  6. 对完整目录计算摘要、写入 .hardened-build.json,再执行代表性导入/行为冒烟测试。
  7. 全部成功后,才把临时目录原子移动为 PlantAI_compiled.new 和 RAG.new。

阶段 C 会重新校验目录摘要、Python ABI、ELF 符号状态和冒烟测试。缺少构建标记、目录被修改、ABI 不一致或测试失败时都会停止,不会生成发行包。

0. 配置

只修改:

cd /home/xzq/5090/PlanAI-cooperate/hsj-workspace/encryption-test/server/plantai_server_package
vi server.env

至少确认这些值:

PLANTAI_SOURCE=/your/PlantAI/source
RAG_SOURCE=/your/RAG/source
PLANTAI_PYTHON=/path/to/python
VERSION=1.0.0

PLANTAI_PYTHON 必须与客户运行环境的 Python 大版本、小版本和 ABI 一致,并已安装 Cython。

A. 编译、隐藏符号、strip 和验证

cd /home/xzq/5090/PlanAI-cooperate/hsj-workspace/encryption-test/server/plantai_server_package
bash phase_a_compile_all.sh

验收:

find ../PlantAI_compiled.new ../RAG.new -type f -name '*.c'
find ../PlantAI_compiled.new ../RAG.new -type f -name '*.so' | wc -l
python3 tools/audit_compiled_tree.py \
  --tree ../PlantAI_compiled.new --project PlantAI --require-marker
python3 tools/audit_compiled_tree.py \
  --tree ../RAG.new --project RAG --require-marker

第一条应无输出,两个审计命令应返回 "ok": true。阶段 A 为防止覆盖而拒绝已存在的 .new 目录;确认旧产物不再需要后,由操作者自行改名或移走。

B. 初始化供应商密钥和版本主密钥

仅首次初始化供应商签名密钥:

bash phase_b_init_supplier.sh

每个新 VERSION 都生成独立主密钥:

bash phase_b_new_release_key.sh

C. 构建联合发行包

阶段 C 默认读取 server.env 中的 PLANTAI_COMPILED 和 RAG_COMPILED;它们应指向阶段 A 的 .new 目录。

bash phase_c_build_dual_release.sh

脚本拒绝覆盖同版本的旧暂存目录或压缩包。确认旧文件后自行移走,再重新执行。成功后输出:

out/plantai-rag-release-<VERSION>.tar.gz

D-F. 客户交付与授权

继续使用现有阶段脚本:

bash phase_d_swtpm_test.sh       # 仅软件 TPM 测试
bash phase_e_issue_license.sh    # 绑定客户设备并签发授权
bash phase_f_acceptance.sh       # 验收

生产环境不要设置 ALLOW_SOFTWARE_TPM_TEST=1。代码的 .so 硬化提高逆向成本,但不是不可逆的保密边界;真正的机密仍应放在 TPM 解封后才出现的加密运行资产中。

常见失败

  • Output already exists:为防覆盖而停止,人工检查并移走旧 .new。
  • marker_missing:输入不是由新阶段 A 生成,阶段 C 会拒绝。
  • marker_mismatch:阶段 A 后目录发生变化,必须重新构建并测试。
  • python_abi_suffix_mismatch:编译 Python 与当前校验/运行 Python ABI 不一致。
  • visible_non_pyinit 或 symtab_present:符号隐藏或 strip 未达到要求。
  • 冒烟测试失败:不要继续打包;先在源码或依赖环境中解决兼容问题。