98 lines
2.6 KiB
Bash
Executable File
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"
|