use-case
媒体与对象存储管理员手册:Profile、权限和生命周期
直接答案按用途绑定独立存储 Profile,先测试连接再保存并同步生命周期;生成与中转结果可按期限清理,合规和消息资产应使用私有代理与独立保留策略,签名 URL 与公开 URL 都按凭证管理。
更新 · 审核信息
小白:Profile 与用途不是一回事
在 /console/setting 的存储区域配置 Profile。Profile 是一套提供商、Endpoint、Bucket、凭据、路径、访问模式和生命周期连接;用途映射决定 compliance、generated、staging、message_assets、base64_error_url 分别使用哪套连接。不要因为 Bucket 相同就把所有用途混成一个安全边界。
本站支持阿里云 OSS、标准 S3 兼容存储、Storage Tong 和任务报告上传。message_assets 必须绑定私有代理 Profile,且不支持任务报告上传类型;base64_error_url 只接受标准 S3 或阿里云 OSS。启用的 Profile 必须配置完整。
最小安全配置
使用独立服务账号和最小 Bucket/前缀权限,Endpoint 必须是可信 HTTP/HTTPS 主机,生产优先 HTTPS;内网 Endpoint 仅用于可信同区域网络。公开模式只用于确认可公开的结果,合规资料和消息资产用 private。CDN、自定义域名和 Bucket CORS 仍需独立限制来源、方法和缓存。
{
"id": "generated-s3",
"provider": "s3",
"enabled": true,
"region": "auto",
"use_path_style": true,
"endpoint": "https://s3-compatible.example",
"bucket": "generated-assets",
"path_template": "generated/${YYYY}/${MM}/${DD}/${model}-${hash8}",
"access_mode": "public",
"lifecycle_enabled": true,
"expiration_days": 30
}
响应不会回显 Access Key Secret 或 STS JWT Secret,只返回“已配置”标志。编辑已有 Profile 时留空 Secret 会保留旧值;这不等于可以从接口还原明文。
测试、保存与生命周期同步
正确顺序是:用 POST /api/storage/profiles/{id}/test 测待保存配置 → PUT /api/storage/profiles 原子保存 Profiles 与用途映射 → POST /api/storage/lifecycle/sync 同步规则 → 到存储提供商核对规则。三条接口均要求运营身份和“设置”权限。
连接测试会上传并清理一个小对象,因此测试凭据也需要对应的写入与删除权限。生命周期同步会保留其他规则,并按本站规则 ID 更新当前 Profile 的前缀规则;启用前核对前缀不会覆盖长期保留区。存储提供商的到期删除通常不是实时发生,不能把精确删除时刻当作业务承诺。
公开、私有代理与签名 URL
public 会生成可直接访问的对象 URL;private 应经本站鉴权代理交付。签名 URL 是限时 bearer 凭证:拿到 URL 的人可在过期前执行其签名操作。缩短有效期、绑定单对象和单方法,不在 Referrer、分析系统、聊天记录或错误日志中暴露。
上游远程图片会经过 SSRF 防护客户端探测,元数据读取限制在 512 KiB,但运营仍应限制可用上游和出口网络。渠道的 image_storage_enabled 只决定是否保存/代理结果 URL,不会替代 Bucket 权限、内容审核或生命周期。
保留、清理与数据库一致性
默认用途设计是:生成结果公开且 30 天、临时中转公开且 3 天、合规资料私有且不自动到期;这是初始值,不是法律保留建议。消息资产自动准备为私有、无生命周期的独立 Profile。真正期限应由产品、合同与合规负责人批准。
内容资产清理只在主节点执行,按 50 条批次流式排空:未绑定临时资产默认 24 小时后、已解绑资产宽限 1 小时后进入清理;对象删除失败默认 15 分钟后重试,单次删除超时 30 秒。生命周期是存储侧兜底,数据库清理是应用侧一致性,两边都要监控。
故障恢复与验证
上传失败先分清 DNS/TLS、Endpoint、Region、Path Style、凭据、Bucket、KMS、CORS 和配额。下载 403 检查访问模式、代理鉴权、签名过期与时钟;404 检查对象键模板、生命周期和上游结果过期;清理失败检查删除权限、对象锁与版本控制。
变更 Endpoint、Bucket 或用途映射前先导出配置和对象清单,使用新 Profile 做双写/抽样读,再切用途映射。不要直接复用旧 Profile ID 指向另一个 Bucket,否则历史对象引用会失去语义。恢复演练应覆盖凭据轮换、Bucket 不可用、生命周期误配、数据库恢复后对象缺失和 CDN 缓存未失效。
专家:观测与审计
指标至少包含按 Profile/用途的上传成功率、首字节与完整耗时、字节数、删除失败、清理积压、最老孤儿、生命周期同步结果、403/404、出口流量和存储费用。日志只记录 Profile ID、用途、对象键摘要、MIME、大小、状态、Request-ID 和任务 ID;不记录 Secret、完整签名 URL、Base64 或敏感原文。
每季度核对用途映射、最小权限、公开访问、CORS、生命周期、版本控制、对象锁、加密、备份与恢复点。对生成结果做随机抽样读,对数据库与对象存储做双向孤儿盘点;删除策略变更先在测试前缀验证,再逐步扩展。
适用场景
- 配置生成、暂存、合规与消息资产存储
- 设计公开、私有代理和签名 URL 边界
- 同步生命周期并排查上传、下载和清理失败
FAQ
所有媒体都可以放进同一个公开 Bucket 吗?
不建议。生成结果、临时中转、合规资料和消息资产的访问与保留要求不同,应按用途绑定独立 Profile;敏感内容使用私有代理。
保存 Profile 后生命周期会自动生效吗?
只有启用生命周期且过期天数大于零的兼容 Profile 才会同步规则。保存后应调用同步并在存储侧核对前缀、天数和已有规则。
签名 URL 可以写进日志方便排障吗?
不可以。签名 URL 在有效期内等同持有指定对象操作权限的 bearer 凭证,日志只保留 Profile ID、对象键摘要、状态和过期时间。
为什么数据库记录删除了,对象仍然存在?
数据库清理与对象存储删除可能分别失败。应观察清理失败、下次重试时间和对象删除结果,并用 Inventory 或抽样核对孤儿对象。
关联指南
官方来源
- Amazon S3 Lifecycle Configuration Elements Official
- Amazon S3 Security Best Practices Official
- Cloudflare R2 Presigned URLs Official
兔子API