Gambaran umum
Unggah file yang kompatibel dengan S3 lewat URL terpresign di @repo/storage.
TurboJet menyertakan lapisan penyimpanan file untuk mengunggah gambar, dokumen, dan aset lain ke cloud. Cocok dengan provider kompatibel S3 — AWS S3, Cloudflare R2, DigitalOcean Spaces, MinIO, dan lainnya. Docs dan .env.example default ke Cloudflare R2.
Helper ada di @repo/storage. Endpoint HTTP terautentikasi di-mount di /api/storage pada app marketing.
Belum ada UI unggah
Belum ada UI unggah file di apps/marketing. Package, model Prisma File,
dan route Hono siap dipakai client yang Anda tambahkan sendiri.
Mengunggah di arsitektur serverless
Route handler Next.js (dan Hono di belakangnya) punya batas di platform serverless — waktu eksekusi dan ukuran body. Mengirim file besar lewat API kurang cocok.
TurboJet memakai URL terpresign:
- Client meminta URL unggah berumur pendek dari API (auth dan validasi tetap di server).
- Client mengunggah file langsung ke provider penyimpanan dengan
PUT. - Client mengonfirmasi unggahan agar API menandai baris Prisma
FilesebagaiREADY.
Kredensial tidak pernah sampai ke browser. Anda menghindari batas payload serverless sambil tetap mengatur siapa yang boleh mengunggah.
Panduan
Hubungkan ke penyimpanan S3
Variabel environment, CORS, dan bucket privat.
Unggah file
Unggah terpresign, konfirmasi, dan sketsa client.
Akses file tersimpan
Daftar, URL unduh ter-sign, URL publik, dan hapus.
Panduan provider
Cloudflare R2
Tanpa biaya egress, kompatibel S3 — default yang disarankan.
AWS S3
API S3 asli dan object store yang paling banyak dipakai.
Pertanyaan yang sering diajukan
Provider mana yang cocok?
Semua provider yang mengimplementasikan API S3. Konfigurasi dengan S3_ENDPOINT, kredensial, dan S3_BUCKET. Docker Compose lokal tidak menyertakan MinIO atau SeaweedFS — pakai bucket cloud (atau jalankan layanan S3 sendiri) lalu arahkan env ke sana.
Berapa ukuran unggah maksimum?
API memvalidasi unggahan hingga 10 MB dan mengizinkan jpeg, png, gif, webp, PDF, dan teks polos (packages/validations/src/storage/storage.ts). Karena body file ke provider lewat URL terpresign, batas body serverless tidak berlaku pada biner itu sendiri. Sesuaikan batas Zod jika produk Anda butuh aturan lain.
Bagaimana alur unggah file?
GET /api/storage/upload membuat file PENDING dan mengembalikan URL PUT terpresign. Client mengunggah ke URL itu, lalu memanggil POST /api/storage/confirm untuk menandai file READY. Lihat Unggah file.
Apakah CORS perlu dikonfigurasi?
Ya. Unggahan dari browser bersifat lintas origin ke host penyimpanan. Izinkan origin marketing (NEXT_PUBLIC_MARKETING_URL) untuk PUT, GET, dan HEAD, serta header yang dibutuhkan client (minimal Content-Type). Detail di Setup dan panduan provider.