# moziplus v2 运维脚本设计

**版本**: 3.0.0
**作者**: 庞统（副军师）🐦
**日期**: 2026-05-22
**基于**: deployment-v2.6.md + deployment-v2.6-guide.md（更新版）

---

## 1. 概述

moziplus v2 提供一套运维脚本，覆盖部署、状态查看、数据管理、备份和卸载的全生命周期。

### 脚本清单

| 脚本 | 用途 | 风险等级 |
|------|------|---------|
| `deploy.sh` | 部署/升级 | 低（不覆盖 data/config） |
| `status.sh` | 运行状态查看 | 无（只读） |
| `build-frontend.sh` | 构建前端 | 无 |
| `backup.sh` | 备份数据到 NAS | 无 |
| `reset-data.sh` | 清空运行数据 | 高（删数据） |
| `uninstall.sh` | 完全卸载 | 高（删目录） |

### 目录约定

```
开发目录:  ~/.openclaw/sanguo_projects/sanguo_moziplus_v2/   ← Git 仓库
安装目录:  ~/.sanguo_projects/sanguo_moziplus_v2/             ← PM2 运行
脚本位置:  开发目录/scripts/
```

---

## 2. 环境要求

| 依赖 | 版本 | 用途 |
|------|------|------|
| Python | ≥ 3.9 | 后端运行 |
| Node.js | ≥ 20 | 前端构建 |
| PM2 | ≥ 5.0 | 进程管理 |
| rsync | 任意 | 代码同步 |
| curl | 任意 | 健康检查 |
| sqlite3 | 任意 | 数据查询（status -v） |
| NAS SMB | — | 备份目标（backup.sh） |

---

## 3. 场景手册

### 场景 1：首次部署

**触发**：新机器上第一次安装 moziplus v2

```bash
# 从开发目录部署
cd ~/.openclaw/sanguo_projects/sanguo_moziplus_v2
bash scripts/deploy.sh

# 自定义安装目录
bash scripts/deploy.sh --target=/path/to/install

# 跳过前端构建（已有 dist/）
bash scripts/deploy.sh --skip-build
```

**deploy.sh 执行流程**：
1. 前置检查（Python/PM2/源码目录）
2. 前端构建（npm install → npm run build）
3. 创建安装目录
4. rsync 同步代码（排除 data/logs/inbox/config/docs/tests）
5. 确保目录结构（data/logs/inbox/config）
6. 首次创建默认配置（不覆盖已有）
7. PM2 start（首次）
8. 前端 + 后端健康检查
9. 输出结果

**排除项**（不部署到生产）：
- `docs/` — 设计文档只存开发目录
- `tests/` — 测试代码不需要在生产环境
- `scripts/` — 脚本从开发目录执行
- `config/` — 不覆盖用户配置
- `data/` `logs/` `inbox/` — 运行时数据
- `frontend/src/` `node_modules/` — 只需要 dist/

### 场景 2：日常升级（代码更新后）

**触发**：开发目录有代码变更，需要更新生产环境

```bash
# 标准升级（自动构建前端 + 重启）
cd ~/.openclaw/sanguo_projects/sanguo_moziplus_v2
bash scripts/deploy.sh

# 仅后端改动，跳过前端构建
bash scripts/deploy.sh --skip-build
```

**deploy.sh 自动检测**：
- 安装目录已存在 → PM2 restart（而非 start）
- 不覆盖 `config/` 和 `data/`
- 健康检查确认服务正常

### 场景 3：查看运行状态

```bash
# 简要状态
bash scripts/status.sh

# 详细状态（项目列表、任务数、磁盘占用）
bash scripts/status.sh -v
```

**输出示例**：
```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  moziplus v2 — Status
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  Version:   v3.0.0
  Install:   ~/.sanguo_projects/sanguo_moziplus_v2 ✅
  PM2:       online ✅
  PID:       19591
  Restarts:  18
  Memory:    49.6MB
  Health:    running ✅
  Ticks:     106
  Projects:  26
  Data size: 23M
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```

### 场景 4：前端独立构建

**触发**：只改了前端代码，不需要完整部署

```bash
bash scripts/build-frontend.sh
# 产物在 src/frontend/dist/
# 然后用 deploy.sh --skip-build 同步
```

### 场景 5：数据备份

