- deploy_prod.sh: npm build + bundle + bundle:linux → tar.gz + SHA-256 → scp root@172.104.166.87:/server/web_hgb/h5 → 远端 up_next_h5_prod.sh - deploy/up_next_h5_prod.sh: SHA-256 校验、tar 路径/类型白名单、保留 production.local.env 与 .next/cache/seo、supervisorctl 启停 web_hgb_h5、curl 本机 PORT 健康探测 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
45 lines
2.1 KiB
Bash
Executable File
45 lines
2.1 KiB
Bash
Executable File
#!/bin/bash
|
|
# 生产部署:本地构建 Next.js standalone → tar.gz → scp → 远端 up_next_h5_prod.sh
|
|
# 目标:/server/web_hgb/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_hgb/h5}"
|
|
PACKAGE_NAME="${DEPLOY_PACKAGE_NAME:-web_hgb_h5.tar.gz}"
|
|
PROGRAM="${DEPLOY_PROGRAM:-web_hgb_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..."
|
|
(cd "$LINUX_DIST" && tar --no-xattrs --exclude='.DS_Store' --exclude='node_modules/@img/sharp-darwin-arm64' --exclude='node_modules/@img/sharp-libvips-darwin-arm64' -czf "$STAGE/$PACKAGE_NAME" --owner=0 --group=0 .)
|
|
(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
|