diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 2b890cb..5c21d03 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -29,6 +29,7 @@ # # 环境变量覆盖: # SERVER_IP SERVER_USER DEPLOY_ROOT PROJECT_NAME NGINX_CONTAINER +# NEXTJS_CONTAINER COMPOSE_FILE COMPOSE_CMD # DOMAIN BACKUP_RETENTION_COUNT DIST_DIR # ============================================================ @@ -40,6 +41,9 @@ SERVER_USER="${SERVER_USER:-root}" DEPLOY_ROOT="${DEPLOY_ROOT:-/home/novalon/docker-app}" PROJECT_NAME="${PROJECT_NAME:-novalon-website}" NGINX_CONTAINER="${NGINX_CONTAINER:-novalon-nginx-secure}" +NEXTJS_CONTAINER="${NEXTJS_CONTAINER:-novalon-website}" +COMPOSE_FILE="${COMPOSE_FILE:-docker-compose.server.yml}" +COMPOSE_CMD="${COMPOSE_CMD:-docker-compose}" DOMAIN="${DOMAIN:-https://novalon.cn}" BACKUP_RETENTION="${BACKUP_RETENTION_COUNT:-${BACKUP_RETENTION:-3}}" DIST_DIR="${DIST_DIR:-dist}" @@ -252,6 +256,30 @@ cmd_deploy() { fi " + # 步骤 6.5: 同步 public 并重建 Next.js 容器 + # 混合渲染下,Nginx 提供新客户端资源,Next.js 容器也必须运行同一份构建, + # 否则会出现 /_next/static 404 或 Server Reference ID 不匹配。 + log "" + log "📋 步骤 6.5: 重建 Next.js 容器 ($NEXTJS_CONTAINER)" + if [[ -d "$PROJECT_ROOT/public" ]]; then + if [[ "$DRY_RUN" == "1" ]]; then + log "🔍 [dry-run] rsync -az --delete \"$PROJECT_ROOT/public/\" $SERVER_USER@$SERVER_IP:$REMOTE_PROJECT_DIR/public/" + else + rsync -az --delete "$PROJECT_ROOT/public/" "$SERVER_USER@$SERVER_IP:$REMOTE_PROJECT_DIR/public/" + fi + fi + run_remote " + set -e + cd '$REMOTE_PROJECT_DIR' + if [ -f '$COMPOSE_FILE' ]; then + $COMPOSE_CMD -f '$COMPOSE_FILE' build + $COMPOSE_CMD -f '$COMPOSE_FILE' up -d + echo \"✅ Next.js 容器已重建\" + else + echo \"⚠️ 未找到 $COMPOSE_FILE,跳过 Next.js 容器重建\" + fi + " + # 步骤 7: 验证生产环境 if ! verify_remote; then if [[ "$AUTO_ROLLBACK" == "1" ]]; then