- R4 凭证脱敏(发现真实泄漏):S3/MinIO SdkException 原始 message 内嵌 endpoint/bucket/access key,经 GlobalExceptionHandler 全栈日志 + 落 infra_api_error_log 外泄。FileServiceImpl 在边界 catch SdkException 改抛 ServiceException(FILE_STORAGE_OPERATION_FAIL),只记 errorType、不挂 cause(杜绝 message 经兜底回流)。+2 单测断言假密钥不外泄。
- Provisioning:新增无密钥幂等 LOCAL master FileConfig 种子 sql/dev/muse-file-config-master-seed-postgres.sql(强制走字节代理)+ MinIO env 占位模板。
- RBAC:FileConfigController 全端点 @PreAuthorize('infra:file-config:*') 已满足,无改动。
- FileServiceImplTest 21 绿。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
65 lines
4.6 KiB
SQL
65 lines
4.6 KiB
SQL
-- =============================================================================
|
||
-- 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;
|