Files
siemens_ragas/docs/superpowers/specs/2026-06-22-linux-deploy-design.md

174 lines
5.1 KiB
Markdown
Raw Normal View History

# Linux 一键部署脚本设计
**日期**: 2026-06-22
**状态**: 已批准,待实现
**范围**: 为 siemens_ragas 项目提供 Linux 环境的部署与运维脚本(无 Docker无 systemd
---
## 1. 目标
提供四个 Bash 脚本,覆盖 Linux 服务器上的完整生命周期:
| 脚本 | 职责 |
|------|------|
| `deploy.sh` | 一键完成环境检查、依赖安装、配置初始化、启动服务 |
| `start.sh` | 仅启动 Web 服务(已部署后复用,不重装依赖) |
| `stop.sh` | 停止后台 Web 服务 |
| `run_eval.sh` | 运行单次评估(对应 Windows 的 `run_eval.ps1` |
---
## 2. 约束与假设
- Linux 目标环境有 PyPI 网络访问pip 可直接安装)
- 代码已通过 `git clone` 或文件拷贝到服务器
- 使用 `pip + venv`(不使用 uv
- Web 服务监听 `0.0.0.0:8800`(内网可达)
- 后台运行使用 `nohup`PID 写入 `.server.pid`,日志追加到 `logs/server.log`
- 所有脚本均放在仓库根目录,路径相对于 `$SCRIPT_DIR`
---
## 3. `deploy.sh` 详细设计
### 3.1 阶段 1Python 版本检查
```
require Python >= 3.12
```
- `python3 --version` 解析 major.minor
- 不满足则打印错误并 `exit 1`
- 满足则打印 `[OK] Python X.Y.Z`
### 3.2 阶段 2虚拟环境
- 目标路径:`$SCRIPT_DIR/.venv`
- 已存在则跳过创建(打印 `[OK] .venv already exists`
- 不存在则 `python3 -m venv .venv`
### 3.3 阶段 3依赖安装
```bash
.venv/bin/pip install --upgrade pip -q
.venv/bin/pip install -e . -q # 安装 pyproject.toml 中的依赖
.venv/bin/pip install fastapi uvicorn httpx -q # Web 服务额外依赖
```
- 失败则打印错误并 `exit 1`
- `fastapi``uvicorn``httpx``pyproject.toml` 中未列,需单独安装
### 3.4 阶段 4配置文件
-`.env` 不存在:`cp .env.example .env`,打印警告提示用户编辑后再启动
-`.env` 已存在:跳过,打印 `[OK] .env found`
### 3.5 阶段 5目录初始化
创建以下目录(`mkdir -p`,幂等):
- `configs/` — LLM Profile 持久化存储
- `logs/` — 评估日志 + 服务器日志
- `outputs/` — 评估运行产物
- `datasets/` — 原始数据集
### 3.6 阶段 6Demo 数据
- 检查 `outputs/kba-knowledge-base-offline-baseline/` 是否存在
- 不存在则运行 `.venv/bin/python scripts/seed_sample_run.py`
- 失败时打印 `[WARN]`(非致命,报告页为空但服务可启动)
### 3.7 阶段 7端口检测
- 默认端口 `8800`
-`ss -tlnp``netstat -tlnp` 检查是否占用
- 占用则尝试 `8801`,仍占用则报错退出
### 3.8 阶段 8启动服务
```bash
nohup .venv/bin/python webmain.py \
--host 0.0.0.0 \
--port $PORT \
>> logs/server.log 2>&1 &
echo $! > .server.pid
```
- 等待 2 秒后用 `kill -0 $PID` 检测进程是否存活
- 存活则打印 URL 和 stop 方法
- 未存活则打印 `[ERROR] Server failed to start. Check logs/server.log.``exit 1`
---
## 4. `start.sh` 详细设计
单独负责启动,不做任何环境初始化。
```bash
#!/usr/bin/env bash
# 检查 .venv 存在
# 端口检测(同 deploy.sh 逻辑)
# 检查 .env 存在(不存在则 warn 但不阻止)
# nohup 启动 + PID 文件 + 存活验证
# 打印 URL
```
---
## 5. `stop.sh` 详细设计
```bash
#!/usr/bin/env bash
# 读取 .server.pid
# 若文件不存在:打印 "No server PID file found." 退出
# kill $PID
# 等待 2 秒,若进程仍存活用 kill -9
# 删除 .server.pid
# 打印 "Server stopped."
```
---
## 6. `run_eval.sh` 详细设计
对应 Windows 的 `run_eval.ps1`
```
用法:
./run_eval.sh # online eval (默认)
./run_eval.sh offline # offline smoke
./run_eval.sh scenarios/xxx.yaml # 自定义场景
./run_eval.sh online DEBUG # 自定义日志级别
```
- 参数 1Scenario`online` / `offline` / 文件路径,默认 `online`
- 参数 2LogLevel`DEBUG` / `INFO` / `WARNING` / `ERROR`,默认 `INFO`
- 场景别名映射:
- `online``scenarios/online/siemens-pdf-question-bank-online.yaml`
- `offline``scenarios/offline/siemens-pdf-offline-smoke.yaml`
- 时间戳日志文件:`logs/eval_$(date +%Y-%m-%d_%H%M%S).log`
- 环境变量:`PYTHONIOENCODING=utf-8 PYTHONPATH=.`
- 调用:`.venv/bin/python main.py --scenario $SCENARIO --log-file $LOG_FILE --log-level $LOG_LEVEL`
- 非零退出码时打印错误并 `exit 1`
---
## 7. 通用约定
- 所有脚本首行:`#!/usr/bin/env bash`
- `set -euo pipefail` — 错误立即退出,未定义变量报错,管道错误传播
- `SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"` — 从任意目录执行均正确
- `cd "$SCRIPT_DIR"` — 切换到仓库根目录
- 颜色输出:绿色 `[OK]`、黄色 `[WARN]`、红色 `[ERROR]`(检测 tty非交互式终端降级为无色
- 执行权限:脚本自身需要 `chmod +x`(在 deploy.sh 内对其他脚本自动 chmod
---
## 8. 不在范围内
- Docker / docker-compose 支持
- systemd service 配置
- Nginx 反向代理配置
- SSL/TLS 配置
- 离线/内网镜像源配置