feat: add aliyun oss storage foundation

This commit is contained in:
xiong
2026-07-26 14:43:04 +08:00
parent 47613b51bd
commit c6051f95f2
13 changed files with 969 additions and 0 deletions

View File

@@ -98,6 +98,17 @@ Tiku.IntegrationTests # EF 模型/持久化约束测试
- 当前先在小范围权限判断里落模板,后续题库筛选、权限集合、菜单/内容树投影等热路径再逐步使用。
- 不是为了炫技替换所有 LINQ只在明确高频、低收益分配明显的路径使用。
### 对象存储
- 旧 Nest 后端资源层使用 Node `ali-oss`,不是 Supabase Storage 专用模型。
- 新后端使用 `AlibabaCloud.OSS.V2` 作为阿里云 OSS SDK对齐旧版的 provider / bucket / objectKey / signed URL / HEAD metadata 语义。
- Application 层只依赖 `IObjectStorageService`,不直接依赖阿里云 SDKSDK 细节收敛在 Infrastructure。
- 默认对象 key 要带租户前缀,例如 `{tenantId}/...`,避免多租户资源混放后靠人工约定隔离。
- 上传签名前会校验 MIME allowlist、文件大小、provider 是否支持托管上传。
- 下载时如果资源已有可信 `cdnUrl`,直接返回 provider-managed URL否则由后端在通过业务授权后签发临时 URL。
- 上传确认使用 OSS HEAD metadata后续可用于校验大小、MIME、ETag、SHA256 metadata 和安全扫描状态。
- 不再把 Supabase Storage 作为默认后端存储;如果历史数据里存在 Supabase provider只作为迁移兼容对象处理不作为新架构依赖。
## 数据库策略
当前数据库以 PostgreSQL 为核心能力,而不是把 PostgreSQL 当成普通 KV 存储:
@@ -213,6 +224,18 @@ Tiku.Infrastructure/Persistence/Migrations/20260725220742_InitialSchema.cs
- 后台 Worker 使用最小权限的应用服务,不直接绕过业务规则写库。
- 对账、导入、批处理任务要求幂等键和可重跑设计。
- 生产环境连接串、密钥、对象存储凭据不进入仓库。
- OSS 凭据通过配置/环境变量/secret 注入,兼容旧版环境变量:
- `STORAGE_DEFAULT_PROVIDER`
- `STORAGE_DEFAULT_BUCKET`
- `STORAGE_PUBLIC_BASE_URL`
- `STORAGE_REQUIRE_TENANT_PREFIX`
- `STORAGE_MAX_UPLOAD_BYTES`
- `ALIYUN_OSS_REGION`
- `ALIYUN_OSS_ENDPOINT`
- `ALIYUN_OSS_ACCESS_KEY_ID`
- `ALIYUN_OSS_ACCESS_KEY_SECRET`
- `ALIYUN_OSS_STS_TOKEN`
- `ALIYUN_OSS_INTERNAL`
## 常用命令