fix(p0): 固化 GPU_ENCODE 到 .env.staging + MediaKit 抽帧 403 修复 #2069

Merged
auto-approve-bot merged 3 commits from fix/p0-env-gpu-oss-sign into develop 2026-09-27 21:42:20 +08:00
Owner

P0 修复:GPU 配置防复发 + OSS 签名 URL 403

1. GPU 配置防复发(CI .env 渲染覆盖问题)

  • 根因:每次 CI 部署重新渲染 .env.staging 时,模板中没有 GPU_ENCODE_* 字段,CI secrets 里也没有,导致部署后 GPU_ENCODE 相关变量被清空,GPU 编码静默降级到 CPU(这是第 3 次)。
  • 修复:把 GPU_ENCODE_* 配置块(P4000 endpoint / Tailscale relay URL / secret / NVENC 参数)以字面量形式固化进 deploy/configs/.env.staging 模板,render_env.sh 字面量会原样写入 .env.rendered,不再依赖 CI secret。

2. OSS 预签名 URL 403 修复(Mediakit 抽帧/临时上传失败降级)

  • 根因:apps/worker/video_processing/thumbnail_generator.py::_extract_frames_via_mediakit() 上传本地视频到 OSS 后,直接把公网 URL(https://{bucket}.{endpoint}/{key})传给火山 MediaKit 抽帧服务,但 bucket xiaoxia-autocut 是私有读,公网 GET 直接返回 AccessDenied 403,导致 MediaKit 抽帧恒失败→降级 ffmpeg 本地抽帧,白白多耗时几十秒。
  • 验证:在 staging worker 容器里实测:
    • 公网 GET https://xiaoxia-autocut.oss-cn-hangzhou.aliyuncs.com/tmp/diag-sign-*.mp4 → 403 AccessDenied
    • 预签名 GET → 200 OK
    • PUT sign 带 Content-Type header → 200 OK;PUT sign 不传 headers 但客户端带 Content-Type → SignatureDoesNotMatch(已确认代码路径无此反模式)
  • 修复:
    • _extract_frames_via_mediakit() 上传后改用 get_signed_download_url(key, expires=3600) 生成 1h 预签名 URL 给 MediaKit
    • 同时补全 oss_helpers.delete_from_oss() 函数(finally 块里调用但未实现,导致每次抽帧残留临时文件)

涉及文件

  • deploy/configs/.env.staging:追加 P4000 NVENC 配置块
  • apps/worker/video_processing/oss_helpers.py:补 delete_from_oss()
  • apps/worker/video_processing/thumbnail_generator.py:MediaKit 抽帧改用预签名 URL

验证计划

  • CI 通过
  • auto-merge 部署 staging 后,docker exec xiaoxia-worker-staging env | grep GPU_ENCODE 输出完整
  • 触发一次视频生成,日志中不再出现 "MediaKit 抽帧异常 403"
  • GPU 编码路径走通([gpu-encoder] P4000 done 日志)
## P0 修复:GPU 配置防复发 + OSS 签名 URL 403 ### 1. GPU 配置防复发(CI .env 渲染覆盖问题) - **根因**:每次 CI 部署重新渲染 `.env.staging` 时,模板中没有 GPU_ENCODE_* 字段,CI secrets 里也没有,导致部署后 GPU_ENCODE 相关变量被清空,GPU 编码静默降级到 CPU(这是第 3 次)。 - **修复**:把 GPU_ENCODE_* 配置块(P4000 endpoint / Tailscale relay URL / secret / NVENC 参数)以字面量形式固化进 `deploy/configs/.env.staging` 模板,render_env.sh 字面量会原样写入 `.env.rendered`,不再依赖 CI secret。 ### 2. OSS 预签名 URL 403 修复(Mediakit 抽帧/临时上传失败降级) - **根因**:`apps/worker/video_processing/thumbnail_generator.py::_extract_frames_via_mediakit()` 上传本地视频到 OSS 后,直接把**公网 URL**(`https://{bucket}.{endpoint}/{key}`)传给火山 MediaKit 抽帧服务,但 bucket `xiaoxia-autocut` 是**私有读**,公网 GET 直接返回 `AccessDenied 403`,导致 MediaKit 抽帧恒失败→降级 ffmpeg 本地抽帧,白白多耗时几十秒。 - **验证**:在 staging worker 容器里实测: - 公网 GET `https://xiaoxia-autocut.oss-cn-hangzhou.aliyuncs.com/tmp/diag-sign-*.mp4` → 403 AccessDenied - 预签名 GET → 200 OK - PUT sign 带 Content-Type header → 200 OK;PUT sign 不传 headers 但客户端带 Content-Type → SignatureDoesNotMatch(已确认代码路径无此反模式) - **修复**: - `_extract_frames_via_mediakit()` 上传后改用 `get_signed_download_url(key, expires=3600)` 生成 1h 预签名 URL 给 MediaKit - 同时补全 `oss_helpers.delete_from_oss()` 函数(finally 块里调用但未实现,导致每次抽帧残留临时文件) ### 涉及文件 - `deploy/configs/.env.staging`:追加 P4000 NVENC 配置块 - `apps/worker/video_processing/oss_helpers.py`:补 `delete_from_oss()` - `apps/worker/video_processing/thumbnail_generator.py`:MediaKit 抽帧改用预签名 URL ### 验证计划 - [ ] CI 通过 - [ ] auto-merge 部署 staging 后,`docker exec xiaoxia-worker-staging env | grep GPU_ENCODE` 输出完整 - [ ] 触发一次视频生成,日志中不再出现 "MediaKit 抽帧异常 403" - [ ] GPU 编码路径走通(`[gpu-encoder] P4000 done` 日志)
xiaoxia added 3 commits 2026-09-27 21:32:31 +08:00
fix(worker/thumbnail): MediaKit 抽帧改用预签名 URL,避免私有 bucket 公网 URL 返回 403 导致抽帧降级 ffmpeg
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (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 / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 51s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m25s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m23s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m49s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m2s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 3m8s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 3m16s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 6m30s
AI Code Review / AI Code Review (pull_request) Successful in 6m32s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 8m44s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (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
CI/CD Pipeline / CI Gate (pull_request) Successful in 15s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 6m48s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 58s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 1m9s
7705c3c0fb

🚀 预览环境已部署

项目 详情
PR号 #2069
预览链接 https://pr-2069.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #2069 | | 预览链接 | [https://pr-2069.preview.xiaoxiajianji.com](https://pr-2069.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot merged commit 97ad0ae2e5 into develop 2026-09-27 21:42:20 +08:00
auto-approve-bot deleted branch fix/p0-env-gpu-oss-sign 2026-09-27 21:42:25 +08:00

🗑️ 预览环境已清理

PR #2069 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #2069 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.