Minio adalah salah satu aplikasi yang banyak digunakan sebagai pengganti S3 yang bisa di hosting sendiri (self-hosted). Dengan menggunakan Minio, kita bisa menggunakan official SDK s3, yaitu boto3 karena Minio kompatibel dengan S3. Pada tutorial ini kita akan membahas cara konek ke minio dengan python, cara upload satu atau banyak file dan terakhir cara download satu atau banyak file sekaligus.

Menjalankan Minio

Download file binary minio

wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
./minio server /mnt/data --console-address ":9001"

Docker atau Podman

docker run -p 9000:9000 -p 9001:9001 quay.io/minio/minio server /data --console-address ":9001"

setelah menjalankan minio, buka di browser http://IP.ADDRESS:9001 atau http://127.0.0.1:9001. Login dengan user minioadmin dan password minioadmin
minio login ui
Pindah ke menu Access Keys -> Create access key

create a new access keys

create minio access key and secrets key

Simpan Access Key dan Secret Key dari informasi diatas, karena itu yang akan kita gunakan untuk konek ke Minio. Diluar menggunakan Access/Secret key kita bisa menggunakan username/password.

Install boto3

boto3 adalah SDK (Software Development Kit) dari AWS, karena Minio kompatibel dengan S3, maka kita akan menggunakan SDK ini.

pip install boto3
# atau
pip3 install boto3

Script Python

Buat script Python, contoh dengan nama minio.py

import boto3
 
s3_bucket = 'minio-s3'
s3 = boto3.client('s3',
                  endpoint_url='http://IPADDRESS:9000',
                  aws_access_key_id='ACCESS_KEY',
                  aws_secret_access_key='SECRET_KEY')
s3.create_bucket(Bucket=s3_bucket)
# Upload file ke minio
s3.upload_file('/home/jaranguda/files/zstd-1.5.7.tar.gz.gpg', s3_bucket, 'zstd-1.5.7.tar.gz')
# Download file dari minio
s3.download_file(s3_bucket, 'zstd-1.5.7.tar.gz', '/tmp/zstd-1.5.7.tar.gz')
# tampilkan semua file yang ada di bucket s3_bucket
response = s3.list_objects(Bucket=s3_bucket)
for obj in response.get('Contents', []):
    print(obj['Key'])

Ganti IPADDRESS, ACCESS_KEY dan SECRET_KEY dan file yang di upload.

Jalankan minio.py dari terminal

$ python minio.py 
# output
zstd-1.5.7.tar.gz

bila dilihat di /tmp anda akan menemukan file yang tadi kita upload sudah di download kembali dan diletakkan di /tmp

$ ls /tmp/zstd-1.5.7.tar.gz 
/tmp/zstd-1.5.7.tar.gz

Upload Multiple Files

Pada contoh diatas kita hanya upload satu file, untuk upload beberapa file kita perlu memodifikasi script yang digunakan

Contoh file yang akan kita upload ke minio

backup/
└── files
    ├── backup-daily-2025-03-26.tar.gz
    ├── backup-daily-2025-03-27.tar.gz
    ├── backup-daily-2025-03-28.tar.gz
    └── zstd-1.5.7.tar.gz

ubah bagian

import boto
....
....
s3.upload_file('/home/jaranguda/files/zstd-1.5.7.tar.gz.gpg', s3_bucket, 'zstd-1.5.7.tar.gz')

menjadi

import boto
import os
from os import listdir
....
....
files = [f for f in listdir(file_path)]
for file in files:
    print(file)
    s3.upload_file(file_path + file, s3_bucket, file)

hasil menjalankan script

$ python minio.py 
backup-daily-2025-03-26.tar.gz
backup-daily-2025-03-27.tar.gz
backup-daily-2025-03-28.tar.gz
zstd-1.5.7.tar.gz

Download Multiple Files

Untuk cara download banyak file, kita perlu modifikasi, script pada bagian

s3.download_file(s3_bucket, 'zstd-1.5.7.tar.gz', '/tmp/zstd-1.5.7.tar.gz')

menjadi

response = s3.list_objects(Bucket=s3_bucket)
for obj in response.get('Contents', []):
    s3.download_file(s3_bucket, obj['Key'], '/tmp/' + obj['Key'])

jalankan script minio.py, lalu lihat di direktori /tmp

$ ls -1 /tmp/*.tar.gz
/tmp/backup-daily-2025-03-26.tar.gz
/tmp/backup-daily-2025-03-27.tar.gz
/tmp/backup-daily-2025-03-28.tar.gz
/tmp/zstd-1.5.7.tar.gz

Script Lengkap

#!/usr/bin/env python
 
import boto3
import os
from os import listdir
 
# bucket name
s3_bucket = 'minio-s3'
 
# Set up MinIO client
s3 = boto3.client('s3',
                  endpoint_url='http://IPADDRESS:9000',
                  aws_access_key_id='ACCESS_KEY',
                  aws_secret_access_key='SECRET_KEY')
 
# Create S3 bucket
s3.create_bucket(Bucket=s3_bucket)
 
# Upload files in dir
file_path = '/tmp/files/'
files = [f for f in listdir(file_path)]
for file in files:
    print(file)
    s3.upload_file(file_path + file, s3_bucket, file)
 
# Download all files from bucket
response = s3.list_objects(Bucket=s3_bucket)
for obj in response.get('Contents', []):
    s3.download_file(s3_bucket, obj['Key'], '/tmp/' + obj['Key'])

Leave a comment

Your email address will not be published. Required fields are marked *