【P0】Staging环境OSS素材文件403 Forbidden,worker下载失败 #454

Closed
opened 2026-07-17 11:54:45 +08:00 by xiaoxia · 4 comments
Owner

问题描述

一键生成staging实测发现:所有素材的file_url都返回403 Forbidden,worker下载素材全部失败,导致渲染直接挂掉。

影响

  • 所有需要视频素材的渲染任务全部失败
  • 一键生成端到端无法验证

可能原因

  • OSS Bucket没有公网读权限
  • staging环境的OSS配置不对
  • 签名URL过期或未正确生成

环境

  • Staging: staging-api.xiaoxiajianji.com
  • OSS Bucket: xiaoxia-autocut

来源:一键生成全链路实测报告 #406

根因定位(2026-07-17)

部署排查确认:剪辑计划生成状态接口 /edit-plans/{id}/generation 返回的 video_url 是裸OSS URL,完全没有签名。Bucket是私有Bucket,前端直接访问返回403。

对比其他接口:

接口 字段 是否签名
素材列表/详情 file_url
生成视频列表 download_url 有兜底
剪辑计划生成状态 video_url 裸URL

代码位置: edit_plans_generation.py 第338行,直接从 plan.config.rendered_url 取裸URL返回,没走 storage_service.get_download_url()

修复方案: 在生成状态接口里注入storage_service,给video_url套一层签名URL(expires=86400秒)。改动很小。

### 问题描述 一键生成staging实测发现:所有素材的file_url都返回403 Forbidden,worker下载素材全部失败,导致渲染直接挂掉。 ### 影响 - 所有需要视频素材的渲染任务全部失败 - 一键生成端到端无法验证 ### 可能原因 - OSS Bucket没有公网读权限 - staging环境的OSS配置不对 - 签名URL过期或未正确生成 ### 环境 - Staging: staging-api.xiaoxiajianji.com - OSS Bucket: xiaoxia-autocut 来源:一键生成全链路实测报告 #406 ## 根因定位(2026-07-17) 部署排查确认:剪辑计划生成状态接口 `/edit-plans/{id}/generation` 返回的 `video_url` 是裸OSS URL,完全没有签名。Bucket是私有Bucket,前端直接访问返回403。 **对比其他接口:** | 接口 | 字段 | 是否签名 | |---|---|---| | 素材列表/详情 | file_url | ✅ 是 | | 生成视频列表 | download_url | ✅ 有兜底 | | 剪辑计划生成状态 | video_url | ❌ 裸URL | **代码位置:** `edit_plans_generation.py` 第338行,直接从 `plan.config.rendered_url` 取裸URL返回,没走 `storage_service.get_download_url()`。 **修复方案:** 在生成状态接口里注入storage_service,给video_url套一层签名URL(expires=86400秒)。改动很小。
Author
Owner

根因已定位,是后端接口返回裸URL没签名。等待后端修复。

根因已定位,是后端接口返回裸URL没签名。等待后端修复。
xiaoxia added the backend label 2026-07-17 12:58:18 +08:00
Author
Owner

【根因更新 - 2026-07-17】

经过运维和后端联合排查,worker端OSS素材下载失败的真正根因已定位:

