diff --git a/docs/done/production-deploy.md b/docs/done/production-deploy.md index eff1bec..e0df8b3 100644 --- a/docs/done/production-deploy.md +++ b/docs/done/production-deploy.md @@ -28,7 +28,39 @@ - `curl http://127.0.0.1:3011/api/health` 应返回 200 - `docker logs --tail 40 lemonboss` 确认启动日志无异常(正常应看到 `✅ 服务启动: http://0.0.0.0:3010` 等心跳/看门狗初始化行) +## ⚠️ 环境变量是固化在容器里的,改 `.env` + `docker restart` 不会生效 + +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` 值。 + +**要真正改这类模型/密钥配置,必须重建容器**(`docker restart` 无效): + +```bash +# 1. 保留旧容器做回滚,不要直接删 +TS=$(date +%Y%m%d%H%M%S) +docker rename lemonboss lemonboss-old-$TS +docker stop lemonboss-old-$TS + +# 2. 用完全相同的镜像/端口/挂载/重启策略/JWT_SECRET 重建,只改要换的那几个 -e +docker run -d --name lemonboss \ + --restart unless-stopped \ + --user 1000:1000 \ + -p 127.0.0.1:3011:3010 \ + -v /opt/lemonboss:/app \ + -v /opt/data:/data \ + -e NODE_ENV=production -e PORT=3010 -e HOST=0.0.0.0 \ + -e CORS_ORIGIN=https://lemonboss.wudaima.com \ + -e JWT_SECRET=<原样抄一份,改错会让所有已登录用户掉线> \ + -e ANTHROPIC_BASE_URL=... -e ANTHROPIC_API_KEY=... -e ANTHROPIC_MODEL=... \ + lemonboss-base:latest + +# 3. 验证:health 200 + docker exec 进去看 /proc//environ 确认新值生效 + 跑一次真实 invoke +``` + +完整现有配置可以先 `docker inspect lemonboss > backup.json` 存一份再动手,照抄里面的 `Env`/`Mounts`/`HostConfig.PortBindings`/`Config.User` 等字段,一个都不能漏,尤其是 `JWT_SECRET`。 + +**当前模型配置**(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`)。 + ## 其他线索 -- `/opt/lemonboss/.env` 里的 `OPEN_API_KEYS` 是 `/api/open/*` 外部调用的鉴权 key,本文档不记录明文值。 +- `/opt/lemonboss/.env` 里的 `OPEN_API_KEYS` 是 `/api/open/*` 外部调用的鉴权 key,本文档不记录明文值。**注意**:`.env` 文件本身对 `ANTHROPIC_*` 这三个变量是摆设(见上),但 `OPEN_API_KEYS` 等其他没有被 `docker run -e` 固化的变量,还是照常从 `.env` 里读取生效的——只有被固化过的那几个例外。 - `/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/`)。