Adonis Drive + Minio Cloud Storage

Ahmad Arif
AdonisID
Published in
5 min readApr 30, 2018
http://blog.trustpilot.com/blog/2015/11/5/storage-vertical

Pengelolaan file merupakan bagian yang tidak dapat dipisahkan dalam sebuah sistem. Di era sekarang (zaman now) ini, fitur untuk mengelola file tidak melulu disimpan secara bersamaan dengan aplikasinya. Dimana untuk urusan mengelola file dapat memanfaatkan layanan cloud storage yang tinggal pakai seperti Google Cloud Storage maupun AWS S3. Kedua service tersebut dapat kita sewa sesuai dengan jumlah pemakaian kapasitas maupun request terhadap file yang disimpan di layanan tersebut, bahasa jadulnya Pay as you go.

Minio : Private Cloud Storage

“Minio adalah server penyimpanan objek terdistribusi, ditulis dalam bahasa pemrograman Go dan open source di bawah Apache License Version 2.0”

Minio merupakan sebuah private cloud storage yang memiliki SDK mirip dengan AWS S3 dari Amazon, yang dapat diinstal di server pribadi. Minio sama seperti cloud storage lainnya, yang biasa digunakan untuk menyimpan data tidak terstruktur seperti foto, video, file log, backup, dan container/VM images dengan ukuran maksimal 5TB.

Keuntungan menggunakan minio diantaranya:

  • Amazon S3 Compatible
  • Data Protection
  • Highly Available
  • Lambda Compute
  • Encryption and Tamper-Proof
  • Pluggable Storage Backend

Menurut saya, jika kedepannya berencana menggunakan AWS S3 sebagai layanan cloud storagenya. Dengan menggunakan minio pada masa development, akan memudahkan ketika melakukan migrasi ke AWS S3 karena kemiripan SDKnya. Minio juga cocok digunakan jika ingin mengelola cloud storage sendiri, tanpa mau menggunakan layanan berbayar lain, dan juga mudah dalam pemasangannya. Mau mempelajari minio lebih lanjut silahkan kunjungi websitenya di https://www.minio.io/.

Adonis Drive

Untuk mengelola file, adonis memiliki provider bernama Adonis Drive yang memiliki driver local dan S3 sehingga mampu mengelola local file dan cloud storage dari S3. Beberapa fungsi yang dapat dilakukan adonis drive adalah:

  • exists: mengecek apakah file tersebut ada atau tidak ada
  • get: mengambil file sebagai sebuah buffer
  • getStream: mengambil file sebagai sebuah stream
  • put: membuat sebuah file sesuai dengan konten yang diberikan, fungsi ini akan membuat direktori jika tidak tersedia.

Adonis drive juga mudah untuk dikembangkan, sehingga kita dapat membuat driver baru yang sesuai dengan kebutuhan, dengan cara meng-extend provider adonis drive.

Adonis Drive + Minio

Minio secara default sudah memiliki beberapa SDK yang siap pakai, yaitu:

  • JavaScript Client
  • Java Client
  • Python Client
  • Golang Client
  • .Net Client

Saya sendiri sudah membuat provider yang dapat digunakan untuk berinteraksi antara adonis dengan SDK minio. Untuk kemudahan implementasi silahkan gunakan library berikut:

Sebelum menggunakan library di atas, jangan lupa untuk meng-install adonisjs/drive terlebih dahulu.

Untuk instalasi minio tidak dijelaskan pada artikel ini, cukup mudah untuk instalasi minionya salah satunya bisa kamu cek di link ini.

Langkah-langkah

Untuk memudahkan latihan kali ini, mari ikuti langkah-langkah berikut:

Buat proyek baru

Buat proyek adonis dengan perintah berikut:

adonis new app-storage

Install dependency

Ada dua dependency yang harus diinstall, yaitu adonis drive dan adonis-drive-minio. Install adonis drive dengan perintah berikut:

adonis install @adonisjs/drive

Kemudian daftarkan provider adonis drive di start/app.js seperti berikut:

const providers = [
'@adonisjs/drive/providers/DriveProvider'
]

Kemudian install adonis-drive-minio supaya dapat digunakan untuk mengakses minio cloud storage. Gunakan perintah berikut untuk meng-installnya:

adonis install adonis-drive-minio

Kemudian daftarkan juga ke provider yang ada di start/app.js seperti berikut:

