diff --git a/deploy/update.sh b/deploy/update.sh index 0c786d9..46914db 100755 --- a/deploy/update.sh +++ b/deploy/update.sh @@ -15,7 +15,7 @@ # 一次性 bootstrap(useradd / 写 systemd unit / enable)不在这里 —— 见 RUN.md §部署 一次性。 # # 可调 env(不传则用默认 / Dockerfile 默认): -# APP_DIR(默认=脚本上级目录,即仓库根) APP_USER(zcbot) SERVICE(zcbot) PORT(8765) +# APP_DIR(默认=脚本上级目录,即仓库根) APP_USER(默认=部署目录属主) SERVICE(zcbot) PORT(8765) # APT_MIRROR / PIP_INDEX_URL / PIP_TRUSTED_HOST / NPM_REGISTRY 镜像源, # 默认阿里源(境内快);要稳定命中 docker cache 就别在两组源之间来回换 # (换源会从 pip 层炸开全重跑)。想用官方源:PIP_INDEX_URL= sudo -E bash ...(置空) @@ -28,7 +28,9 @@ set -euo pipefail # / 经软链调用(Ubuntu coreutils 有 readlink -f)。 SCRIPT_DIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" APP_DIR="${APP_DIR:-$(dirname "$SCRIPT_DIR")}" -APP_USER="${APP_USER:-zcbot}" +# 服务用户默认 = 部署目录属主(bootstrap 时 chown zcbot:zcbot /opt/zcbot,属主即服务用户), +# 不写死;可 env 覆盖。推成 root 见下方前置检查 warn。 +APP_USER="${APP_USER:-$(stat -c %U "$APP_DIR")}" SERVICE="${SERVICE:-zcbot}" PORT="${PORT:-8765}" IMAGE="zcbot-sandbox:latest" @@ -52,6 +54,10 @@ asuser() { sudo -u "$APP_USER" "$@"; } [ -d "$APP_DIR/.git" ] || fail "$APP_DIR 不是 git 仓库(部署目录不对?)" [ -x "$PY" ] || fail "找不到 venv python:$PY" [ -f "$APP_DIR/.env" ] || fail "缺 $APP_DIR/.env(ZCBOT_DB_URL 等)" +# 服务用户落到 root 八成是部署目录属主不对(systemd 服务 / 沙箱不该跑 root, +# HOST_UID 还要跟 bind mount 属主对齐);提醒但不强制中止 +[ "$APP_USER" = "root" ] && log "WARN: APP_USER 推导为 root(部署目录属主是 root?)── 确认服务确实以 root 跑;否则 APP_USER=zcbot sudo -E bash $0" +id "$APP_USER" >/dev/null 2>&1 || fail "服务用户不存在:$APP_USER(检查部署目录属主 / 显式设 APP_USER)" # 工作区脏(仅看已跟踪文件;.venv/.env/workspace 都 gitignore,不算)→ 中止, # 避免 ff-only 失败或把本地手改卷进部署