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
Pindah ke menu Access Keys
-> Create access 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'])