const providers = [
'@adonisjs/drive/providers/DriveProvider'
'adonis-drive-minio/providers/DriveProvider'
]

Setelah mendaftarkan providernya, lanjut untuk mengatur konfigurasi driver di file config/drive.js. Tambahkan kode berikut di variabel disk:

minio: {
driver: 'minio',
host: Env.get('MINIO_HOST'),
port: Env.get('MINIO_PORT'),
secure: Env.get('MINIO_SECURE'),
accessKey: Env.get('MINIO_ACCESS'),
secretKey: Env.get('MINIO_SECRET'),
bucket: Env.get('MINIO_BUCKET'),
region: Env.get('MINIO_REGION')
}

Kemudian buat variabel untuk melakukan konfigurasi yang dibutuhkan minio di file .env, berikut kodenya:

MINIO_HOST=
MINIO_PORT=
MINIO_SECURE=
MINIO_ACCESS=
MINIO_SECRET=
MINIO_BUCKET=
MINIO_REGION=

Atur variabel minio

Pada tutorial kali ini, server cloud storage yang digunakan adalah http://play.minio.io/ (biar gak perlu setup lagi sih 😅). Kunjungi website playgroundnya, dan buat sebuah bucket dengan nama adonis-minio dan adonis-minio-new untuk keperluan operasi copy dan move (note: nama bucket sesuai keinginan).

Maka variabel kita akan seperti berikut:

MINIO_HOST=play.minio.io
MINIO_PORT=9000
MINIO_SECURE=true
MINIO_ACCESS=Q3AM3UQ867SPQQA43P2F
MINIO_SECRET=zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG
MINIO_BUCKET=adonis-minio
#Optional untuk region bucketnya
MINIO_REGION=

Menulis kodenya

Untuk mempercepat penulisan kode, saya simpan semuanya langsung di routingnya. Dan berikut kodenya:

Saatnya uji coba

Untuk memudahkan uji cobanya, sudah saya buatkan postman projectnya. Silahkan download pada link ini. Berikut ini beberapa operasi yang dapat dilakukan:

  • Upload

Untuk upload, tinggal memilih file yang mau diupload ke minio bucket sesuai konfigurasi. Kurang lebih seperti berikut:

Proses upload image

Bagaimana hasilnya? Pasti eror hahaha 😂

Dengan keyword EBADCSRFTOKEN: Invalid CSRF token, di adonis sendiri memang ada satpam yang jagain dari serangan CSRF. Fitur tersebut dapat diaktifkan maupun dinon-aktifkan, atau hanya beberapa route saja yang ingin dinonaktifkan. Misalnya saya ingin menonaktifkan CSRF Protection untuk semua route dengan prefix /minio, maka cukup tambahkan kode ‘/minio(.*)’ di variabel filterUris pada file config/shield.js. Kemudian lakukan lagi proses uploadnya. Maka jika koneksi kamu normal, file tersebut akan mejeng di server minionya.

Response proses upload

Note: Link tersebut tidak dapat diakses jika ACL dari bucket dan filenya private

Dan jika kita cek di dashboard minionya, maka file tersebut dapat dilihat di sana.

Image yang sudah diupload
  • Get Sign URL

Jika link tadi diakses, maka akan muncul informasi seperti berikut:

Tidak memiliki akses ke file

Untuk mendapatkan akses, cukup melakukan sign terhadap objek atau file tersebut. Update path params untuk request SIGN URL di postman dengan nama file yang barusan diupload.

Klik tombol params untuk memunculkan formnya

Maka ketika kamu melakukan aksi sign url, berikut contoh responsenya:

Response untuk proses SIGN URL

Dan berikut ini penampakan jika kamu mengakses dengan URL tersebut:

Preview gambar yang sudah diupload

Fungsi signUrl by default, memiliki masa hidup hanya 10 menit. Untuk mengubahnya kamu dapat mengubahnya dengan menambahkan parameter waktu (dalam detik) di parameter kedua.

Sekian pembahasan singkat untuk artikel kali ini. Untuk mencoba lebih lanjut kamu dapat menggunakan postman projectnya (mungkin beberapa perlu disesuaikan dengan routingnya). Hasil pembelajaran kali ini dapat dilihat pada link github berikut:

Jangan lupa untuk join Adonis Indonesia di channel berikut:

--

--