PROC-02-016 云端存储桶只读核对20261022
七个实际TOS桶的权限、生命周期、跨域配置及保留调整清单,未修改生产配置
后续方向调整:用户随后确认独立实例、独立数据库副本及全新桶。本文保留只读观察与当时的旧桶复用/按令牌分流建议;第3节“优先复用assets桶”等建议已被替代,不作为当前执行清单。最新方案见DEV-X-01-006第7.2~7.4节。本次没有改动旧桶或创建新资源。
1. 范围与方法
用户明确接受桶分工和原件管理简化,要求先核对云端实际配置、列明保留与调整,不直接改生产配置。2026-10-22 12:03—12:11(Asia/Shanghai)通过已有网关作用域凭据及用户已登录的火山引擎控制台只读核对;没有创建/删除桶、修改ACL/Policy/CORS/生命周期、上传/删除对象、部署或调用模型。
先使用S3兼容接口:ListBuckets和6个已知桶各9项只读查询,共55次调用。三只MG桶及Site桶HeadBucket返回200,其余51次查询返回403;管理配置无权读取,不能记成配置为空或桶不存在。随后通过控制台全账号桶列表及7个桶的概览、ACL和Policy读取实际配置,补看assets/media两桶CORS详情及media生命周期规则。CORS只打开详情编辑页阅读,未改字段,均点击取消退出。
本地MG配置仅作为其三个桶名与区域的映射依据,不把本地env当作线上进程配置。MG源码HEAD为8cdf7079a6db463f5b3ef482f9ba7d9cdeff5a1f;本次没有核对所有生产进程的运行制品和Writer。既有new-api与开发链用途依据现行文档及原验收记录,云配置事实与用途推断分开。
2. 云端实际清单
全账号桶列表可见7个桶,均为华北2(北京)、FNS、标准存储、单AZ。以下对象数/容量来自控制台用量概览,约有2小时延迟,不能据此判空、判定无人使用或授权删除。
| 桶名 | 匿名访问 | 桶生命周期 | CORS | 版本控制 / 默认服务端加密显示 | 对象数 / 容量(延迟统计) |
|---|---|---|---|---|---|
| oceanway-assets-cn | 私有 | 未配置 | 1条 | 未开启 / - | 436 / 859.56 MiB |
| oceanway-media-cn | 私有 | 1条,启用,全部资源最后修改7天后删除 | 1条 | 未开启 / - | 1,784 / 4.72 GiB |
| oceanway-files-prod-main-cn | 私有 | 未配置 | 未配置 | 未开启 / SSE-TOS | 29 / 1.43 MiB |
| oceanway-files-prod-temp-cn | 私有 | 未配置 | 未配置 | 未开启 / SSE-TOS | 0 / 0 GiB |
| oceanway-files-prod-replica-cn | 私有 | 未配置 | 未配置 | 未开启 / SSE-TOS | 1 / 378.05 KiB |
| oceanway-site-public-cn | 公共读 | 未配置 | 未配置 | 未开启 / SSE-TOS | 113 / 25.76 MiB |
| oceanway-drama-customer-test-20261021 | 私有 | 未配置 | 未配置 | 未开启 / - | 10 / 8.29 MiB |
-只记录控制台默认服务端加密栏的显示,不推导每个历史对象是否加密。本次不改变加密、版本控制或冗余设置;“单业务原件”也不意味着关闭云存储自身的冗余机制。桶名含prod不证明已接入当前Platform主链;临时桶名称也不证明存在自动清理。
2.1 生命周期重点
media桶规则名为delete-video-after-7-days,实际范围为“存储桶内所有资源”,处理规则为“文件最后修改时间7天后,将自动删除”,状态启用。规则并不限于视频,不能在该桶放入需长期保存的图片/画布原件,再仅依靠业务数据库保留记录保护。 本次没有检查逐对象引用,因此不声称已经发生误删。
核对后的需求澄清(用户确认): 7天删除源于new-api-new-oceanway旧业务,开发阶段暂不需要。新链上传、生成及辅助临时文件均不新增或继承该规则;这一澄清已补入素材存储方案,不改变上表记录的云端现状,也不表示已关闭旧规则。
其他6桶的概览显示桶生命周期未配置。未逐桶检查ObjectSet独立/Tag规则、应用清理任务、逐对象ACL、保留锁或所有IAM授权;“桶生命周期未配置”不等于所有删除路径均不存在。旧客户media链保留原配置,新链长期文件落到无年龄删除规则的正式位置;不直接取消整桶7天规则去改变旧客户保留行为。
2.2 权限
7桶的桶ACL中,所有用户的桶权限与ACL权限均为-;公共读Site桶通过Bucket Policy授权,不能仅凭ACL表判断私有。
| 桶 | 可见Bucket Policy | 判断边界 |
|---|---|---|
| assets | 两条:既有media uploader对全桶对象Get/Put/Delete,以及ListBucket | 保留现用主体;新Files身份是否具备所需权限另核IAM,不借重构直接扩大或撤销现用权限 |
| media | 一条:同一既有主体对全桶对象Get/Put/Delete | 既有客户路径保留 |
| MG main/temp/replica | Policy列表均暂无数据 | 不等于没有权限;IAM仍可能授权,已有凭据HeadBucket成功 |
| Site | 所有用户可HeadBucket、GetObject、GetObjectVersion;未在此策略授权ListBucket或写入 | 明确公开资源,与私有业务原件保持隔离 |
| Drama测试 | 专用开发文件身份可Head/List/Get/Put/Delete/AbortMultipartUpload/ListMultipartUploadParts | 保留测试隔离,不擅自转生产、扩大使用或清理 |
没有进行匿名写入、删除或客户对象读取测试,不将控制面配置等同于逐对象数据面验收。
2.3 CORS
assets和media的允许来源相同:https://oceanway.tech、https://uumi.lol、https://api.uumi.lol、https://new.ocean-way.top,均无通配符子域。两者Max-Age为3600秒,开启Vary: Origin,Expose-Headers为ETag、Content-Length、Content-Range、Accept-Ranges。
- assets允许PUT/GET/POST/HEAD;Allow-Headers为Content-Type、Range、x-amz-*。
- media仅允许GET/HEAD;Allow-Headers为Content-Type、Range。
- 其余5桶概览显示未配置CORS。
现有规则没有显式包含Studio/Drama子域及本地开发Origin。若浏览器直接fetch文件、读取响应头、直传或将跨域图片用于可导出的canvas,这些来源需要在实际入口确定后单独验证与配置。普通img显示、导航下载、服务端取图和浏览器fetch的行为不同;本次没有做浏览器数据面复现,不能直接认定当前所有加载故障都由CORS导致。供应商服务端取URL不受浏览器CORS约束,但仍需URL可达与授权有效。
3. 保留、调整与退出新链
以下是方案落地清单,没有执行其中的云配置或运行接线变更。
| 实际桶 | 保留 | 后续调整 |
|---|---|---|
| oceanway-assets-cn | 既有正式原件、私有访问、现用授权及引用 | 优先复用为统一业务文件落点;新上传/生成直接写最终对象键,预览用独立前缀;按实际产品Origin补CORS,禁止新增整桶年龄删除 |
| oceanway-media-cn | 现有客户交换路径、对象及7天规则 | 新开发链不进入其7天规则范围,也不将其作为常规转正式的必经站;若需改变旧业务规则,另列精确受影响范围 |
| oceanway-files-prod-temp-cn | 私有桶及既有内容/任务 | 后续仅作辅助临时处理;开发阶段不新增或继承7天自动删除,不默认配置TTL;未来定时清理按实际需要另定 |
| oceanway-files-prod-main-cn | 现存对象、历史读取与原任务 | MG新链结果改由同一Files Owner登记到正式业务位置,退出第二份业务原件写入;不批量搬迁或立即删除 |
| oceanway-files-prod-replica-cn | 现存对象和仍有效的历史依赖 | 后续退出新链强制配置、启动探测及同步副本写入;不把“退出新链”解释为当前删桶 |
| oceanway-site-public-cn | 独立公开发布用途和现有分发 | 私有素材不放进该桶;新增公开业务须明确发布/撤销语义,不能自动扩大Site桶用途 |
| oceanway-drama-customer-test-20261021 | 测试隔离、现存证据及运行依赖 | 不并入生产,不因名称含test就清理;如退出须由测试Owner核对具名清单 |
目标是三种用途分工,不是立刻把7个物理桶删成3个。平台、产品与Files不新建一套重复原件桶;旧客户链、测试隔离和有效历史引用保持各自范围。
4. 原件管理简化的代码依据与目标
MG的internal/platform/objectstore/buckets.go把temporary/main/replica三个不同物理桶列为必需;internal/assets/transfer.go的两条发布路径先临时Put,再主桶Put,再同步尝试副本Put,最后Publish。副本错误被记录为不可用,而非一律阻断发布,但调用等待仍在发布之前。此为本地源码事实,不证明线上当前使用这条链或已经测得延迟。
目标写入流程为:持久上传/结果意图 → 最终不可变对象键一次写入并校验 → 文件就绪 → 产品素材/画布关联。对象在正式桶并不等于就绪,未校验不得签发读取;未知ACK查原身份和确定对象,不改键重新写。生成输出保存失败只恢复保存,不重新生成。
预览可重建,与原件读取独立;普通读取仅核权和签发地址,不重新adopt或追生成账务。删除先提交本处解绑及outbox,界面可先移除节点;远端清理未完成仍标为待处理,有其他引用不物删。取消原件流程等待不取消权限、不可变内容、幂等和最后引用保护。
5. 证据与未覆盖项
本机脱敏证据目录:/Users/wangzihao/.codex/visualizations/2026/10/21/01a15ce9-52a1-7131-a3b6-da75259ef02f/bucket-audit/。
s3-readonly.json:逐项HTTP状态,未保存凭据和签名URL。console-readonly.json:控制台概览、ACL/Policy、CORS与media生命周期的文本/结构化观察,账户编号脱敏。read_buckets.py:只读API白名单,无对象内容下载及写入方法。manifest.json:上述文件摘要及读写边界。
本次不读取客户素材正文,不扫描逐对象引用,不盘点全部IAM或生产进程,不验证CDN、完整上传/下载性能、全部清理任务和多URL供应输入;这些不因完成桶配置核对而自动通过。后续实现按总体方案及实施规格验收。
后续业务分流澄清与源码核对
用户确认new-api-new-oceanway按旧顾客与当前OceanWay分流,每份结果只写所属业务的一桶;用户已纠正先前“UUMI”为“OceanWay”。目标是旧业务沿用原桶,OceanWay进入无7天自动删除的正式业务存储。该条是目标需求,不代表云端或代码已切换。
本地源码只读核对:/Users/wangzihao/Projects/new-api-new-oceanway,HEAD为175ebec55da7352766d6f3f1a049ecf4f986410d;工作区读取结果不等同已部署制品。middleware/auth.go的SetupContextForToken设置鉴权后的用户及令牌ID;service/async_image.go在非Playground任务中持久化TokenId,说明已有身份基础,但不证明线上已配置OceanWay专用绑定。service/image_output_archive.go的归档器通过全局环境配置创建S3MediaStorage;service/media_storage.go读取全局S3_BUCKET,且存在7天默认保留参数。因此仅调整桶名不足以完成业务分流,需实施规格7.2中的策略选择、任务固定位置及应用清理隔离。
本次未核对线上调用凭据绑定,未验证所有视频/Playground路径;未改业务代码、生产配置或云端对象。详细设计与验收新增在DEV-X-01-005及DEV-X-01-006。
后续制品核对修正: 上述HEAD只读结论不能代表线上全部分支。2026-10-22进一步核对实际运行revision 8c243f103078,已存在异步图片直接写permanentBucket的原件分支;身份、凭据映射及覆盖缺口见PROC-02-017。原有云桶配置观察不变。