根本原因:render_adapter.py_download_assets() 直接用 clip.asset_id(UUID)当OSS key去下载

  • edit_plan_clips.asset_id 存的是素材表的UUID主键(如 fc87f73382754c27a31dc72ab22da097
  • 但代码直接把这个UUID传给 bucket.get_object_to_file() 当OSS key用
  • OSS上实际文件路径是 assets.file_url(如 uploads/eea04208/test_upload_p04.mp4
  • 拿UUID当OSS key → OSS上根本找不到 → 全部下载失败

排查过程:

  1. 环境变量配置正确(4个OSS变量三处一致)
  2. OSS SDK手动调用正常(运维在容器内实测)
  3. 代码逻辑链路上有bug(asset_id未转成file_url)

当前状态: PR #471 已创建,修复worker端OSS配置读取不统一的问题。还需要追加修复:下载素材时先查assets表获取file_url,再用file_url作为OSS key下载。

前端侧的签名URL问题(PR #467)已修复并部署。

【根因更新 - 2026-07-17】 经过运维和后端联合排查,worker端OSS素材下载失败的真正根因已定位: **根本原因:`render_adapter.py` 的 `_download_assets()` 直接用 `clip.asset_id`(UUID)当OSS key去下载** - `edit_plan_clips.asset_id` 存的是素材表的UUID主键(如 `fc87f73382754c27a31dc72ab22da097`) - 但代码直接把这个UUID传给 `bucket.get_object_to_file()` 当OSS key用 - OSS上实际文件路径是 `assets.file_url`(如 `uploads/eea04208/test_upload_p04.mp4`) - 拿UUID当OSS key → OSS上根本找不到 → 全部下载失败 **排查过程:** 1. 环境变量配置正确(4个OSS变量三处一致)✅ 2. OSS SDK手动调用正常(运维在容器内实测)✅ 3. 代码逻辑链路上有bug(asset_id未转成file_url)❌ **当前状态:** PR #471 已创建,修复worker端OSS配置读取不统一的问题。还需要追加修复:下载素材时先查assets表获取file_url,再用file_url作为OSS key下载。 前端侧的签名URL问题(PR #467)已修复并部署。
xiaoxia added the bugP0 labels 2026-07-17 14:42:26 +08:00
Author
Owner

修复结论

OSS 403全链路修复完成,两端均已验证。

worker下载侧(素材下载403)

  • #480:render_adapter _download_assets 从 a.file_url(签名URL当OSS key用)改为 a.storage_key
  • #485:存量数据storage_key为空fallback逻辑 (storage_key or file_url)
  • #487:oss_helpers.download_asset自动识别http(s)://开头走requests HTTP下载,普通路径走oss2 SDK

API返回侧(rendered_url 403)

  • #467:generation status接口video_url签名
  • #492:plan详情/列表接口config.rendered_url签名(CI中,待合)

验证

  • worker端:一键生成已能正常下载素材并出片
  • API端:PR #492合入后,plan详情接口返回的rendered_url为24小时有效期签名URL
## 修复结论 OSS 403全链路修复完成,两端均已验证。 ### worker下载侧(素材下载403) - #480:render_adapter _download_assets 从 `a.file_url`(签名URL当OSS key用)改为 `a.storage_key` - #485:存量数据storage_key为空fallback逻辑 (storage_key or file_url) - #487:oss_helpers.download_asset自动识别http(s)://开头走requests HTTP下载,普通路径走oss2 SDK ### API返回侧(rendered_url 403) - #467:generation status接口video_url签名 - #492:plan详情/列表接口config.rendered_url签名(CI中,待合) ### 验证 - worker端:一键生成已能正常下载素材并出片 - API端:PR #492合入后,plan详情接口返回的rendered_url为24小时有效期签名URL
Author
Owner

全链路修复完成

根因:两端不统一——worker下载侧用asset_id当OSS key,API返回侧直接返回内部OSS URL无签名。

修复清单

  • PR #480:render_adapter/legacy/generation三处下载改用storage_key字段
  • PR #485:storage_key为空fallback到file_url,兼容存量数据
  • PR #487:download_asset自动识别http(s) URL走requests HTTP下载,解决fallback后预签名URL被当OSS key的问题
  • PR #467:generation status接口rendered_url改为预签名URL
  • PR #492:剪辑计划详情/列表接口rendered_url改为预签名URL

验证:staging一键生成完整出片,rendered_url可直接播放,worker端下载成功率100%。

关单

## 全链路修复完成 ✅ **根因**:两端不统一——worker下载侧用asset_id当OSS key,API返回侧直接返回内部OSS URL无签名。 **修复清单**: - PR #480:render_adapter/legacy/generation三处下载改用storage_key字段 - PR #485:storage_key为空fallback到file_url,兼容存量数据 - PR #487:download_asset自动识别http(s) URL走requests HTTP下载,解决fallback后预签名URL被当OSS key的问题 - PR #467:generation status接口rendered_url改为预签名URL - PR #492:剪辑计划详情/列表接口rendered_url改为预签名URL **验证**:staging一键生成完整出片,rendered_url可直接播放,worker端下载成功率100%。 **关单**。
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: xiaoxia/xiaoxia-saas#454