From cc1c42a6483d2f372acd0a02319254083d6e3b54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=BF=94?= Date: Wed, 22 Apr 2026 16:18:28 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E9=83=A8=E7=BD=B2=E8=84=9A=E6=9C=AC=20deploy-dist.sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 仅上传 dist 目录到生产服务器 - 自动备份旧版本 - 支持清理旧备份(保留最近3个) - 无需重构 Docker 容器 --- deploy-dist.sh | 123 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100755 deploy-dist.sh diff --git a/deploy-dist.sh b/deploy-dist.sh new file mode 100755 index 0000000..7025b39 --- /dev/null +++ b/deploy-dist.sh @@ -0,0 +1,123 @@ +#!/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. 测试网站主要功能"