oh-my-muse/muse-cloud/sql/dev/muse-file-config-master-seed-postgres.sql
lili 4ceca21f73 feat(infra): 存储 SDK 异常脱敏 + dev/test 文件配置种子 + RBAC 复核 (U7)
- 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>
2026-06-19 00:59:26 -07:00

65 lines
4.6 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- =============================================================================
-- 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;