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

174 lines
5.1 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.

# 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 配置
- 离线/内网镜像源配置