fb888a673f
- 修复城市 (not set): 移除 allow_google_signals: false,启用 Google 信号补充地理数据
- 修复 Consent Mode v2: 补充 ad_user_data / ad_personalization 参数
- 修复 wait_for_update 与横幅延迟不匹配: 500ms → 3000ms
- 修复 static export 兼容性: GA 初始化脚本从 client component 移至 layout.tsx head 原生 script 标签
- 修复 pageview 追踪: GA3 风格 gtag('config') → GA4 风格 gtag('event', 'page_view')
- 修复 CookieConsent: 横幅延迟 2000ms → 500ms,同意后补发 pageview
- 修复 PerformanceTracker: FID → INP (Core Web Vitals 2024 更新)
- 修复环境变量命名: NEXT_PUBLIC_GA_ID → NEXT_PUBLIC_GA_MEASUREMENT_ID
- 清理 deploy-dist.sh 冗余 server/app 分支逻辑
- 新增部署产物 GA 脚本嵌入验证
159 lines
4.5 KiB
Bash
Executable File
159 lines
4.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"
|
||
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. 测试网站主要功能"
|