Files
webwatcher/deploy.sh
T
2026-07-27 09:32:21 +08:00

98 lines
2.6 KiB
Bash
Executable File

#!/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"