This commit is contained in:
Your Name
2026-04-16 22:35:08 +08:00
parent 9aa0d87c4a
commit 6ed4a99143
2 changed files with 53 additions and 28 deletions

View File

@@ -143,6 +143,7 @@ git pull --ff-only origin main
- 整套部署命令建议统一使用 `root` - 整套部署命令建议统一使用 `root`
- 不建议用 `www` 执行部署脚本 - 不建议用 `www` 执行部署脚本
- 但前端 `npm install``npm run build` 会由脚本自动切到仓库属主执行
原因: 原因:
@@ -158,6 +159,13 @@ git pull --ff-only origin main
这些都属于 `root` 口径,不适合 `www` 用户执行。 这些都属于 `root` 口径,不适合 `www` 用户执行。
补充说明:
- 脚本入口仍然是 `root`
- 但国外机的一键脚本内部会自动识别仓库属主
- 然后把前端构建切到仓库属主执行
- 这样可以避免把 `node_modules``dist`、源码目录权限烧成 `root`
最稳的执行方式: 最稳的执行方式:
```bash ```bash
@@ -229,6 +237,7 @@ nvm use 20
- 国外机器如果要构建前端,必须先确保 `nvm` 可用 - 国外机器如果要构建前端,必须先确保 `nvm` 可用
- 一键部署脚本会调用 `nvm install 20``nvm use 20` - 一键部署脚本会调用 `nvm install 20``nvm use 20`
- 前端构建由仓库属主执行,不是由 `root` 直接执行
- 如果你用 `root` 执行脚本,而 `nvm` 实际装在别的用户目录下: - 如果你用 `root` 执行脚本,而 `nvm` 实际装在别的用户目录下:
- 不需要改成 `www` 执行脚本 - 不需要改成 `www` 执行脚本
- 直接在 `install_overseas_quick.conf` 里填写: - 直接在 `install_overseas_quick.conf` 里填写:

View File

@@ -34,6 +34,8 @@ BASE_DIR="/opt/domaincheck"
DOMAINCHECK_DIR="${BASE_DIR}/domainCheck" DOMAINCHECK_DIR="${BASE_DIR}/domainCheck"
DOMAIN_API_DIR="${BASE_DIR}/domain-api" DOMAIN_API_DIR="${BASE_DIR}/domain-api"
DOMAIN_WEB_DIR="${BASE_DIR}/domain-web" DOMAIN_WEB_DIR="${BASE_DIR}/domain-web"
REPO_OWNER=""
REPO_OWNER_HOME=""
if [[ "${DB_PASSWORD}" == "CHANGE_ME_DB_PASSWORD" ]]; then if [[ "${DB_PASSWORD}" == "CHANGE_ME_DB_PASSWORD" ]]; then
echo "请先修改配置文件中的必填项DB_PASSWORD" echo "请先修改配置文件中的必填项DB_PASSWORD"
@@ -47,8 +49,21 @@ if [[ ! -d "${REPO_DIR}/.git" ]]; then
exit 1 exit 1
fi 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 "已检测到仓库目录:${REPO_DIR}"
echo "当前脚本不会执行任何 Git 命令。" echo "当前脚本不会执行任何 Git 命令。"
echo "仓库属主:${REPO_OWNER}"
echo "如需更新代码,请先手动切到仓库属主完成 git pull再重新执行本脚本。" echo "如需更新代码,请先手动切到仓库属主完成 git pull再重新执行本脚本。"
mkdir -p "${BASE_DIR}" mkdir -p "${BASE_DIR}"
@@ -112,52 +127,53 @@ cat >"${DOMAIN_WEB_DIR}/.env.production" <<EOF
VITE_API_BASE_URL=https://${API_DOMAIN}/api/v1 VITE_API_BASE_URL=https://${API_DOMAIN}/api/v1
EOF EOF
cd "${DOMAIN_WEB_DIR}" chown "${REPO_OWNER}:${REPO_OWNER}" "${DOMAIN_WEB_DIR}/.env.production"
NODE_READY=false
cd "${DOMAIN_WEB_DIR}"
run_as_repo_owner "
set -euo pipefail
cd '${DOMAIN_WEB_DIR}'
NODE_READY=false
resolve_nvm_dir() { resolve_nvm_dir() {
local candidate local candidate
for candidate in \ for candidate in \
"${NODE_NVM_DIR}" \ '${NODE_NVM_DIR}' \
"${NVM_DIR:-}" \ \"\${NVM_DIR:-}\" \
"/root/.nvm" \ '${REPO_OWNER_HOME}/.nvm' \
"/home/www/.nvm" \ '/home/www/.nvm' \
"/www/server/nvm" \ '/www/server/nvm' \
"/usr/local/nvm" '/usr/local/nvm'
do do
if [[ -n "${candidate}" && -s "${candidate}/nvm.sh" ]]; then if [[ -n \"\${candidate}\" && -s \"\${candidate}/nvm.sh\" ]]; then
echo "${candidate}" echo \"\${candidate}\"
return 0 return 0
fi fi
done done
return 1 return 1
} }
if RESOLVED_NVM_DIR=\"\$(resolve_nvm_dir)\"; then
if RESOLVED_NVM_DIR="$(resolve_nvm_dir)"; then export NVM_DIR=\"\${RESOLVED_NVM_DIR}\"
export NVM_DIR="${RESOLVED_NVM_DIR}" source \"\${NVM_DIR}/nvm.sh\"
# shellcheck disable=SC1090 echo '检测到 nvm'\"\${NVM_DIR}\"
source "${NVM_DIR}/nvm.sh" nvm install '${NODE_VERSION}'
echo "检测到 nvm${NVM_DIR}" nvm use '${NODE_VERSION}'
nvm install "${NODE_VERSION}"
nvm use "${NODE_VERSION}"
NODE_READY=true NODE_READY=true
elif command -v node >/dev/null 2>&1 && command -v npm >/dev/null 2>&1; then elif command -v node >/dev/null 2>&1 && command -v npm >/dev/null 2>&1; then
echo "未检测到 nvm改用系统已安装的 node/npm" echo '未检测到 nvm改用系统已安装的 node/npm'
echo "当前 node 版本:$(node -v)" echo '当前 node 版本:'\"\$(node -v)\"
NODE_READY=true NODE_READY=true
fi fi
if [[ \"\${NODE_READY}\" != 'true' ]]; then
if [[ "${NODE_READY}" != "true" ]]; then echo '未找到可用的 Node 运行环境。'
echo "未找到可用的 Node 运行环境。" echo '请执行以下任一方案后重试:'
echo "请执行以下任一方案后重试:" echo '1. 为仓库属主安装 nvm并确保 ~/.nvm/nvm.sh 存在'
echo "1. 用 root 安装 nvm并确保 /root/.nvm/nvm.sh 存在" echo '2. 在 install_overseas_quick.conf 中填写 NODE_NVM_DIR例如/home/www/.nvm'
echo "2. 在 install_overseas_quick.conf 中填写 NODE_NVM_DIR例如/home/www/.nvm" echo '3. 预先安装系统全局 node 和 npm'
echo "3. 预先安装系统全局 node 和 npm"
exit 1 exit 1
fi fi
npm install npm install
npm run build npm run build
"
cp "${DOMAIN_API_DIR}/deploy/multi-region/templates/domaincheck-api.env.example" /etc/default/domaincheck-api 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 sed -i "s#^DOMAIN_ROOT=.*#DOMAIN_ROOT=${DOMAINCHECK_DIR}#" /etc/default/domaincheck-api