文档
07 过程记录02_验收证据

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-TOS29 / 1.43 MiB
oceanway-files-prod-temp-cn私有未配置未配置未开启 / SSE-TOS0 / 0 GiB
oceanway-files-prod-replica-cn私有未配置未配置未开启 / SSE-TOS1 / 378.05 KiB
oceanway-site-public-cn公共读未配置未配置未开启 / SSE-TOS113 / 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/replicaPolicy列表均暂无数据不等于没有权限;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。原有云桶配置观察不变。

On this page