Commit 78c24226170d9f13e10a21de33951a64d07fc045

Authored by yibo
1 parent 4689608b

docs: 补记「换模型/密钥必须重建容器」的坑 + 当前模型状态

ANTHROPIC_BASE_URL/API_KEY/MODEL 是 docker run -e 时固化进容器配置的,
改 .env + docker restart 不生效,必须重建容器;顺带记录当前已切到
智谱 GLM-5.3-Flash(此前是 DeepSeek deepseek-v4-flash)。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Showing 1 changed file with 33 additions and 1 deletions
docs/done/production-deploy.md
... ... @@ -28,7 +28,39 @@
28 28 - `curl http://127.0.0.1:3011/api/health` 应返回 200
29 29 - `docker logs --tail 40 lemonboss` 确认启动日志无异常(正常应看到 `✅ 服务启动: http://0.0.0.0:3010` 等心跳/看门狗初始化行)
30 30  
  31 +## ⚠️ 环境变量是固化在容器里的,改 `.env` + `docker restart` 不会生效
  32 +
  33 +2026-08-27 踩过一次坑:`ANTHROPIC_BASE_URL` / `ANTHROPIC_API_KEY` / `ANTHROPIC_MODEL`(决定 Claude CLI 实际打到哪个模型厂商)这几个变量,是当初 `docker run -e ...` 时**直接固化进容器配置**的(`docker inspect lemonboss --format '{{.Config.Env}}'` 能看到),跟 bind-mount 进去的 `/opt/lemonboss/.env` 文件是两码事——Node 进程虽然也会 `dotenv` 加载 `.env`,但容器注入的 env 已经先一步存在于 `process.env`,dotenv 默认不覆盖已存在的变量,所以改 `.env` 完全不生效,`docker restart` 只是重启同一个容器进程,也不会重新读取新的 `-e` 值。
  34 +
  35 +**要真正改这类模型/密钥配置,必须重建容器**(`docker restart` 无效):
  36 +
  37 +```bash
  38 +# 1. 保留旧容器做回滚,不要直接删
  39 +TS=$(date +%Y%m%d%H%M%S)
  40 +docker rename lemonboss lemonboss-old-$TS
  41 +docker stop lemonboss-old-$TS
  42 +
  43 +# 2. 用完全相同的镜像/端口/挂载/重启策略/JWT_SECRET 重建,只改要换的那几个 -e
  44 +docker run -d --name lemonboss \
  45 + --restart unless-stopped \
  46 + --user 1000:1000 \
  47 + -p 127.0.0.1:3011:3010 \
  48 + -v /opt/lemonboss:/app \
  49 + -v /opt/data:/data \
  50 + -e NODE_ENV=production -e PORT=3010 -e HOST=0.0.0.0 \
  51 + -e CORS_ORIGIN=https://lemonboss.wudaima.com \
  52 + -e JWT_SECRET=<原样抄一份,改错会让所有已登录用户掉线> \
  53 + -e ANTHROPIC_BASE_URL=... -e ANTHROPIC_API_KEY=... -e ANTHROPIC_MODEL=... \
  54 + lemonboss-base:latest
  55 +
  56 +# 3. 验证:health 200 + docker exec 进去看 /proc/<pid>/environ 确认新值生效 + 跑一次真实 invoke
  57 +```
  58 +
  59 +完整现有配置可以先 `docker inspect lemonboss > backup.json` 存一份再动手,照抄里面的 `Env`/`Mounts`/`HostConfig.PortBindings`/`Config.User` 等字段,一个都不能漏,尤其是 `JWT_SECRET`。
  60 +
  61 +**当前模型配置**(2026-08-27 起):智谱 GLM-5.3-Flash,`ANTHROPIC_BASE_URL=https://open.bigmodel.cn/api/anthropic`,`ANTHROPIC_MODEL=glm-5.3-flash`(此前是 DeepSeek `deepseek-v4-flash` + `https://api.deepseek.com/anthropic`)。
  62 +
31 63 ## 其他线索
32 64  
33   -- `/opt/lemonboss/.env` 里的 `OPEN_API_KEYS` 是 `/api/open/*` 外部调用的鉴权 key,本文档不记录明文值。
  65 +- `/opt/lemonboss/.env` 里的 `OPEN_API_KEYS` 是 `/api/open/*` 外部调用的鉴权 key,本文档不记录明文值。**注意**:`.env` 文件本身对 `ANTHROPIC_*` 这三个变量是摆设(见上),但 `OPEN_API_KEYS` 等其他没有被 `docker run -e` 固化的变量,还是照常从 `.env` 里读取生效的——只有被固化过的那几个例外。
34 66 - `/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/`)。
... ...