Files
PlantAI-rag-new/tooling/crypto/client/README.md
T
jerryandClaude Fable 5 27946edc2b P0/M1: 收编 encryption-test 工具链入 tooling/
- legacy_plantai_server_package/: phase_a–f + compile_* + bin/plantai_admin.py
  + tools/(audit/elf_visibility/smoke/build_delivery_manifest) 完整基线
- legacy_docker_packager/: protected 形态参考
- crypto/client/: plantai_core.py(AES-GCM 原语) + install_plantai.sh 参考
- secrets/provision 严格排除(gitignore),入 git 前已脱敏清理
- LEGACY_MAPPING.md 记录源与改造方向

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 12:59:29 +08:00

187 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PlantAI + RAG + QA 客户端部署包
本目录可以交给客户:不含供应商私钥和明文 `K_master`,只能采集指纹、配置 TPM、验证供应商签名、解封密钥和解密已授权资产。
## 客户专属配置 — `install.env` 变量详解
以下表格覆盖 `install.env.example` 中所有变量。每客户交付时据此填写 `install.env`。
| 变量 | 默认值 | 作用 | 影响路径 | 每客户必改 | 取值依据 |
|------|--------|------|----------|:----------:|----------|
| `PLANTAI_ROOT` | `/opt/PlantAI` 或 `$HOME/PlantAI` | 安装根目录,其下自动创建所有子目录 | → `bin/` `config/` `assets/` `data/` `releases/` `runtime/` | 通常不改 | 客户目录规范(如 `/data/PlantAI`) |
| `RELEASE_SRC` | `./release` | 供应商发行包解压目录,安装时从此取 VERSION / app/ / assets/ / config/ | → `$PLANTAI_ROOT/releases/<VERSION>/` 的源 | 不改 | 保留默认值 |
| `DEVICE_ID` | `$(hostname)` | 设备业务标识,写入许可证和日志,用于绑定设备身份 | → 出现在 `license.json` / 监控系统 | **必改** | `<客户缩写>-<机器角色>-<序号>`,如 `huanuo-web01` |
| `PLANTAI_WEB_PORT` | `7880` | PlantAI Web 服务监听端口 | → 服务绑定端口 | 偶尔改 | 客户现有服务已占用时 |
| `RAG_PORT` | `7900` | RAG 服务监听端口 | → 服务绑定端口 | 偶尔改 | 客户现有服务已占用时 |
| `PLANTAI_PYTHON` | `python3` | PlantAI 后端使用的 Python 解释器路径 | → 执行 `plantai_client.py` / 后端进程 | **必改** | 问客户 conda 环境路径,如 `/opt/miniconda3/envs/plantai/bin/python` |
| `RAG_PYTHON` | 同 `PLANTAI_PYTHON` | RAG 服务使用的 Python 解释器路径 | → 执行 `start_qa_v1_0_0_7908.sh` 等 | **必改** | 同上,通常与 `PLANTAI_PYTHON` 相同 |
| `NEO4J_URI` | `bolt://127.0.0.1:7687` | Neo4j 图数据库连接地址 | → 应用通过此 URI 连接图数据库 | 通常改 IP | 客户 Neo4j 实际主机 IP |
| `NEO4J_USER` | `neo4j` | Neo4j 用户名 | → 数据库连接认证 | 通常不改 | 除非客户改了用户名 |
| `NEO4J_PASSWORD` | 无 | Neo4j 密码 | → 数据库连接认证 | **必改** | 客户管理员提供,**禁用默认/空密码** |
| `QDRANT_URL` | `http://127.0.0.1:6333` | Qdrant 向量数据库 HTTP 地址 | → 应用通过此 URL 读写向量 | 通常改 IP | 客户 Qdrant 实际主机 IP |
| `V15_QDRANT_COLLECTION` | 无 | Qdrant 集合名,反映客户 + 数据版本 | → 读写此集合中的向量数据 | **必改** | `v15_<客户缩写>_<日期>`,如 `v15_huanuo_20260701` |
| `V15_BGE_MODEL` | `bge-m3:567m` | Ollama 中的 embedding 模型名 | → 文本向量化使用的模型 | 不改 | 仅更换 embedding 策略时动 |
| `V15_OLLAMA_EMBED_URL` | `http://127.0.0.1:11434` | Ollama 服务 URL | → embedding API 调用地址 | 偶尔改 | Ollama 不在本机时改 IP |
| `INSTALL_USER_SERVICE` | `0` | 是否注册 systemd --user 自启服务 | → `$HOME/.config/systemd/user/plantai.service` | 可选 | 客户要求开机自启时设 `=1` |
**安全要求:**
- `install.env` 创建后执行 `chmod 600`
- **只写入真实密码**到 `install.env`,`install.env.example` 永远只含占位符
- `install.env` 包含客户凭证,禁止提交到代码仓库或分享
## 交付结构
```text
client/
bin/plantai_client.py # 客户端工具(采集指纹、TPM、解密)
bin/PlantAI-launcher # 启动器(解密代码运行资产到 tmpfs,启动三项目)
install_plantai.sh # 安装脚本(fingerprint / install / tpm2-setup)
install.env.example # ⬅ 客户据此创建 install.env(每客户不同)
phase_d_tpm.sh # 阶段 D:TPM 初始化 + 指纹采集(硬件)
phase_d_swtpm_test.sh # 软件 TPM 测试版本
README.md # 本文件
release/ ⬅ 解压供应商发行包到这里
VERSION
app/PlantAI_compiled/
app/RAG/
app/QA/
app/start_all.sh
DELIVERY_MANIFEST.json
assets/runtime-assets.enc
assets/runtime-assets.manifest.json
config/supplier_public_key.pem
```
另随包交付 `plantai-rag-runtime-data-<VERSION>.tar` 及对应 `.sha256`,其中包含
Qdrant、Neo4j 数据卷、BGE reranker 和本地 Ollama 模型
`bge-m3:567m`、`qwen2.5:14b-instruct`。数据库卷不放入 `/dev/shm`,避免约
70GB 持久数据占满内存文件系统。
> `install.env`(含真实密码)由客户在部署时根据 `install.env.example` 创建,不包含在初始交付包中。
## 每客户修改指南(交付前必做)
`install.env.example` → `install.env` 按上方表格填写即可,此处只列 README 中需要客户化的文本:
| 位置 | 当前内容 | 改为 |
|------|----------|------|
| 准备配置 | `tar -C release -xzf plantai-rag-release-1.0.0.tar.gz` | 版本号改为本次实际版本 |
| 导入授权 | `PROVISION_BUNDLE=/path/to/plantai-provision-DEVICE.tar.gz` | `DEVICE` 替换为 `install.env` 中 `DEVICE_ID` |
| 正式启动 | `PLANTAI_ROOT=/opt/PlantAI` | 改为 `install.env` 中 `PLANTAI_ROOT` 值 |
| 外部服务 | `ollama pull qwen3:0.6b` | 模型版本按本次实际版本改 |
另在 README 末尾追加客户档案:
```markdown
## 本次交付记录
- **客户名称**:
- **DEVICE_ID**:
- **发行包版本**:
- **交付日期**:
- **供应商负责人**:
```
### 交付前 checklist
- [ ] `client/` 中删除了 `install.env`(只留 `.example`)
- [ ] `client/` 中删除了 `package_client.sh`
- [ ] `install.env.example` 中无真实密码
- [ ] 发行包 `plantai-rag-release-<VERSION>.tar.gz` 已单独发给客户
## 1. 准备配置与发行包
```bash
cp install.env.example install.env
chmod 600 install.env
mkdir -p release
tar -C release -xzf plantai-rag-release-1.0.0.tar.gz
sha256sum -c release/SHA256SUMS
```
在 `install.env` 设置安装路径、Python 解释器以及 Neo4j/Qdrant/Ollama 变量。真实密码不要写入 `install.env.example`。
## 2. TPM 2.0 初始化(每台目标机只做一次)
推荐直接执行阶段 D 一键脚本:
```bash
./phase_d_tpm.sh
```
它会依次检查 TPM、复用或创建 TPM 密钥、采集指纹,并拒绝缺少 TPM 公钥/attestation 的弱指纹。
下面是等价的手工命令,仅用于排错:
```bash
ls -l /dev/tpmrm0 /dev/tpm0
tpm2_getrandom 8
./install_plantai.sh tpm2-setup
```
不要删除 `$PLANTAI_ROOT/config/tpm/`,也不要反复运行初始化。更换 TPM/主板或删除持久化 TPM key 后,旧授权将无法解封。
## 3. 采集指纹并交给供应商
### 无真实 TPM 时的软件测试入口
```bash
./phase_d_swtpm_test.sh
```
该入口会使用端口 2321/2322 的 swtpm,自动运行阶段 D,并在指纹中写入 `test_only_swtpm=true`。它只能验证流程,不能提供硬件级保护。阶段 E 测试签发必须显式设置 `ALLOW_SOFTWARE_TPM_TEST=1`。
```bash
./install_plantai.sh fingerprint
```
将 `$PLANTAI_ROOT/config/device_fingerprint.json` 发给供应商。生产授权必须包含 `tpm_public_key` 和 `attestation`;只有普通 DMI/磁盘信息的指纹不能提供 TPM 硬件绑定。
## 4. 导入授权并安装
```bash
PROVISION_BUNDLE=/path/to/plantai-provision-DEVICE.tar.gz ./install_plantai.sh install
```
校验并展开随包交付的持久化运行数据:
```bash
sha256sum -c plantai-rag-runtime-data-1.0.0.tar.sha256
mkdir -p "${PLANTAI_ROOT:-/opt/PlantAI}/data"
tar -C "${PLANTAI_ROOT:-/opt/PlantAI}/data" \
-xf plantai-rag-runtime-data-1.0.0.tar
```
安装结束会执行 `PlantAI-launcher --check-only`:验证许可证签名、硬件匹配、TPM 解封、资产清单和 AES-GCM 解密。任何一步失败都不应启动服务。
正式启动:
```bash
PLANTAI_ROOT=/opt/PlantAI /opt/PlantAI/bin/PlantAI-launcher
```
启动器默认把加密的 PlantAI/RAG `models/prompts` 解密到 `/dev/shm`;QA 的
Qdrant、Neo4j 与大模型保留在 `$PLANTAI_ROOT/data/runtime-assets`。客户启动
脚本会依次检查/启动 Qdrant、Neo4j、独立端口的本地 Ollama、QA、RAG、
PlantAI。不要设置 `PLANTAI_PERSIST_RUNTIME=1`,除非明确接受代码运行资产明文落盘风险。
## 5. 依赖与端口
客户机需预装 Docker 与 Ollama。启动脚本会使用交付数据自动拉起依赖,无需
联网拉取模型。默认端口如下:
```bash
curl -fsS http://127.0.0.1:16333/collections # Qdrant
curl -fsS http://127.0.0.1:17474 # Neo4j HTTP
curl -fsS http://127.0.0.1:11435/api/tags # 交付专用 Ollama
curl -fsS http://127.0.0.1:7925/api/v1/qa-v1-1-73/health
curl -fsS http://127.0.0.1:7900/health
curl -fsS http://127.0.0.1:7880/
```
## 安全边界
- `.so` 是逆向加固,不是密码学加密。
- TPM 保护的是解封 `K_master` 的能力;私钥从不离开 TPM。
- 许可证和 `asset.key.enc` 通过 SHA-256 绑定,不能跨设备混用。
- 客户端没有生成供应商密钥、自签许可证或重新加密资产的命令。
- 供应商的 `plantai_server_package`、私钥、口令文件、`master_keys/` 永不进入 client。