feat: add configurable S3 object storage

This commit is contained in:
237899745
2026-07-25 13:23:11 +08:00
parent 61fa9cb820
commit d1f093685d
29 changed files with 3703 additions and 284 deletions

View File

@@ -341,7 +341,14 @@ CREATE TABLE tasks (
completed_at TIMESTAMPTZ,
-- 到期清理:匿名可默认 24h登录用户应由应用按套餐写入更长 retention
expires_at TIMESTAMPTZ NOT NULL DEFAULT (NOW() + INTERVAL '24 hours')
expires_at TIMESTAMPTZ NOT NULL DEFAULT (NOW() + INTERVAL '24 hours'),
retention_hours INTEGER NOT NULL DEFAULT 24,
zip_storage_backend VARCHAR(16),
zip_storage_endpoint_id UUID REFERENCES storage_endpoints(id) ON DELETE RESTRICT,
zip_storage_key TEXT,
zip_storage_etag TEXT,
zip_size BIGINT
);
CREATE INDEX idx_tasks_user_id ON tasks(user_id);
@@ -365,7 +372,12 @@ CREATE TABLE task_files (
compressed_size BIGINT,
saved_percent DECIMAL(6, 2),
storage_path VARCHAR(500), -- S3 key 或本地路径
storage_path VARCHAR(500), -- 兼容旧版本本地成品路径
input_path TEXT, -- 批任务原图临时路径,处理后清空
storage_backend VARCHAR(16) NOT NULL DEFAULT 'local',
storage_endpoint_id UUID REFERENCES storage_endpoints(id) ON DELETE RESTRICT,
storage_key TEXT,
storage_etag TEXT,
status file_status NOT NULL DEFAULT 'pending',
error_message TEXT,
@@ -377,6 +389,12 @@ CREATE INDEX idx_task_files_task_id ON task_files(task_id);
CREATE INDEX idx_task_files_status ON task_files(status);
```
### 4.9.1 storage_endpoints - S3 端点
端点凭据使用 `API_KEY_PEPPER` 派生密钥并通过 AES-256-GCM 加密。每个对象保存自己的 `storage_endpoint_id`,因此切换活动端点不会影响历史对象。活动端点和仍有关联对象的端点不能删除;管理端删除采用软归档,待无引用 30 天后由 Worker 清理配置。
同一时间只允许一个 `is_active = true` 的端点接收新对象。没有配置活动端点时系统使用 `STORAGE_PATH` 本地回退。
### 4.10 idempotency_keys - 幂等记录
```sql
CREATE TABLE idempotency_keys (