#!/bin/bash set -e # ========== 配置区 ========== REMOTE_HOST="152.136.182.184" REMOTE_USER="ubuntu" REMOTE_PASS="Why_701208" REMOTE_DIR="/opt/webwatcher" APP_NAME="webwatcher" APP_PORT=3030 # ============================ SSH_CMD="sshpass -p '$REMOTE_PASS' ssh -o StrictHostKeyChecking=no $REMOTE_USER@$REMOTE_HOST" SCP_CMD="sshpass -p '$REMOTE_PASS' scp -o StrictHostKeyChecking=no" TMP_PACK="/tmp/webwatcher-pack" TMP_TAR="/tmp/webwatcher-deploy.tar.gz" REMOTE_TAR="/tmp/webwatcher-deploy.tar.gz" GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' log() { echo -e "${GREEN}[部署]${NC} $1"; } warn() { echo -e "${YELLOW}[警告]${NC} $1"; } err() { echo -e "${RED}[错误]${NC} $1"; exit 1; } if ! command -v sshpass &>/dev/null; then err "请先安装 sshpass: brew install hudochenkov/sshpass/sshpass" fi # 1. 构建 log "正在构建 Next.js 项目..." npm run build || err "构建失败" # 2. 打包 standalone log "正在打包 standalone 产物..." rm -rf "$TMP_PACK" "$TMP_TAR" mkdir -p "$TMP_PACK" cp -R .next/standalone/ "$TMP_PACK/" cp -R .next/static "$TMP_PACK/.next/static" [ -d public ] && cp -R public "$TMP_PACK/public" [ -f servers.config.json ] && cp servers.config.json "$TMP_PACK/servers.config.json" cd "$TMP_PACK" tar czf "$TMP_TAR" . cd - > /dev/null rm -rf "$TMP_PACK" TAR_SIZE=$(du -h "$TMP_TAR" | cut -f1) log "打包完成: $TAR_SIZE" # 3. 上传 log "正在上传到 $REMOTE_HOST..." eval $SCP_CMD "$TMP_TAR" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_TAR" log "上传完成" # 4. 远程部署 log "正在远程部署..." eval $SSH_CMD << DEPLOY set -e # 停止旧进程 pm2 delete $APP_NAME 2>/dev/null || true # 备份旧版本 if [ -d "$REMOTE_DIR/.next" ]; then BACKUP="${REMOTE_DIR}.bak.\$(date +%Y%m%d%H%M%S)" sudo cp -r "$REMOTE_DIR" "\$BACKUP" sudo chown -R $REMOTE_USER:$REMOTE_USER "\$BACKUP" echo "旧版本已备份到 \$BACKUP" fi # 解压新版本(保留 data 目录等持久化数据) sudo mkdir -p "$REMOTE_DIR" sudo chown $REMOTE_USER:$REMOTE_USER "$REMOTE_DIR" cd "$REMOTE_DIR" rm -rf .next node_modules package.json server.js tar xzf "$REMOTE_TAR" rm -f "$REMOTE_TAR" # 启动 cd "$REMOTE_DIR" PORT=$APP_PORT pm2 start server.js --name $APP_NAME pm2 save sleep 2 # 验证 HTTP_CODE=\$(curl -s -o /dev/null -w "%{http_code}" http://localhost:$APP_PORT/) if [ "\$HTTP_CODE" = "200" ]; then echo "✅ 部署成功 - HTTP $APP_PORT 响应 200" else echo "⚠️ 应用启动但 HTTP 响应码: \$HTTP_CODE" fi pm2 status $APP_NAME DEPLOY rm -f "$TMP_TAR" log "🎉 一键部署完成!访问 http://$REMOTE_HOST:$APP_PORT"