Butuh object storage yang kompatibel dengan S3 API tanpa perlu setup server sendiri? Helipod menyediakan Bucket service berbasis MinIO — S3-compatible, siap pakai dalam hitungan menit, dan bisa langsung diakses dari aplikasi maupun terminal lokal kamu.
Di artikel ini kita akan deploy bucket, konfigurasi variabel, generate domain publik, lalu langsung coba upload file dari terminal menggunakan AWS CLI. Termasuk penjelasan tentang path-style vs virtual-hosted-style dan opsi konfigurasi MinIO lainnya.
Yang Kamu Butuhkan
Sebelum mulai, pastikan kamu sudah punya:
- Akun Helipod (daftar gratis di helipod.io)
- AWS CLI terinstall di lokal (panduan install)
- Project yang sudah dibuat di Helipod
Langkah 1: Tambah Service Bucket
Buka project kamu di dashboard Helipod, lalu klik + Add Service di pojok kanan atas canvas.
Di dialog New deployment yang muncul, pilih Bucket — deskripsinya: S3-compatible bucket for managing files, media, and assets.
Helipod akan otomatis membuat service MinIO dan menambahkannya ke canvas project kamu.
Langkah 2: Konfigurasi Environment Variables
Setelah service bucket terbuat, klik service tersebut di canvas lalu buka tab Variables.
Variabel Wajib
Tiga variabel ini harus selalu diset:
MINIO_ROOT_USER=nama-user-kamu
MINIO_ROOT_PASSWORD=password-yang-kuat
MINIO_API_CORS_ALLOW_ORIGIN=*
Tips keamanan: Gunakan password yang kuat untuk
MINIO_ROOT_PASSWORD— minimal 8 karakter. Nilai ini akan menjadi Secret Access Key kamu saat mengakses bucket via AWS CLI. Variabel di Helipod dienkripsi at rest dan tidak pernah muncul di build logs.
Variabel Opsional dan Konfigurasi Lanjutan
MinIO mendukung banyak variabel environment untuk menyesuaikan perilakunya. Berikut opsi-opsi yang paling sering dibutuhkan:
Addressing Style: Path-Style vs Virtual-Hosted-Style
Ini adalah pengaturan yang paling penting untuk kompatibilitas dengan berbagai SDK dan tool.
Virtual-hosted-style (default AWS): bucket name menjadi subdomain.
https://my-bucket.nama-bucket.helipod.app/object.jpg
Path-style: bucket name menjadi bagian dari path URL.
https://nama-bucket.helipod.app/my-bucket/object.jpg
Karena Helipod menggunakan satu magic domain (bukan wildcard subdomain), path-style adalah pilihan yang lebih praktis — tidak memerlukan konfigurasi DNS tambahan per bucket.
Untuk mengaktifkan path-style di MinIO, set variabel berikut:
MINIO_API_SELECT_PARQUET=off
MINIO_DOMAIN=nama-bucket.helipod.app
Lalu saat menggunakan AWS CLI dari lokal, tambahkan flag --no-sign-request untuk bucket publik, atau gunakan config s3.addressing_style:
# Cara 1: flag per-command
aws s3 ls s3://my-bucket \
--endpoint-url https://nama-bucket.helipod.app \
--profile minio
# Cara 2: set addressing style di config AWS CLI (direkomendasikan)
aws configure set s3.addressing_style path --profile minio
Dengan addressing_style = path, AWS CLI akan selalu menggunakan path-style tanpa perlu flag tambahan.
Atau edit langsung file ~/.aws/config:
[profile minio]
region = us-east-1
output = json
[profile minio.s3]
addressing_style = path
Konfigurasi Storage & Performa
# Batas ukuran upload multipart (default: 16MB per part)
MINIO_API_REPLICATION_WORKERS=10
# Set timezone untuk timestamp logs
TZ=Asia/Jakarta
# Aktifkan compression untuk objek yang disimpan (hemat storage)
MINIO_COMPRESS_ENABLE=on
MINIO_COMPRESS_EXTENSIONS=.txt,.log,.csv,.json,.xml
MINIO_COMPRESS_MIME_TYPES=text/plain,application/json,text/csv
Konfigurasi CORS Spesifik
Untuk production, hindari * dan gunakan domain spesifik:
# Izinkan dari satu domain
MINIO_API_CORS_ALLOW_ORIGIN=https://app.kamu.com
# Izinkan dari beberapa domain (pisahkan dengan koma)
MINIO_API_CORS_ALLOW_ORIGIN=https://app.kamu.com,https://staging.kamu.com
Site & Region
# Set nama region (opsional, untuk kompatibilitas dengan SDK tertentu)
MINIO_SITE_REGION=ap-southeast-3
MINIO_SITE_NAME=helipod-bucket
Ringkasan Semua Variabel
| Variabel | Default | Keterangan |
|---|---|---|
MINIO_ROOT_USER |
— | Wajib. Username / Access Key ID |
MINIO_ROOT_PASSWORD |
— | Wajib. Password / Secret Access Key (min 8 karakter) |
MINIO_API_CORS_ALLOW_ORIGIN |
— | Wajib. * untuk semua origin |
MINIO_DOMAIN |
— | Set jika ingin virtual-hosted-style dengan domain sendiri |
MINIO_BROWSER |
on |
Set off untuk nonaktifkan Console UI |
MINIO_SITE_REGION |
us-east-1 |
Region identifier |
MINIO_COMPRESS_ENABLE |
off |
Aktifkan kompresi objek |
TZ |
UTC | Timezone untuk logs |
Klik + New variable untuk menambahkan variabel yang kamu butuhkan, lalu klik Deploy untuk menerapkan perubahan.
Langkah 3: Generate Magic Domain dan Point ke Port 9000
MinIO berjalan di port 9000 untuk S3 API. Kamu perlu memastikan domain publik sudah diarahkan ke port ini.
Buka tab Settings pada service bucket, lalu scroll ke bagian Networking & Domains.
Kamu akan melihat dua entry:
- Internal DNS — hostname privat untuk komunikasi antar pod di dalam cluster, tidak perlu diubah
- Magic domain — domain publik yang otomatis digenerate Helipod, format:
nama-bucket.helipod.app
Pastikan routing magic domain sudah menunjuk ke port :9000:
Internet :443 → Traefik → :9000 your app
Magic domain inilah yang akan kita gunakan sebagai S3 endpoint dari terminal lokal.
Langkah 4: Akses dari Terminal Lokal via AWS CLI
Bucket kamu sudah live dan bisa diakses dari luar. Saatnya connect dari terminal lokal.
Setup Credentials dan Config
Buat profile khusus untuk MinIO agar tidak bentrok dengan konfigurasi AWS lain:
aws configure --profile minio
Isi saat diminta:
- AWS Access Key ID: nilai
MINIO_ROOT_USERkamu - AWS Secret Access Key: nilai
MINIO_ROOT_PASSWORDkamu - Default region name:
us-east-1 - Default output format:
json
Lalu set path-style addressing agar tidak perlu flag tambahan setiap perintah:
aws configure set s3.addressing_style path --profile minio
Test Koneksi
aws s3 ls \
--endpoint-url https://nama-bucket.helipod.app \
--profile minio
Operasi Dasar
# Buat bucket
aws s3 mb s3://my-first-bucket \
--endpoint-url https://nama-bucket.helipod.app \
--profile minio
# Upload file
aws s3 cp ./foto.jpg s3://my-first-bucket/ \
--endpoint-url https://nama-bucket.helipod.app \
--profile minio
# Upload seluruh folder
aws s3 sync ./assets s3://my-first-bucket/assets \
--endpoint-url https://nama-bucket.helipod.app \
--profile minio
# Download file
aws s3 cp s3://my-first-bucket/foto.jpg ./foto-download.jpg \
--endpoint-url https://nama-bucket.helipod.app \
--profile minio
# List isi bucket
aws s3 ls s3://my-first-bucket \
--endpoint-url https://nama-bucket.helipod.app \
--profile minio
# Hapus file
aws s3 rm s3://my-first-bucket/foto.jpg \
--endpoint-url https://nama-bucket.helipod.app \
--profile minio
Buat Alias agar Lebih Ringkas
Tambahkan ke ~/.zshrc atau ~/.bashrc:
alias s3pod='aws s3 --endpoint-url https://nama-bucket.helipod.app --profile minio'
Setelah source ~/.zshrc:
s3pod ls
s3pod mb s3://my-bucket
s3pod cp ./file.txt s3://my-bucket/
s3pod sync ./folder s3://my-bucket/folder
Integrasi dengan Aplikasi di Helipod
Jika kamu punya service lain (misalnya Laravel, Node.js, atau Python) di project yang sama, gunakan internal DNS — lebih cepat dan tidak keluar ke internet publik.
Format internal hostname bisa ditemukan di tab Settings → Networking & Domains dengan label "Internal only".
# Internal network (untuk service di project yang sama — direkomendasikan)
S3_ENDPOINT=http://heli-xxxxxxxx.env-xxxx.svc.cluster.local
S3_ACCESS_KEY=nama-user-kamu
S3_SECRET_KEY=password-kamu
S3_REGION=us-east-1
S3_BUCKET=my-first-bucket
S3_PATH_STYLE=true
# Public endpoint (untuk akses dari luar Helipod)
S3_ENDPOINT=https://nama-bucket.helipod.app
Penting: Saat menggunakan internal DNS, selalu set
S3_PATH_STYLE=true(atau ekuivalennya di SDK kamu) karena internal hostname bukan wildcard subdomain. Ini berlaku untuk Laravel Flysystem, boto3, aws-sdk-js, dan lainnya.
Baca lebih lanjut di Panduan Internal Network Helipod.
Troubleshooting Umum
Error "Token has expired and refresh failed"
AWS CLI kamu memiliki SSO session lama yang aktif. Gunakan --profile minio agar CLI memakai credentials yang benar:
aws s3 ls --endpoint-url https://nama-bucket.helipod.app --profile minio
Atau lewati credentials langsung via environment variable:
AWS_ACCESS_KEY_ID=user AWS_SECRET_ACCESS_KEY=password \
aws s3 ls --endpoint-url https://nama-bucket.helipod.app
Error "PermanentRedirect" atau bucket tidak ditemukan Ini biasanya masalah addressing style. Pastikan path-style sudah aktif:
aws configure set s3.addressing_style path --profile minio
Error "Connection refused" atau timeout
Pastikan routing di Settings sudah mengarah ke port :9000. MinIO S3 API berjalan di port 9000 — bukan 80 atau 443.
Error "Access Denied"
Periksa nilai MINIO_ROOT_USER dan MINIO_ROOT_PASSWORD di tab Variables — pastikan sama persis dengan yang dimasukkan saat aws configure.
CORS error saat akses dari browser
Pastikan MINIO_API_CORS_ALLOW_ORIGIN sudah diset dan service sudah di-redeploy setelah variabel ditambahkan. Perubahan variabel baru berlaku setelah deployment ulang.
SDK melaporkan "invalid region"
Set MINIO_SITE_REGION di Variables sesuai nilai yang kamu pakai di SDK (misalnya ap-southeast-3), lalu redeploy.
Kesimpulan
Deploy S3-compatible bucket di Helipod hanya butuh beberapa menit. Kunci yang sering diabaikan adalah path-style addressing — karena Helipod menggunakan satu domain per service (bukan wildcard subdomain), mengaktifkan path-style via aws configure set s3.addressing_style path atau flag setara di SDK kamu akan mencegah sebagian besar error kompatibilitas.
Dari sana, semua tool yang kompatibel dengan S3 API bisa langsung digunakan: AWS CLI, Laravel Flysystem, boto3, aws-sdk untuk Node.js, dan lainnya.
Punya pertanyaan? Hubungi kami di support@helipod.io atau bergabung ke komunitas di hangar.helipod.io.