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 / R6U9/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) 零密钥R4LocalFileClientConfig 只有 basePath + domain不含 accessKey/accessSecret/endpoint
-- 因此本种子可安全入仓——绝不在仓库 / 测试报告中写任何存储凭据。
-- 3) 私有语义R6/KTD5LOCAL 无公网直链下载只能经后端字节代理getFileContentByPath
-- 与“桶私有 + 后端字节代理”一致;可暴露 path-keyed 取回的真实行为(不会被公有直链掩盖)。
--
-- 何时改用真 MinIOR7 反假绿完成门要求的“真对象存储往返”):
-- 把下方 [可选 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=trueFileConfigServiceImpl.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 改 FALSEmaster 全库唯一);
-- 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;