From 56b9028579af5f65d988a57f1c60d610f1f72d68 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Mon, 14 Sep 2026 20:27:26 +0800 Subject: [PATCH] =?UTF-8?q?fix(deploy):=20=E4=B8=89=E4=B8=AA=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E7=BB=9F=E4=B8=80=20AGENTMAIL=5FPREFIX=20+=20go=20?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E9=A2=84=E6=A3=80=EF=BC=88=E5=88=AB=E6=8A=8A?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E9=97=AE=E9=A2=98=E6=8A=A5=E6=88=90=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=97=AE=E9=A2=98=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pi 的 G 项,两处都实测确认: 1. **`PREFIX` 三套写法**:`redeploy-gateway.sh` 与 `reset-demo.sh` 都是 `${AGENTMAIL_PREFIX:-/opt/agentmail}`,只有 `install.sh` 写死 `/opt/agentmail` ⇒ 谁设了那个变量,install 装到 A、redeploy 看 B、drift-check 看 C。 实际不止一处:`install.sh` 里另有 3 处**绕过自己的 `$PREFIX`** 硬编码 (`agent-config`、`pi-config`、`bin/` 的 install),`redeploy-gateway.sh` 里也有 2 处 (它自己有 `$PREFIX` 却绕过)。全部收回 `$PREFIX`;`install.sh` 改为尊重 `${AGENTMAIL_PREFIX:-/opt/agentmail}`。`install.sh` 里 `/opt/agentmail` 现在只剩 注释与默认值两处。 ⚠️ `check-deploy-drift.mjs` 仍是硬编码——**没有改**:它是独立工具、不 source 任何脚本, 要它认前缀得先定义"配置从哪来",那是设计题不是一行改动。(已在此留档。) 2. **`--check` 相位新增的 go 门禁会产出误导信号**:我实测(沙箱里没有 `HOME`/`GOPATH`) 它报 `go: module cache not found: neither GOMODCACHE nor GOPATH is set`, 然后被我说成"go vet / go test 不过 —— **先修好再安装**" —— **把环境问题报成代码问题**,而那正好诱导人去 sudo 建目录 (GOPATH 会落到 `${GOPATH:-$HOME/go}/pkg/mod`)。 加一句预检:`go env GOMODCACHE` 为空 ⇒ 明说"环境不足"并 **exit 2**(环境约定), 不再冒充代码缺陷。实测:沙箱里现在报"环境不足…药方:带上有 HOME 的环境重跑"、退出码 2; 带上 `HOME=/root` 后 `go vet` + `go test` **通过**(退出码 0)。 --- deploy/install.sh | 25 ++++++++++++++++++++----- deploy/redeploy-gateway.sh | 4 ++-- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/deploy/install.sh b/deploy/install.sh index 88027dd..46223e3 100755 --- a/deploy/install.sh +++ b/deploy/install.sh @@ -9,7 +9,10 @@ set -euo pipefail REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -PREFIX=/opt/agentmail +# 与 `redeploy-gateway.sh` / `reset-demo.sh` 同源(pi 评审 2026-09-14 对出来的): +# 那两处都写 `${AGENTMAIL_PREFIX:-/opt/agentmail}`,只有这里写死 —— +# 谁设了那个变量,install 装到 A、redeploy 和 drift-check 看 B,三个工具各说各话。 +PREFIX="${AGENTMAIL_PREFIX:-/opt/agentmail}" ETC=/etc/agentmail # @@ -185,6 +188,18 @@ if [[ $CHECK_ONLY -eq 1 ]]; then # 而"第一个拿到 root 的人第一次跑门禁"正是 `--check` 要解决的场景。 # 它们不写系统目录(只写 go 缓存),所以放进这个相位没有副作用。 echo "==> 校验 Gateway 源码(go vet + go test)" + # ★ 先判"go 到底跑不跑得动",把**环境问题**与"代码不过"分开。 + # 实测(2026-09-14,我在沙箱里跑这一步时):没有 HOME/GOPATH 的环境下 + # `go vet` 直接报 `go: module cache not found: neither GOMODCACHE nor GOPATH is set`, + # 于是这句话会说成"go vet / go test 不过 —— 先修好再安装" —— **把环境问题报成代码问题**, + # 而那正好诱导人去 sudo 建目录(GOPATH 落到 `${GOPATH:-$HOME/go}/pkg/mod`)。 + # `go env GOMODCACHE` 在没有这两者时返回**空串**,一个既便宜又精确的信号。 + GOMODCACHE_DIR="$(go env GOMODCACHE 2>/dev/null || true)" + if [ -z "$GOMODCACHE_DIR" ]; then + echo " [FAIL] 环境不足:\`go env GOMODCACHE\` 是空的(既没有 GOMODCACHE 也没有 GOPATH,通常是 HOME 没设)" >&2 + echo " 这是**环境问题**,不是代码问题。药方:带上有 HOME 的环境重跑(如 sudo 或 HOME=/root)" >&2 + exit 2 + fi if ! ( cd "$REPO/server" && go vet ./... && go test ./... ); then echo " [FAIL] go vet / go test 不过 —— 先修好再安装" >&2 exit 1 @@ -258,7 +273,7 @@ AGENTMAIL_AGENT_NAME=opencode # 拿着它到 Web 后台「Agent 密钥」登记即可接入(journalctl -u opencode-serve | grep mail-bridge)。 # 也可以先在后台签发密钥,再把它填在这里。 AGENTMAIL_AGENT_KEY= -AGENTMAIL_CONFIG_DIR=/opt/agentmail/agent-config +AGENTMAIL_CONFIG_DIR="$PREFIX/agent-config" # 处理来信时使用的模型 AGENTMAIL_REPLY_PROVIDER=llmsproxy @@ -284,7 +299,7 @@ AGENTMAIL_AGENT_NAME=pi # 接入密钥:留空时插件会在 \$AGENTMAIL_CONFIG_DIR/agent.key 本地生成一把并打印到日志, # 拿着它到 Web 后台「Agent 密钥」登记即可接入(journalctl -u pi-mail-bridge | grep 密钥)。 AGENTMAIL_AGENT_KEY= -AGENTMAIL_CONFIG_DIR=/opt/agentmail/pi-config +AGENTMAIL_CONFIG_DIR="$PREFIX/pi-config" # 处理来信时首选的模型。留空表示用 pi 自己的默认(~/.pi/agent/settings.json)。 # 管理员在后台划定模型范围时,范围优先于这里的设置(B-2.2)。 @@ -308,8 +323,8 @@ echo "==> 安装 systemd 单元" # 以前这里逐个 install 三个 .service,而 drop-in(失败通知/重启退避等)只存在于 # /etc 里 —— 于是"仓库里的是旧的、机器上的是新的",谁跑一次本脚本就把部署退回 # 源码目录(旧版 ExecStart 指向 /home/program/agentmail/plugins/...)。 -install -d /opt/agentmail/bin -install -m 0755 "$REPO/deploy/service-failure-notify.mjs" /opt/agentmail/bin/service-failure-notify.mjs +install -d "$PREFIX/bin" +install -m 0755 "$REPO/deploy/service-failure-notify.mjs" "$PREFIX/bin/service-failure-notify.mjs" while IFS= read -r f; do rel="${f#"$REPO/deploy/systemd/"}" install -D -m 0644 "$f" "/etc/systemd/system/$rel" diff --git a/deploy/redeploy-gateway.sh b/deploy/redeploy-gateway.sh index e029cf2..fbba8c1 100755 --- a/deploy/redeploy-gateway.sh +++ b/deploy/redeploy-gateway.sh @@ -116,8 +116,8 @@ fi # 后果是"改了仓库里的通知脚本、用 --skip-web 部署 ⇒ 生产还是旧的那份", # 而判据 ③ 只判"在不在、有没有执行位",不判**是哪一份** ⇒ 全绿。 # (已把 ③ 一并改成比内容。) -install -d /opt/agentmail/bin || { bad "建不了 /opt/agentmail/bin"; exit 2; } -if ! install -m 0755 "$REPO/deploy/service-failure-notify.mjs" /opt/agentmail/bin/service-failure-notify.mjs; then +install -d "$PREFIX/bin" || { bad "建不了 $PREFIX/bin"; exit 2; } +if ! install -m 0755 "$REPO/deploy/service-failure-notify.mjs" "$PREFIX/bin/service-failure-notify.mjs"; then bad "装不了故障通知脚本" exit 2 fi