cc1c42a648
- 仅上传 dist 目录到生产服务器 - 自动备份旧版本 - 支持清理旧备份(保留最近3个) - 无需重构 Docker 容器
124 lines
3.5 KiB
Bash
Executable File
124 lines
3.5 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
set -e
|
||
|
||
SERVER_IP="139.155.109.62"
|
||
SERVER_USER="root"
|
||
DEPLOY_ROOT="/home/novalon/docker-app"
|
||
PROJECT_NAME="novalon-website"
|
||
DIST_DIR="dist"
|
||
|
||
while getopts "i:u:p:h" opt; do
|
||
case $opt in
|
||
i) SERVER_IP="$OPTARG" ;;
|
||
u) SERVER_USER="$OPTARG" ;;
|
||
p) PROJECT_NAME="$OPTARG" ;;
|
||
h)
|
||
echo "用法: $0 [选项]"
|
||
echo "选项:"
|
||
echo " -i IP地址 服务器IP地址 (默认: 139.155.109.62)"
|
||
echo " -u 用户名 SSH用户名 (默认: root)"
|
||
echo " -p 项目名 项目名称 (默认: novalon-website)"
|
||
echo " -h 显示帮助信息"
|
||
exit 0
|
||
;;
|
||
\?)
|
||
echo "无效选项: -$OPTARG" >&2
|
||
exit 1
|
||
;;
|
||
esac
|
||
done
|
||
|
||
LOG_DIR="./logs"
|
||
LOG_FILE="$LOG_DIR/deploy_dist_$(date +%Y%m%d_%H%M%S).log"
|
||
|
||
mkdir -p "$LOG_DIR"
|
||
exec > >(tee -a "$LOG_FILE") 2>&1
|
||
|
||
echo "🚀 开始部署 dist 到服务器 $SERVER_IP"
|
||
echo "📁 部署目录: $DEPLOY_ROOT/$PROJECT_NAME/$DIST_DIR"
|
||
echo "📋 部署日志: $LOG_FILE"
|
||
echo ""
|
||
|
||
echo "📋 步骤1: 检查 dist 目录..."
|
||
if [ ! -d "$DIST_DIR" ]; then
|
||
echo "❌ dist 目录不存在,请先运行 pnpm build"
|
||
exit 1
|
||
fi
|
||
|
||
DIST_SIZE=$(du -sh "$DIST_DIR" | cut -f1)
|
||
echo "✅ dist 目录大小: $DIST_SIZE"
|
||
|
||
echo ""
|
||
echo "📋 步骤2: 验证SSH连接..."
|
||
if ! ssh -o ConnectTimeout=5 "$SERVER_USER@$SERVER_IP" exit; then
|
||
echo "❌ 无法连接到服务器 $SERVER_IP"
|
||
exit 1
|
||
fi
|
||
echo "✅ SSH连接验证成功"
|
||
|
||
echo ""
|
||
echo "📋 步骤3: 备份旧版本..."
|
||
ssh "$SERVER_USER@$SERVER_IP" "
|
||
set -e
|
||
DEPLOY_PATH='$DEPLOY_ROOT/$PROJECT_NAME/$DIST_DIR'
|
||
BACKUP_PATH='$DEPLOY_ROOT/$PROJECT_NAME/${DIST_DIR}_backup_$(date +%Y%m%d_%H%M%S)'
|
||
|
||
if [ -d \"\$DEPLOY_PATH\" ]; then
|
||
echo \"📦 备份到 \$BACKUP_PATH\"
|
||
mv \"\$DEPLOY_PATH\" \"\$BACKUP_PATH\"
|
||
echo \"✅ 备份完成\"
|
||
else
|
||
echo \"ℹ️ 无需备份,目录不存在\"
|
||
fi
|
||
"
|
||
|
||
echo ""
|
||
echo "📋 步骤4: 上传 dist 目录..."
|
||
ssh "$SERVER_USER@$SERVER_IP" "mkdir -p '$DEPLOY_ROOT/$PROJECT_NAME'"
|
||
rsync -avz --delete "$DIST_DIR/" "$SERVER_USER@$SERVER_IP:$DEPLOY_ROOT/$PROJECT_NAME/$DIST_DIR/"
|
||
echo "✅ dist 目录已上传"
|
||
|
||
echo ""
|
||
echo "📋 步骤5: 设置文件权限..."
|
||
ssh "$SERVER_USER@$SERVER_IP" "
|
||
set -e
|
||
DEPLOY_PATH='$DEPLOY_ROOT/$PROJECT_NAME/$DIST_DIR'
|
||
chown -R www-data:www-data \"\$DEPLOY_PATH\" 2>/dev/null || true
|
||
chmod -R 755 \"\$DEPLOY_PATH\"
|
||
echo \"✅ 权限设置完成\"
|
||
"
|
||
|
||
echo ""
|
||
echo "📋 步骤6: 验证部署..."
|
||
if ! ssh "$SERVER_USER@$SERVER_IP" "[ -d '$DEPLOY_ROOT/$PROJECT_NAME/$DIST_DIR' ]"; then
|
||
echo "❌ 部署目录不存在"
|
||
exit 1
|
||
fi
|
||
|
||
FILE_COUNT=$(ssh "$SERVER_USER@$SERVER_IP" "find '$DEPLOY_ROOT/$PROJECT_NAME/$DIST_DIR' -type f | wc -l")
|
||
echo "✅ 部署完成,共 $FILE_COUNT 个文件"
|
||
|
||
echo ""
|
||
echo "📋 步骤7: 清理旧备份(保留最近3个)..."
|
||
ssh "$SERVER_USER@$SERVER_IP" "
|
||
set -e
|
||
BACKUP_DIR='$DEPLOY_ROOT/$PROJECT_NAME'
|
||
cd \"\$BACKUP_DIR\"
|
||
ls -dt ${DIST_DIR}_backup_* 2>/dev/null | tail -n +4 | xargs rm -rf 2>/dev/null || true
|
||
echo \"✅ 清理完成\"
|
||
"
|
||
|
||
echo ""
|
||
echo "🎉 部署成功!"
|
||
echo ""
|
||
echo "📋 访问地址:"
|
||
echo " HTTP: http://$SERVER_IP"
|
||
echo " HTTPS: https://$SERVER_IP"
|
||
echo " 域名: https://novalon.cn"
|
||
echo ""
|
||
echo "📋 后续步骤:"
|
||
echo " 1. 验证网站可访问性"
|
||
echo " 2. 检查静态资源加载"
|
||
echo " 3. 测试网站主要功能"
|