Skip to content

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 .env via python-dotenv.

Repository

KeyValue
Git Remotehttps://git.tlab.co.id/tarantula/service/minio-uploader.git
Branch Aktifmain
bash
git clone https://git.tlab.co.id/tarantula/service/minio-uploader.git
cd minio-uploader

Tech Stack

LayerTeknologi
RuntimePython 3.11
FrameworkFastAPI + uvicorn
Storage Clientminio Python SDK
Configpython-dotenv (.env file langsung, tanpa Infisical)
Uploadpython-multipart (multipart/form-data)
ContainerizationDocker (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-uploader

Environment Variables

Semua konfigurasi dibaca dari file .env via python-dotenv. Tidak ada Infisical.

File .env

bash
MINIO_ENDPOINT=minio:9000
MINIO_ACCESS_KEY=
MINIO_SECRET_KEY=
MINIO_BUCKET=tarantula-api
MINIO_DOMAIN=https://s3.ziwardingai.xyz
VariableDefaultKeterangan
MINIO_ENDPOINTminio:9000Host:port MinIO server (tanpa http://)
MINIO_ACCESS_KEYAccess key MinIO (wajib)
MINIO_SECRET_KEYSecret key MinIO (wajib)
MINIO_BUCKETtarantula (default di kode) / tarantula-api (di .env.sample)Nama bucket tujuan; dibuat otomatis jika belum ada
MINIO_DOMAINBase 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

MethodPathKeterangan
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 MinIO

Minimal satu dari images atau files harus diisi.

Response 200 OK:

json
{
  "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

KondisiPath imagesPath files
folder_path tidak diisiupload-api-service/jajal/images/upload-api-service/jajal/files/
folder_path=my-projectmy-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 TypeEkstensi
image/png.png
image/jpeg.jpg, .jpeg
image/jpg.jpg
video/mp4.mp4
video/quicktime.mov

Files (Content-Type):

MIME TypeEkstensi
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 Request jika 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)

yaml
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:
      - minio

Build & Run

bash
# 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