スターターアプリ
非公開 storage upload
policy、entitlement、quota、checksum、永続削除を備えた S3 互換の非公開 upload を設定します。
スターターのコミット
7d452a6と同期済みです。
STORAGE_PROVIDER を s3、r2、minio にし、bucket、region、endpoint、credential を設定します。object は非公開で browser は短期 presigned URL のみ受け取ります。Web origin と PUT header の CORS を設定し、provider が要求しない ACL は使いません。
Upload 契約
POST /api/storage/uploadsは組織、storage.upload、policy(general、images、documents、verified)、type、plan/env/policy の最小 size cap を検証し quota を原子的に予約します。- browser は object storage に直接 PUT し、XHR は進捗表示だけに使います。
POST /api/storage/uploads/completeが metadata と任意 SHA-256 を確認して active にします。GET /api/storage/files/[uuid]?download=1が組織限定の署名 URL を返します。DELETE /api/storage/files/[uuid]が soft-delete し永続storage_object_deletejob を登録します。
未完了 upload は 1 時間後に予約を解放します。削除は queue で再試行するため cron が必要です。object key は service が生成し、client に選ばせません。
全 flow、不正 MIME/checksum、quota race、期限切れ URL、組織越境、削除 retry、cleanup をテストします。CORS 詳細はスターターの docs/storage-providers.md を参照してください。