# S3 个人空间发布规范(存储铁律见 feme-identity-storage 技能) ## 桶与路径 ``` 桶: storage-s3-nkkj (华为云 OBS, cn-north-4) 域名: 公网直接URL https://storage-s3-nkkj.obs.cn-north-4.myhuaweicloud.com/ (s3.fmode.cn CNAME 生效后可换 https://s3.fmode.cn/, 相对路径报告不受影响) 铁律: 只能写 user/<我的userid>/ 前缀; 他人前缀 = 越权 ``` ## 拉片产物路径(硬性, 全英文小写) ``` user//report/lapian/<平台简称>// ├── report.html # 报告本体(入口) ├── video.mp4 # 原视频 ├── audio.wav # 音频 ├── transcript.json # 带时间戳转写 ├── frames/f0001.jpg... # 抽帧切片 └── assets/ # 报告内嵌资源(analysis.json/comments.json/meta.json) ``` - 平台简称: douyin / xiaohongshu / weixin / bilibili / tiktok / kuaishou / shortdrama - 同一条视频重跑: 直接覆盖同日期目录(幂等); 换版本建议换日期目录 ## 相对路径(核心) 报告 HTML 里所有资源引用一律**相对路径**: ```html ``` → 整个前缀自包含, s3.fmode.cn 生效/换桶/镜像到本地, 报告零改动可用。 ## 凭证策略(动态化) ``` 优先: POST /api/storage/credentials Header: Authorization: Bearer Body: {"prefix": "user//report/lapian/"} → {access, secret, securityToken, expires} (限 prefix, 1小时) 过渡: studio credentials API 未上线时(2026-08 实测 404), 回退容器级 CLOUD_SDK_AK / CLOUD_SDK_SK —— 仍只写自己 user// 前缀 ``` `scripts/common.py get_storage_credentials()` 已封装该回退逻辑, 上线后零改动切换。 ## 上传技术要点(实测踩坑) 1. **OBS 必须 virtual-hosted addressing**: bucket 放进 Host (`storage-s3-nkkj.obs.cn-north-4.myhuaweicloud.com`), path-style(把 bucket 放 URL 路径)会报 `VirtualHostDomainRequired` 2. SigV4 签名: service=`s3`, region=`cn-north-4`, 头部至少签 `host;x-amz-content-sha256;x-amz-date`(临时凭证再加 x-amz-security-token) 3. 公开读: 每个对象 PUT 时带 `x-amz-acl: public-read`(obsutil 老版没有 setacl, boto3 需 `Config(s3={"addressing_style": "virtual"})`) 4. Content-Type 要显式: html=`text/html; charset=utf-8`, mp4=`video/mp4`, wav=`audio/wav`, jpg=`image/jpeg` —— 不然浏览器直接下载而非渲染 5. 上传完对**每个**产物做 HEAD 校验(200 才算成功), publish.py 已内置 6. 二进制绝不进 git(S3 只存产物, git 仓库只存代码/模板/文档) ## 成本参考(2026-08 实测) 1 条 1 分钟视频整套产物 ≈ 25MB(视频23MB+音频2MB+帧+html), OBS 流量费忽略不计。