# 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-/` - 内容: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-/` - 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` 旧文档保留作为架构参考,不删除。