fix(deploy): APP_USER 默认取部署目录属主,不写死 zcbot

与 APP_DIR 同思路:服务用户默认 = 部署目录属主(bootstrap chown 后即服务
用户),仍可 env 覆盖。加两道前置:推成 root 时 warn(服务/沙箱不该跑 root,
HOST_UID 要对齐 bind mount 属主),用户不存在直接 fail。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
caoqianming 2026-06-01 15:28:16 +08:00
parent e8aeef19de
commit b6faeda83d
1 changed files with 8 additions and 2 deletions

View File

@ -15,7 +15,7 @@
# 一次性 bootstrap(useradd / 写 systemd unit / enable)不在这里 —— 见 RUN.md §部署 一次性。 # 一次性 bootstrap(useradd / 写 systemd unit / enable)不在这里 —— 见 RUN.md §部署 一次性。
# #
# 可调 env(不传则用默认 / Dockerfile 默认): # 可调 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 镜像源, # APT_MIRROR / PIP_INDEX_URL / PIP_TRUSTED_HOST / NPM_REGISTRY 镜像源,
# 默认阿里源(境内快);要稳定命中 docker cache 就别在两组源之间来回换 # 默认阿里源(境内快);要稳定命中 docker cache 就别在两组源之间来回换
# (换源会从 pip 层炸开全重跑)。想用官方源:PIP_INDEX_URL= sudo -E bash ...(置空) # (换源会从 pip 层炸开全重跑)。想用官方源:PIP_INDEX_URL= sudo -E bash ...(置空)
@ -28,7 +28,9 @@ set -euo pipefail
# / 经软链调用(Ubuntu coreutils 有 readlink -f)。 # / 经软链调用(Ubuntu coreutils 有 readlink -f)。
SCRIPT_DIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" SCRIPT_DIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
APP_DIR="${APP_DIR:-$(dirname "$SCRIPT_DIR")}" 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}" SERVICE="${SERVICE:-zcbot}"
PORT="${PORT:-8765}" PORT="${PORT:-8765}"
IMAGE="zcbot-sandbox:latest" IMAGE="zcbot-sandbox:latest"
@ -52,6 +54,10 @@ asuser() { sudo -u "$APP_USER" "$@"; }
[ -d "$APP_DIR/.git" ] || fail "$APP_DIR 不是 git 仓库(部署目录不对?)" [ -d "$APP_DIR/.git" ] || fail "$APP_DIR 不是 git 仓库(部署目录不对?)"
[ -x "$PY" ] || fail "找不到 venv python:$PY" [ -x "$PY" ] || fail "找不到 venv python:$PY"
[ -f "$APP_DIR/.env" ] || fail "$APP_DIR/.env(ZCBOT_DB_URL 等)" [ -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,不算)→ 中止, # 工作区脏(仅看已跟踪文件;.venv/.env/workspace 都 gitignore,不算)→ 中止,
# 避免 ff-only 失败或把本地手改卷进部署 # 避免 ff-only 失败或把本地手改卷进部署