Initial commit

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
谢宇宁
2026-10-26 17:51:31 +07:00
co-authored by Claude Opus 5.5
commit 61d0a11dfa
371 changed files with 35836 additions and 0 deletions
+94
View File
@@ -0,0 +1,94 @@
#!/usr/bin/env bash
# 正式服一键:build → standalone → Linux sharp → web_hjsq_h5.tar.gz → scp → rsupdate.sh
set -euo pipefail
SCRIPT_DIR=$(cd "$(dirname "$0")/.." && pwd)
cd "$SCRIPT_DIR"
TARGET_ARCH="${DEPLOY_TARGET_ARCH:-x64}"
TARGET_LIBC="${DEPLOY_TARGET_LIBC:-glibc}"
PACKAGE_NAME=web_hjsq_h5.tar.gz
MD5_NAME=web_hjsq_h5.md5
RELEASE="$SCRIPT_DIR/dist/production-linux-$TARGET_ARCH-$TARGET_LIBC"
JUMP_HOST="${DEPLOY_JUMP_HOST:-server@34.92.204.175}"
JUMP_DIR="${DEPLOY_JUMP_DIR:-/home/server/web_hjsq/h5}"
SCP_PORT="${DEPLOY_SCP_PORT:-22889}"
SSH_PORT="${DEPLOY_SSH_PORT:-22889}"
REMOTE_SCRIPT="${DEPLOY_REMOTE_SCRIPT:-rsupdate.sh}"
SSH_IDENTITY="${DEPLOY_SSH_IDENTITY:-$HOME/.ssh/id_ed25519}"
PACKAGE_ONLY=0
fail() { printf '错误:%s\n' "$*" >&2; exit 1; }
step() { printf '\n▸ %s\n' "$*"; }
for argument in "$@"; do
case "$argument" in
--package-only) PACKAGE_ONLY=1 ;;
-h|--help)
printf '用法:%s [--package-only]\n' "$0"
printf '默认:打包并 scp + 执行远程 %s\n' "$REMOTE_SCRIPT"
printf '可选环境变量:DEPLOY_JUMP_HOST / DEPLOY_JUMP_DIR / DEPLOY_SCP_PORT / DEPLOY_SSH_PORT\n'
printf ' DEPLOY_REMOTE_SCRIPT / DEPLOY_SSH_IDENTITY / DEPLOY_TARGET_ARCH / DEPLOY_TARGET_LIBC\n'
exit 0 ;;
*) fail "不支持的参数 $argument;使用 --help 查看用法" ;;
esac
done
JUMP_DIR="${JUMP_DIR%/}"
command -v pnpm >/dev/null || fail '缺少 pnpm'
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'
if [ "$PACKAGE_ONLY" = 0 ]; then
for tool in ssh scp; do command -v "$tool" >/dev/null || fail "缺少命令 $tool"; done
[ -n "$JUMP_HOST" ] || fail '请设置 DEPLOY_JUMP_HOST'
[ -f "$SSH_IDENTITY" ] || fail "缺少 SSH 私钥:$SSH_IDENTITY(可用 DEPLOY_SSH_IDENTITY 指定)"
fi
step '生产构建'
pnpm run build
step '整理 standalone'
pnpm run bundle
step "补 Linux $TARGET_ARCH/$TARGET_LIBC sharp"
pnpm run bundle:linux -- "$TARGET_ARCH" "$TARGET_LIBC"
for file in start.mjs server.js .next/BUILD_ID config/production.env ecosystem.config.cjs; do
[ -s "$RELEASE/$file" ] || fail "运行包缺少 $file"
done
[ -d "$RELEASE/.next/static" ] && [ -d "$RELEASE/public" ] || fail '运行包缺少静态资源'
step "打包 $PACKAGE_NAME"
rm -f "$SCRIPT_DIR/$PACKAGE_NAME" "$SCRIPT_DIR/$MD5_NAME"
COPYFILE_DISABLE=1 COPY_EXTENDED_ATTRIBUTES_DISABLE=1 tar \
--no-xattrs \
--exclude='._*' --exclude='.DS_Store' --exclude='.env*' \
--exclude='*.local.env' --exclude='*.log' \
-czf "$SCRIPT_DIR/$PACKAGE_NAME" -C "$RELEASE" .
chmod 600 "$SCRIPT_DIR/$PACKAGE_NAME"
if command -v md5sum >/dev/null; then
md5sum "$SCRIPT_DIR/$PACKAGE_NAME" | awk '{print $1}' > "$SCRIPT_DIR/$MD5_NAME"
else
md5 -q "$SCRIPT_DIR/$PACKAGE_NAME" > "$SCRIPT_DIR/$MD5_NAME"
fi
printf '\n完成:%s(%s)\n' "$PACKAGE_NAME" "$(du -h "$SCRIPT_DIR/$PACKAGE_NAME" | awk '{print $1}')"
printf 'MD5:%s\n' "$(cat "$SCRIPT_DIR/$MD5_NAME")"
if [ "$PACKAGE_ONLY" = 1 ]; then
printf '已跳过上传(--package-only)。\n'
exit 0
fi
SSH_OPTS=(-i "$SSH_IDENTITY" -o IdentitiesOnly=yes -o BatchMode=yes)
step "上传 $JUMP_HOST:$JUMP_DIR/"
scp -P "$SCP_PORT" "${SSH_OPTS[@]}" \
"$SCRIPT_DIR/$PACKAGE_NAME" \
"$JUMP_HOST:$JUMP_DIR/"
step "执行远程 $JUMP_DIR/$REMOTE_SCRIPT"
ssh -p "$SSH_PORT" "${SSH_OPTS[@]}" \
"$JUMP_HOST" "bash $JUMP_DIR/$REMOTE_SCRIPT"
printf '\n打包并推送完成。\n'
printf '若远程解压报 File exists:先在服务器清理旧 node_modules 后再跑 %s。\n' "$REMOTE_SCRIPT"