Teknis — Minio Uploader
Service file upload ke MinIO RAGA yang dibangun di atas Python + FastAPI. Menerima file gambar dan dokumen via multipart form, memvalidasi tipe MIME dan ukuran, lalu menyimpannya langsung ke MinIO object storage secara streaming. URL publik file dikembalikan langsung setelah upload selesai. Digunakan oleh api-tarantula sebagai storage backend untuk file yang diunggah user.
Catatan: Service ini tidak menggunakan Infisical — konfigurasi dibaca langsung dari file
.envviapython-dotenv.
Repository
| Key | Value |
|---|---|
| Git Remote | https://git.tlab.co.id/tarantula/service/minio-uploader.git |
| Branch Aktif | main |
git clone https://git.tlab.co.id/tarantula/service/minio-uploader.git
cd minio-uploaderTech Stack
| Layer | Teknologi |
|---|---|
| Runtime | Python 3.11 |
| Framework | FastAPI + uvicorn |
| Storage Client | minio Python SDK |
| Config | python-dotenv (.env file langsung, tanpa Infisical) |
| Upload | python-multipart (multipart/form-data) |
| Containerization | Docker (python:3.11-slim) |
Struktur Folder
minio-uploader/
├── app.py # FastAPI app + semua logika upload
├── requirements.txt
├── .env.sample
├── Dockerfile # Image dev/lokal (python:3.11-slim)
├── Dockerfile.stag # Image staging/production (python:3.11, dipakai CI deploy)
└── docker-compose.yml # Dev setup: MinIO + minio-uploaderEnvironment Variables
Semua konfigurasi dibaca dari file .env via python-dotenv. Tidak ada Infisical.
File .env
MINIO_ENDPOINT=minio:9000
MINIO_ACCESS_KEY=
MINIO_SECRET_KEY=
MINIO_BUCKET=tarantula-api
MINIO_DOMAIN=https://s3.ziwardingai.xyz| Variable | Default | Keterangan |
|---|---|---|
MINIO_ENDPOINT | minio:9000 | Host:port MinIO server (tanpa http://) |
MINIO_ACCESS_KEY | — | Access key MinIO (wajib) |
MINIO_SECRET_KEY | — | Secret key MinIO (wajib) |
MINIO_BUCKET | tarantula (default di kode) / tarantula-api (di .env.sample) | Nama bucket tujuan; dibuat otomatis jika belum ada |
MINIO_DOMAIN | — | Base URL publik MinIO (contoh: https://s3.ziwardingai.xyz); digunakan untuk menyusun URL response (wajib) |
Koneksi ke MinIO dibuat dengan
secure=False— pastikan endpoint adalah internal network atau sudah di-reverse-proxy dengan TLS di luar.
Endpoint
| Method | Path | Keterangan |
|---|---|---|
POST | /upload/ | Upload gambar dan/atau dokumen ke MinIO |
POST /upload/
Content-Type: multipart/form-data
images (List[UploadFile], opsional) — file gambar / video
files (List[UploadFile], opsional) — file dokumen
folder_path (str, query param, opsional) — root folder di MinIOMinimal satu dari images atau files harus diisi.
Response 200 OK:
{
"images": [
"https://s3.ziwardingai.xyz/tarantula-api/my-project/dokumen.png"
],
"files": [
"https://s3.ziwardingai.xyz/tarantula-api/my-project/laporan.pdf"
]
}Logika Folder Path
| Kondisi | Path images | Path files |
|---|---|---|
folder_path tidak diisi | upload-api-service/jajal/images/ | upload-api-service/jajal/files/ |
folder_path=my-project | my-project/ | my-project/ |
Saat folder_path diisi, gambar dan file disimpan di folder yang sama (tidak ada subfolder images/ atau files/ yang ditambahkan). Object name final: {folder}/{filename}.
Validasi File
Tipe yang Diizinkan
Images (Content-Type):
| MIME Type | Ekstensi |
|---|---|
image/png | .png |
image/jpeg | .jpg, .jpeg |
image/jpg | .jpg |
video/mp4 | .mp4 |
video/quicktime | .mov |
Files (Content-Type):
| MIME Type | Ekstensi |
|---|---|
application/pdf | .pdf |
application/vnd.openxmlformats-officedocument.wordprocessingml.document | .docx |
text/plain | .txt |
application/vnd.openxmlformats-officedocument.presentationml.presentation | .pptx |
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | .xlsx |
text/csv | .csv |
application/json | .json |
Batas Ukuran
- Maksimum 100 MB per file
- Error
400 Bad Requestjika melebihi batas atau tipe MIME tidak valid
Alur Upload
Upload dilakukan secara streaming (upload_to_minio_direct) — file tidak dibaca seluruhnya ke memory, hanya ukuran yang di-seek lalu di-stream langsung ke MinIO via put_object.
Docker
docker-compose.yml (dev)
services:
minio:
image: minio/minio
environment:
MINIO_ROOT_USER: minioAccessKey
MINIO_ROOT_PASSWORD: minioSecretKey
volumes:
- minio_data:/data
ports:
- "9000:9000" # S3 API
- "9090:9001" # MinIO Console
command: ["server", "--console-address", ":9001", "/data"]
minio-uploader:
container_name: minio-uploader
build: .
volumes:
- .:/app
env_file: .env
ports:
- "8000:8000"
depends_on:
- minioBuild & Run
# Install dependencies
pip install -r requirements.txt
# Jalankan development (pastikan .env sudah diisi)
uvicorn app:app --reload --port 8000
# Docker Compose (dev — include MinIO lokal)
docker compose up --build
# Docker build & run standalone
docker build -t minio-uploader .
docker run -p 8000:8000 \
-e MINIO_ENDPOINT=minio:9000 \
-e MINIO_ACCESS_KEY=your-access-key \
-e MINIO_SECRET_KEY=your-secret-key \
-e MINIO_BUCKET=tarantula-api \
-e MINIO_DOMAIN=https://s3.ziwardingai.xyz \
minio-uploader