```bash
# 在线备份（不停服务，SQLite 可能有不一致快照，日常可接受）
bash scripts/backup.sh

# 一致性备份（停服务）
bash scripts/backup.sh --stop

# 指定 NAS 路径
bash scripts/backup.sh --nas=/Volumes/stock
```

**备份策略**：
- 目标：NAS `/Volumes/stock/moziplus-v2-backups/backup-<timestamp>/`
- 内容：data/ + config/ + metadata.json
- 自动保留最近 10 个备份
- metadata.json 记录时间、版本、是否停服务

### 场景 6：数据重置

**触发**：测试数据污染、需要干净环境

```bash
# 预览（不加 --confirm 只显示会做什么）
bash scripts/reset-data.sh

# 清空所有数据
bash scripts/reset-data.sh --confirm

# 只清指定项目
bash scripts/reset-data.sh --project=demo --confirm
bash scripts/reset-data.sh --project=demo,e2e-test --confirm
```

**安全保护**：
- 必须传 `--confirm`，否则只预览不执行
- 停服务 → 清数据 → 重启
- trap EXIT 确保异常时也恢复服务
- 保留 config/ 配置

### 场景 7：完全卸载

**触发**：不再使用 moziplus v2

```bash
# 预览
bash scripts/uninstall.sh

# 完全删除（含数据）
bash scripts/uninstall.sh --confirm

# 保留数据
bash scripts/uninstall.sh --confirm --keep-data
```

**安全保护**：
- 必须传 `--confirm`
- `--keep-data` 将 data/ 移动到 `~/moziplus-v2-data-backup-<timestamp>/`
- PM2 delete + save

---

## 4. 典型工作流

### 日常开发 → 部署循环

```
开发目录修改代码
    ↓
git commit（sanguo-git-sync 自动推送到 gitee）
    ↓
bash scripts/deploy.sh
    ↓
bash scripts/status.sh（确认正常）
    ↓
继续开发 或 测试验证
```

### 版本发布

```
1. 开发目录完成功能 + 测试
2. 司马评审通过
3. 更新 pyproject.toml 版本号
4. git tag + git push
5. bash scripts/deploy.sh
6. bash scripts/backup.sh --stop（发布前备份）
7. bash scripts/status.sh -v（确认）
```

### 故障恢复

```
1. bash scripts/status.sh（确认问题）
2. pm2 logs sanguo-moziplus-v2（查看日志）
3. 如需回滚数据：从 NAS 恢复备份
4. 如需回滚代码：git revert → bash scripts/deploy.sh
5. 如 v2 不可用：pm2 stop sanguo-moziplus-v2，切回 v1(8082)
```

---

## 5. 脚本参数速查

### deploy.sh
| 参数 | 默认值 | 说明 |
|------|--------|------|
| `--source=DIR` | 开发目录 | 源码目录 |
| `--target=DIR` | `~/.sanguo_projects/sanguo_moziplus_v2` | 安装目标 |
| `--skip-build` | false | 跳过前端构建 |

### status.sh
| 参数 | 说明 |
|------|------|
| `-v, --verbose` | 显示项目详情、配置信息 |

### build-frontend.sh
无参数。自动检测 package-lock 变化并安装依赖。

### backup.sh
| 参数 | 默认值 | 说明 |
|------|--------|------|
| `--target=DIR` | 安装目录 | 数据源 |
| `--nas=DIR` | `/Volumes/stock` | NAS 挂载点 |
| `--stop` | false | 备份前停服务 |

### reset-data.sh
| 参数 | 默认值 | 说明 |
|------|--------|------|
| `--target=DIR` | 安装目录 | 目标 |
| `--project=NAME` | 全部 | 指定项目（逗号分隔） |
| `--confirm` | false | **必须传** |

### uninstall.sh
| 参数 | 默认值 | 说明 |
|------|--------|------|
| `--target=DIR` | 安装目录 | 目标 |
| `--keep-data` | false | 保留数据到备份目录 |
| `--confirm` | false | **必须传** |

---

## 6. 与旧部署文档的关系

本文档替代以下旧文档：
- `deployment-v2.6.md` §6 部署流程 → 改用 `deploy.sh`
- `deployment-v2.6-guide.md` 全文 → 改用脚本 + 本文档场景说明
- `deployment-v2.6.md` §13 运维场景手册 → 改用 `status.sh` + `backup.sh` + `reset-data.sh`

旧文档保留作为架构参考，不删除。
