Commit 4689608b390c5dfb12c361919e4f0eadc57c7ca5

Authored by yibo
1 parent 5fe74b39

docs: 记录生产部署环境与上线流程

服务器地址、/opt/lemonboss 部署拓扑(docker 容器 lemonboss、bind mount)、
git pull + docker restart 的具体上线步骤,来自实地登录核查,避免下次重复问。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
docs/README.md
@@ -21,6 +21,7 @@ @@ -21,6 +21,7 @@
21 | [claude-code-cron.md](./done/claude-code-cron.md) | Claude Code 原生 Cron 调度功能参考手册 | 21 | [claude-code-cron.md](./done/claude-code-cron.md) | Claude Code 原生 Cron 调度功能参考手册 |
22 | [claude-cli-session-leak.md](./done/claude-cli-session-leak.md) | **常驻 CLI 子进程泄漏排查手册** — ✅ 已修复(`b0b2b62` + `2092a2e`):系统里有**两个互不相干的会话池**(`routes/agent-chat.js` 的 `sessions` / `src/core/session-pool.js`),各漏各的。含按 cwd 判断孤儿归属的方法、变异检验为什么必要、三步定位脚本,以及 `DISABLE_BACKGROUND_AGENTS=1` —— 跑全量测试前关掉后台驱动的开关 | 22 | [claude-cli-session-leak.md](./done/claude-cli-session-leak.md) | **常驻 CLI 子进程泄漏排查手册** — ✅ 已修复(`b0b2b62` + `2092a2e`):系统里有**两个互不相干的会话池**(`routes/agent-chat.js` 的 `sessions` / `src/core/session-pool.js`),各漏各的。含按 cwd 判断孤儿归属的方法、变异检验为什么必要、三步定位脚本,以及 `DISABLE_BACKGROUND_AGENTS=1` —— 跑全量测试前关掉后台驱动的开关 |
23 | [open-api-manual.md](./done/open-api-manual.md) | ArenaSK Open API 外部调用手册 | 23 | [open-api-manual.md](./done/open-api-manual.md) | ArenaSK Open API 外部调用手册 |
  24 +| [production-deploy.md](./done/production-deploy.md) | 生产部署环境与上线流程 — 服务器地址、`/opt/lemonboss` 部署拓扑、Docker 容器、git pull + 重启的具体步骤 |
24 | [qa_judge_req.md](./done/qa_judge_req.md) | QA Judge Agent 需求文档 — 已在 `system/agents/qa-judge/` 落地 | 25 | [qa_judge_req.md](./done/qa_judge_req.md) | QA Judge Agent 需求文档 — 已在 `system/agents/qa-judge/` 落地 |
25 | [task_timeline_design.md](./done/task_timeline_design.md) | Task Timeline View 设计文档 — 已实现(`server/routes/tasks.js`、`server/services/task-service.js`、`web/src/views/TaskTimeline.vue`) | 26 | [task_timeline_design.md](./done/task_timeline_design.md) | Task Timeline View 设计文档 — 已实现(`server/routes/tasks.js`、`server/services/task-service.js`、`web/src/views/TaskTimeline.vue`) |
26 | [user-guides/08-base-agent-4-phase-guide.md](./done/user-guides/08-base-agent-4-phase-guide.md) | Base Agent 四阶段使用指南 | 27 | [user-guides/08-base-agent-4-phase-guide.md](./done/user-guides/08-base-agent-4-phase-guide.md) | Base Agent 四阶段使用指南 |
docs/done/production-deploy.md 0 → 100644
  1 +# 生产部署环境与上线流程
  2 +
  3 +> 状态:✅ 当前有效。2026-08-27 首次整理,来源于登录服务器实地核查(非猜测)。
  4 +
  5 +## 服务器
  6 +
  7 +- 地址:`root@60.205.214.169`(hostname `hexyun`)。本机已配好免密 SSH,直接 `ssh root@60.205.214.169` 即可,不需要额外问用户要密码/密钥。
  8 +- 对外域名 `lemonboss.wudaima.com` 由这台机器提供服务。
  9 +- 同一台机器上还跑着大量不相关的容器(wordpress、milvus、rasa、chroma 等),`docker` 相关命令务必认准容器名 `lemonboss`,不要用 `docker restart` 之类命令波及别的服务。
  10 +
  11 +## 部署拓扑
  12 +
  13 +- **代码目录**(host 侧):`/opt/lemonboss`,属主 `hexyun:hexyun`。是一个独立 git 仓库,`origin` 与本地仓库一致,指向 `git@gitlab-wuwei.hexpm.com:yibo/lemonboss.git`,跟踪分支 `main`。
  14 +- **运行方式**:Docker 容器 `lemonboss`(镜像 `lemonboss-base:latest`),重启策略 `unless-stopped`。
  15 + - `/opt/lemonboss` bind-mount 到容器内 `/app`
  16 + - `/opt/data` bind-mount 到容器内 `/data`
  17 + - entrypoint:`docker-entrypoint.sh` → `node server/index.js`
  18 +- **端口**:容器内 3010 → 宿主机 `127.0.0.1:3011`(对外走反向代理到 `lemonboss.wudaima.com`,代理具体配置未查)。
  19 +
  20 +## 更新上线流程
  21 +
  22 +1. 本地正常提交,`git push origin main`。
  23 +2. 登录服务器:`ssh root@60.205.214.169`,`cd /opt/lemonboss && git pull origin main`。
  24 + - **必须用 `root` 拉代码**:目录属主虽是 `hexyun`,但只有 `root` 配了到 `gitlab-wuwei.hexpm.com` 的部署 SSH key;`hexyun` 没配任何 key,`sudo -u hexyun git pull` 会直接因 host key / 鉴权失败报错。
  25 + - `git pull` 完成后,把本次改动涉及的文件 `chown hexyun:hexyun` 改回属主(`git pull` 用 root 跑,新拉下来的文件会变成 `root:root`),避免以后应用进程(跑在 `hexyun` 身份下)对这些文件失去写权限。整个目录不建议全量 `chown -R`(node_modules 体量大且没必要)。
  26 +3. `docker restart lemonboss` 让新代码生效——bind mount 是实时的,但 Node 进程不会自动热重载,必须重启容器内进程。
  27 +4. 验证:
  28 + - `curl http://127.0.0.1:3011/api/health` 应返回 200
  29 + - `docker logs --tail 40 lemonboss` 确认启动日志无异常(正常应看到 `✅ 服务启动: http://0.0.0.0:3010` 等心跳/看门狗初始化行)
  30 +
  31 +## 其他线索
  32 +
  33 +- `/opt/lemonboss/.env` 里的 `OPEN_API_KEYS` 是 `/api/open/*` 外部调用的鉴权 key,本文档不记录明文值。
  34 +- `/opt/lemonboss/.data/jobs-openapi.json` 是 open-api invoke 端点(`server/routes/open-api.js`)的 job 记录,容器重启时会从这个文件恢复历史 job(日志里 `[JobManager] Restored N jobs` 就是这个)——这是 job 记录,不是会话历史,二者存储位置不同(会话历史见 `system/agents/{agentId}/{companyId|_global}/conversations/`)。