#!/bin/bash # 生产部署:本地构建 Next.js standalone → tar.gz → scp → 远端 up_next_h5_prod.sh # 目标:/server/web_hgc/h5(参考 /server/web_hgcg 的发布流程) set -Eeuo pipefail DIR=$(cd "$(dirname "$0")" && pwd) SSH_TARGET="${DEPLOY_SSH_TARGET:-root@172.104.166.87}" REMOTE_DIR="${DEPLOY_REMOTE_DIR:-/server/web_hgc/h5}" PACKAGE_NAME="${DEPLOY_PACKAGE_NAME:-web_hgc_h5.tar.gz}" PROGRAM="${DEPLOY_PROGRAM:-web_hgc_h5}" REMOTE_SCRIPT="up_next_h5_prod.sh" fail() { printf '错误:%s\n' "$*" >&2; exit 1; } for tool in node npm tar shasum ssh scp; do command -v "$tool" >/dev/null || fail "缺少命令 $tool"; done node -e 'const [a,b]=process.versions.node.split(".").map(Number);if(a<20||a===20&&b<9)process.exit(1)' || fail '需要 Node.js >=20.9' [ -f "$DIR/deploy/$REMOTE_SCRIPT" ] || fail "缺少 deploy/$REMOTE_SCRIPT" STAGE="$DIR/dist/.prod-stage" rm -rf "$STAGE" "$DIR/dist/$PACKAGE_NAME" "$DIR/dist/$PACKAGE_NAME.sha256" mkdir -p "$STAGE" echo "[1/5] 构建 production..." (cd "$DIR" && npm run build) echo "[2/5] 打包 standalone(含 Linux x64/glibc 原生包)..." (cd "$DIR" && npm run bundle) (cd "$DIR" && npm run bundle:linux) LINUX_DIST="$DIR/dist/production-linux-x64-glibc" [ -d "$LINUX_DIST" ] || fail "构建产物 $LINUX_DIST 不存在" echo "[3/5] 生成 tar.gz 和 SHA-256..." # macOS 自带 bsdtar 不支持 GNU 的 --owner/--group,用 --uid/--gid 代替。 if tar --version 2>/dev/null | grep -q 'GNU tar'; then OWNER_FLAGS=(--owner=0 --group=0); else OWNER_FLAGS=(--uid 0 --gid 0 --uname root --gname root); fi (cd "$LINUX_DIST" && COPYFILE_DISABLE=1 tar --no-xattrs "${OWNER_FLAGS[@]}" --exclude='.DS_Store' --exclude='._*' --exclude='node_modules/@img/sharp-darwin-arm64' --exclude='node_modules/@img/sharp-libvips-darwin-arm64' -czf "$STAGE/$PACKAGE_NAME" .) (cd "$STAGE" && shasum -a 256 "$PACKAGE_NAME" > "$PACKAGE_NAME.sha256") ls -lh "$STAGE/$PACKAGE_NAME" "$STAGE/$PACKAGE_NAME.sha256" echo "[4/5] 上传到 $SSH_TARGET:$REMOTE_DIR ..." ssh "$SSH_TARGET" "mkdir -p '$REMOTE_DIR'" scp "$DIR/deploy/$REMOTE_SCRIPT" "$SSH_TARGET:$REMOTE_DIR/$REMOTE_SCRIPT" scp "$STAGE/$PACKAGE_NAME" "$STAGE/$PACKAGE_NAME.sha256" "$SSH_TARGET:$REMOTE_DIR/" echo "[5/5] 远端执行解包和热替换..." ssh "$SSH_TARGET" "chmod +x $REMOTE_DIR/$REMOTE_SCRIPT && DEPLOY_PROGRAM=$PROGRAM DEPLOY_PACKAGE_NAME=$PACKAGE_NAME bash $REMOTE_DIR/$REMOTE_SCRIPT" echo DEPLOY_OK