#!/usr/bin/env bash # # 把 AgentMail Gateway 与 opencode serve 安装为 systemd 服务。 # # sudo ./deploy/install.sh # # 幂等:重复执行等价于「重新构建 + 重启」。已存在的 env 文件不会被覆盖, # 因为里面有管理员密码与 Agent secret,重装不该把它们冲掉。 set -euo pipefail REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" PREFIX=/opt/agentmail ETC=/etc/agentmail [[ $EUID -eq 0 ]] || { echo "需要 root:sudo $0" >&2; exit 1; } echo "==> 构建前端" ( cd "$REPO/web" && npm ci --no-audit --no-fund 2>/dev/null || npm install --no-audit --no-fund ) ( cd "$REPO/web" && npm run typecheck && npm test && npm run build ) echo "==> 前端产物嵌入 Gateway" rm -rf "$REPO/gateway/internal/static/static" cp -r "$REPO/web/dist" "$REPO/gateway/internal/static/static" echo "==> 构建 Gateway(单二进制,内含前端 + SQLite)" # 先删再建:go build -o 到已存在的路径时可能拿到 stale 二进制(此坑中过多次) rm -f "$REPO/gateway/agentmail-gateway" ( cd "$REPO/gateway" && go vet ./... && go test ./... && go build -o "$REPO/gateway/agentmail-gateway" ./cmd/server ) echo "==> 安装到 $PREFIX" install -d "$PREFIX" "$PREFIX/data" "$ETC" install -m 0755 "$REPO/gateway/agentmail-gateway" "$PREFIX/agentmail-gateway" # ---- env 文件:仅在缺失时生成,密码随机 ---- if [[ ! -f "$ETC/gateway.env" ]]; then ADMIN_PASS="$(head -c 18 /dev/urandom | base64 | tr -d '/+=' | head -c 20)" cat > "$ETC/gateway.env" < "$ETC/opencode.env" <