fix: P0-2 深度根因修复 — Worker端URL校验403 + endpoint HTTPS修复 #211

Merged
xiaoxia merged 1 commits from fix/p02-deep-root-cause into develop 2026-07-10 20:35:03 +08:00

1 Commits

Author SHA1 Message Date
用户CI Test 068e97d6fc fix: P0-2 深度根因修复 — Worker端URL校验403 + endpoint HTTPS修复
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Failing after 16s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m29s
CI/CD Pipeline / Build & Push Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Build Production Runtime Images (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
## 根因分析

### 问题 1(P0 紧急):Worker 端上传后 URL 校验永远失败

**现象**:所有生成任务在 OSS 上传后失败,报
"OSS 上传后 URL 不可访问"。

**根因**: 用裸 URL 直接发起 HEAD 请求,
私有 bucket 下永远返回 403,导致所有生成任务失败。

**修复**:
- 校验前先调用  生成预签名 URL
- 预签名 URL 校验也失败时,降级用  确认上传成功
  (上传成功本身就是最可靠的凭证)

### 问题 2:Worker 端 oss_bucket() endpoint 无 scheme

**根因**: 的  直接使用环境变量中的
endpoint(如 ),不传 scheme。
oss2 SDK 在这种情况下 sign_url 会默认生成 HTTP URL。

**修复**:endpoint 不带 scheme 时自动补 ,与 API 端
storage.py 的修复保持一致。

### 问题 3:API 端 results 接口返回裸 URL?

**排查结论:API 端代码逻辑正确,不是后端 bug。**

 接口确实调用了
,预签名 URL 放在
 字段返回。 字段保留原始 URL(设计如此)。

如果前端拿不到预签名 URL,可能原因:
1. 前端使用了  而非  字段
2. staging API 尚未部署含 HTTPS 修复的最新代码
3. OSS 凭证未配置导致 bucket=None,走 fallback 返回裸 URL
   (日志中会有 warning)

## 新增函数

- Worker 端生成预签名 URL 的统一入口
- 自动从完整 URL 提取 storage key
- 失败时返回 None(不抛异常)

## 测试

新增 10 个单元测试:
- oss_bucket endpoint scheme 修复(4 个)
- get_signed_download_url 功能(4 个)
- upload_to_oss 返回 HTTPS URL(2 个)

测试结果:10/10 passed
2026-07-10 19:57:27 +08:00