-- ============================================================================= -- Muse 对象存储主配置(master FileConfig)—— dev / test 可复用、无密钥 provisioning 种子 -- 关联:plan 2026-06-18-001-feat-object-storage-fileservice-plan.md U7 / R4 / R6;U9/U10 真存储往返 IT 依赖 -- 适用库:已含 yudao 基座表 infra_file_config(见 sql/dev/yudao-base-schema-postgres.sql)的 PG 库 -- ============================================================================= -- -- 为什么默认用 LOCAL 文件客户端(storage=10)而非 S3/MinIO: -- 1) 确定性:LOCAL 客户端把字节写到本地文件系统 basePath,导出→存储→下载 round-trip 不依赖 -- 任何外部服务,单测 / 基础 IT 可稳定跑绿,无需起 MinIO。 -- 2) 零密钥(R4):LocalFileClientConfig 只有 basePath + domain,不含 accessKey/accessSecret/endpoint, -- 因此本种子可安全入仓——绝不在仓库 / 测试报告中写任何存储凭据。 -- 3) 私有语义(R6/KTD5):LOCAL 无公网直链,下载只能经后端字节代理(getFileContentByPath), -- 与“桶私有 + 后端字节代理”一致;可暴露 path-keyed 取回的真实行为(不会被公有直链掩盖)。 -- -- 何时改用真 MinIO(R7 反假绿完成门要求的“真对象存储往返”): -- 把下方 [可选 B] 的 S3/MinIO 主配置打开(并把 LOCAL 行的 master 置 false 或不插入)。 -- ⚠️ S3/MinIO 的 accessKey/accessSecret/endpoint 一律走环境变量注入,绝不写进本文件: -- 推荐在 IT 启动期用 env(如 ~/.config/muse-repo/infra.env)读出后,由 IT 代码构造 config JSON -- 或经 FileConfigController/Service 落库,而不是把含密钥的 INSERT 提交到仓库。 -- 私有桶务必 enablePublicAccess=false("enablePublicAccess":false),否则公有桶会让 IT 假绿。 -- -- 幂等:固定 id + ON CONFLICT (id) DO NOTHING,可重复执行。 -- master=true:FileConfigServiceImpl.getMasterFileClient() 经 selectByMaster() 取本行;全库应仅一行 master。 -- ============================================================================= -- ----------------------------------------------------------------------------- -- [默认 A] LOCAL 文件系统主配置(无密钥;id 固定 1001 以便幂等与 IT 引用) -- config 为 LocalFileClientConfig 的 JSON:必须带 "@class"(FileClientConfig 用 @JsonTypeInfo(Id.CLASS))。 -- basePath:本地落盘根目录;IT 可改为临时目录(如 java.io.tmpdir 下子目录)。此处给一个稳定缺省值。 -- domain:仅用于拼装访问 URL(下载不依赖它,走后端字节代理),给占位 http 域即可。 -- ----------------------------------------------------------------------------- INSERT INTO "infra_file_config" ("id", "name", "storage", "remark", "master", "config", "creator", "updater", "deleted") VALUES ( 1001, 'dev-local-master', 10, -- FileStorageEnum.LOCAL 'dev/test 无密钥本地文件系统主配置(U7/U9/U10)', TRUE, '{"@class":"cn.iocoder.muse.module.infra.framework.file.core.client.local.LocalFileClientConfig","basePath":"/tmp/muse-file-storage","domain":"http://127.0.0.1:48080"}', 'system', 'system', FALSE ) ON CONFLICT ("id") DO NOTHING; -- ----------------------------------------------------------------------------- -- [可选 B] S3 / MinIO 主配置(真对象存储往返,R7)——【模板,勿提交真实密钥】 -- 仅当需要真 MinIO 取证时启用;启用时请: -- 1) 注释掉 [默认 A] 或将其 master 改 FALSE(master 全库唯一); -- 2) 把 endpoint/accessKey/accessSecret 从 env 注入,绝不在本文件硬编码; -- 3) 保持 "enablePublicAccess":false(私有桶,R6/KTD5)。 -- 下面用占位符明示结构,故意不可直接执行(${...} 占位,避免误入仓的真密钥): -- -- INSERT INTO "infra_file_config" ("id","name","storage","remark","master","config","creator","updater","deleted") -- VALUES ( -- 1002, 'it-minio-master', 20, -- FileStorageEnum.S3 -- 'IT 真 MinIO 私有桶主配置(密钥经 env 注入,勿入仓)', TRUE, -- '{"@class":"cn.iocoder.muse.module.infra.framework.file.core.client.s3.S3FileClientConfig",' -- || '"endpoint":"${MUSE_MINIO_ENDPOINT}","bucket":"${MUSE_MINIO_BUCKET}",' -- || '"accessKey":"${MUSE_MINIO_ACCESS_KEY}","accessSecret":"${MUSE_MINIO_ACCESS_SECRET}",' -- || '"enablePathStyleAccess":true,"enablePublicAccess":false}', -- 'system','system', FALSE -- ) -- ON CONFLICT ("id") DO NOTHING;