From 6ed4a991433ecfa746daa5bf8feeaaeb56768365 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 16 Apr 2026 22:35:08 +0800 Subject: [PATCH] debug --- ...mainCheck_CentOS9一键复制部署与更新文档.md | 9 +++ .../multi-region/install_overseas_quick.sh | 72 +++++++++++-------- 2 files changed, 53 insertions(+), 28 deletions(-) diff --git a/docs/18_domainCheck_CentOS9一键复制部署与更新文档.md b/docs/18_domainCheck_CentOS9一键复制部署与更新文档.md index e55229b..9b4ec6c 100644 --- a/docs/18_domainCheck_CentOS9一键复制部署与更新文档.md +++ b/docs/18_domainCheck_CentOS9一键复制部署与更新文档.md @@ -143,6 +143,7 @@ git pull --ff-only origin main - 整套部署命令建议统一使用 `root` - 不建议用 `www` 执行部署脚本 +- 但前端 `npm install` 和 `npm run build` 会由脚本自动切到仓库属主执行 原因: @@ -158,6 +159,13 @@ git pull --ff-only origin main 这些都属于 `root` 口径,不适合 `www` 用户执行。 +补充说明: + +- 脚本入口仍然是 `root` +- 但国外机的一键脚本内部会自动识别仓库属主 +- 然后把前端构建切到仓库属主执行 +- 这样可以避免把 `node_modules`、`dist`、源码目录权限烧成 `root` + 最稳的执行方式: ```bash @@ -229,6 +237,7 @@ nvm use 20 - 国外机器如果要构建前端,必须先确保 `nvm` 可用 - 一键部署脚本会调用 `nvm install 20` 和 `nvm use 20` +- 前端构建由仓库属主执行,不是由 `root` 直接执行 - 如果你用 `root` 执行脚本,而 `nvm` 实际装在别的用户目录下: - 不需要改成 `www` 执行脚本 - 直接在 `install_overseas_quick.conf` 里填写: diff --git a/domain-api/deploy/multi-region/install_overseas_quick.sh b/domain-api/deploy/multi-region/install_overseas_quick.sh index a27efe8..b94c53b 100755 --- a/domain-api/deploy/multi-region/install_overseas_quick.sh +++ b/domain-api/deploy/multi-region/install_overseas_quick.sh @@ -34,6 +34,8 @@ BASE_DIR="/opt/domaincheck" DOMAINCHECK_DIR="${BASE_DIR}/domainCheck" DOMAIN_API_DIR="${BASE_DIR}/domain-api" DOMAIN_WEB_DIR="${BASE_DIR}/domain-web" +REPO_OWNER="" +REPO_OWNER_HOME="" if [[ "${DB_PASSWORD}" == "CHANGE_ME_DB_PASSWORD" ]]; then echo "请先修改配置文件中的必填项:DB_PASSWORD" @@ -47,8 +49,21 @@ if [[ ! -d "${REPO_DIR}/.git" ]]; then exit 1 fi +REPO_OWNER="$(stat -c '%U' "${REPO_DIR}")" +REPO_OWNER_HOME="$(getent passwd "${REPO_OWNER}" | cut -d: -f6)" +if [[ -z "${REPO_OWNER}" || -z "${REPO_OWNER_HOME}" ]]; then + echo "无法识别仓库属主或 HOME:${REPO_DIR}" + exit 1 +fi + +run_as_repo_owner() { + local cmd="$1" + runuser -u "${REPO_OWNER}" -- env HOME="${REPO_OWNER_HOME}" bash -lc "${cmd}" +} + echo "已检测到仓库目录:${REPO_DIR}" echo "当前脚本不会执行任何 Git 命令。" +echo "仓库属主:${REPO_OWNER}" echo "如需更新代码,请先手动切到仓库属主完成 git pull,再重新执行本脚本。" mkdir -p "${BASE_DIR}" @@ -112,52 +127,53 @@ cat >"${DOMAIN_WEB_DIR}/.env.production" </dev/null 2>&1 && command -v npm >/dev/null 2>&1; then - echo "未检测到 nvm,改用系统已安装的 node/npm" - echo "当前 node 版本:$(node -v)" + echo '未检测到 nvm,改用系统已安装的 node/npm' + echo '当前 node 版本:'\"\$(node -v)\" NODE_READY=true fi - -if [[ "${NODE_READY}" != "true" ]]; then - echo "未找到可用的 Node 运行环境。" - echo "请执行以下任一方案后重试:" - echo "1. 用 root 安装 nvm,并确保 /root/.nvm/nvm.sh 存在" - echo "2. 在 install_overseas_quick.conf 中填写 NODE_NVM_DIR,例如:/home/www/.nvm" - echo "3. 预先安装系统全局 node 和 npm" +if [[ \"\${NODE_READY}\" != 'true' ]]; then + echo '未找到可用的 Node 运行环境。' + echo '请执行以下任一方案后重试:' + echo '1. 为仓库属主安装 nvm,并确保 ~/.nvm/nvm.sh 存在' + echo '2. 在 install_overseas_quick.conf 中填写 NODE_NVM_DIR,例如:/home/www/.nvm' + echo '3. 预先安装系统全局 node 和 npm' exit 1 fi - npm install npm run build +" cp "${DOMAIN_API_DIR}/deploy/multi-region/templates/domaincheck-api.env.example" /etc/default/domaincheck-api sed -i "s#^DOMAIN_ROOT=.*#DOMAIN_ROOT=${DOMAINCHECK_DIR}#" /etc/default/domaincheck-api