#!/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" STATIC_DIR="novalon-static" NGINX_CONTAINER="novalon-nginx-secure" 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/$STATIC_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 "📋 步骤1.1: 验证构建产物..." if [ -f "$DIST_DIR/index.html" ]; then if grep -q "googletagmanager.com" "$DIST_DIR/index.html"; then GA_ID=$(grep -oP 'id=G-[A-Z0-9]+' "$DIST_DIR/index.html" | head -1 | sed 's/id=//') echo "✅ GA 脚本已嵌入: $GA_ID" else echo "⚠️ 未检测到 GA 脚本,请检查 .env.production 中的 NEXT_PUBLIC_GA_MEASUREMENT_ID" fi else echo "❌ index.html 不存在,构建可能失败" exit 1 fi 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 STATIC_PATH='$DEPLOY_ROOT/$STATIC_DIR' BACKUP_PATH='$DEPLOY_ROOT/${STATIC_DIR}_backup_$(date +%Y%m%d_%H%M%S)' if [ -d \"\$STATIC_PATH\" ]; then echo \"📦 备份到 \$BACKUP_PATH\" cp -r \"\$STATIC_PATH\" \"\$BACKUP_PATH\" echo \"✅ 备份完成\" else echo \"ℹ️ 无需备份,目录不存在\" fi " echo "" echo "📋 步骤4: 上传 dist 目录..." ssh "$SERVER_USER@$SERVER_IP" "mkdir -p '$DEPLOY_ROOT/$STATIC_DIR'" rsync -avz --delete "$DIST_DIR/" "$SERVER_USER@$SERVER_IP:$DEPLOY_ROOT/$STATIC_DIR/" echo "✅ dist 目录已上传" echo "" echo "📋 步骤5: 设置文件权限..." ssh "$SERVER_USER@$SERVER_IP" " set -e STATIC_PATH='$DEPLOY_ROOT/$STATIC_DIR' chown -R www-data:www-data \"\$STATIC_PATH\" 2>/dev/null || true chmod -R 755 \"\$STATIC_PATH\" echo \"✅ 权限设置完成\" " echo "" echo "📋 步骤6: 清除 Nginx 缓存..." ssh "$SERVER_USER@$SERVER_IP" " set -e docker exec $NGINX_CONTAINER nginx -s reload 2>/dev/null || echo \"⚠️ Nginx 重载失败,尝试重启容器\" echo \"✅ Nginx 缓存已清除\" " echo "" echo "📋 步骤7: 验证部署..." if ! ssh "$SERVER_USER@$SERVER_IP" "[ -d '$DEPLOY_ROOT/$STATIC_DIR' ]"; then echo "❌ 部署目录不存在" exit 1 fi FILE_COUNT=$(ssh "$SERVER_USER@$SERVER_IP" "find '$DEPLOY_ROOT/$STATIC_DIR' -type f | wc -l") echo "✅ 部署完成,共 $FILE_COUNT 个文件" echo "" echo "📋 步骤8: 清理旧备份(保留最近3个)..." ssh "$SERVER_USER@$SERVER_IP" " set -e BACKUP_DIR='$DEPLOY_ROOT' cd \"\$BACKUP_DIR\" ls -dt ${STATIC_DIR}_backup_* 2>/dev/null | tail -n +4 | xargs rm -rf 2>/dev/null || true echo \"✅ 清理完成\" " echo "" echo "📋 步骤9: 验证生产环境..." LOGO_FONT=$(curl -s "https://novalon.cn/logo.svg" | grep -o "font-family: [^;]*" | head -1) if echo "$LOGO_FONT" | grep -q "aoyagiReisho"; then echo "✅ 生产环境已更新: $LOGO_FONT" else echo "⚠️ 生产环境可能未更新,请手动验证" fi 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. 测试网站主要功能"