Min.io Object Storage Server ile kendi sunucumuzda S3 alternatifimizi Örnek Demo ile birlikte oluşturalım.

Alper Reha YAZGAN
Turk Telekom Bulut Teknolojileri
7 min readFeb 1, 2022

Hepinize merhaba, Ben Alper, bugün sizlerle birlikte Amazon S3 Storage Service için alternatif olabilecek şekilde kendi sunucunuz üzerinde kaldırabileceğiniz open source bir proje olan Min.io hakkında konuşacağız ve bilgisayarımızda docker kullanarak çalıştırıp Go dili ile mini bir Http dosya yükleme ve getirme servisi yazacağız. Dilerseniz başlayalım.

Gereksinimler:
- Docker (Min.io için normalde düz kurulum da yapabilirsiniz ancak ben kolaylık sağladığı için docker üzerinden kuruyorum. Başka alternatif yollarla indirmek için BU LİNKİ inceleyin.)
- Go Dili

1.Min.io Nedir?

Kısaca Min.io, Go dili ile yazılmış Amazon S3 Bucket Storage Service’in sağlamış olduğu bütün özellikleri sağlaması amacıyla ortaya çıkmış açık kaynak bir replika projesidir diyebiliriz. Uygulamanızın dosya işlemlerini veya sunucu tarafında barındırmanız gereken statik dosya ve klasörlerinizi yönetebileceğiniz (yükleme, güncelleme, silme operasyonlarını içeren) depolama servis programıdır. Kodladığınız uygulamanızda dosya barındırma(fotoğraf, video, dosya) veya sunucu yedek barındırma(database backup, container registry vb.) ihtiyaçlarınızı yönetmeniz için birebir bir çözümdür.

2.Min.io ile Neler Yapabiliriz?

Bir developer olarak yeni bir program veya open source proje gördüğümde ilk olarak zaten hali hazırda bir çözüm olduğunu bildiğim için yapabileceklerimin neler ile kısıtlı olduğuna bakarım. Yaklaşık 5 aydır üzerinde araştırma yaptığım ve kendi development sunucumda kullandığım için artılarını şöyle sayabilirim:

  • Uygulama geliştirilmesi S3 alternatifi olarak yapılıyor ve bütün dillerdeki S3 Client SDK’ları ile sorunsuz çalışıyor. Yani hali hazırda S3 Bucket kullanan bir servisiniz var ise yapmanız gereken tek şey Endpoint ve Bucket ismini değiştirmek.
  • Uygulama içi yetkilendirme için S3 uyumlu IAM Policy içeriyor. İstediğiniz kullanıcıyı oluşturup ona API Listesindeki komutlardan hangilerini kullanabileceğini role bazında verebiliyorsunuz.
  • Java, Golang, Python, Javascript(Node.js), Haskell dillerine uyumlu driver kütüphaneleri mevcut.
  • Lambda Notifications özelliği ile BUCKET üzerine dosya ekleme, elde etme, silme (PUT OBJECT, GET OBJECT, DELETE OBJECT) işlemleri için custom webhook veya event fırlatabiliyorsunuz ve bunu üçüncü parti event,queue handler’lar (Kafka,Rabbitmq,NATS, Redis vb.) ile yönetebiliyorsunuz. Böylece tamamıyla akışı kontrol edebildiğiniz ve iş mantığınız çerçevesinde aksiyonlar alabileceğiniz bir dosya yükleme ve saklama servisi elde etmiş oluyorsunuz.
  • Object Storage özelliğini her tipten veri (image,iso, backup vb.) için kullanabiliyorsunuz. Bu sebeple isterseniz veritabanı yedeklerinizi, kendi yazmış olduğunuz docker container image’ları için bir Registry depolama servisi veya merkezi logların toplandığı bir log saklama servisi olarak kullanabiliyorsunuz.

3.Docker ile kurulumu

Ben bütün bu kurulum esnasında docker kullanacağım. Normal işletim sistemi kurulumu tercih edenler BURADAN windows veya linux için harici olarak kurulum yapabilirler.

3.1- Öncelikle terminal ekranını açıyoruz ve uygulamamızın mount edebilmesi için ona özel bir dizin oluşturuyoruz.

# Cmd (Windows) veya Bash (Linux) ekranındamkdir myminioapp # klasörü oluşturuyoruz.
cd myminioapp # dizine gidiyoruz.

3.2- Şimdi ise docker pull komutu ile BURADAN en güncel docker imajlarından birini seçiyoruz. (Latest olanı seçmiyorum çünkü her hafta yeni güncellemeler gelerek arayüzde geliştirmeler yapılıyor ve yeni fonksiyonlar ekleniyor. Tavsiyem imajlarda farklılık olmaması için bir versiyon seçerek aynı imaj versiyonunu kullanmanız.)

# Makale yazım tarihi: 31.01.2022
docker pull minio/minio:RELEASE.2022-01-27T03-53-02Z

Yukarıdaki kodu çalıştırıp imajın yüklenmesini bekliyoruz ve ardından çalıştırmaya hazırız.

3.3- Uygulamamız minimum gereksinimlerle ayağa kaldırırken uygulamanın alması gereken parametreler bulunmaktadır. Bunları aşağıdaki gibi sıralayabiliriz.

Volume:
- Bütün dosyaların hangi klasör altında tutulacağı

ENV:
- MINIO_ROOT_USER : Bütün yetkilere sahip root kullanıcı ismi
- MINIO_ROOT_PASSWORD : Root kullanıcı şifresi

3.4- Uygulamayı run edebilmek için aşağıdaki şekilde docker run komutuyla çalıştırıyoruz. Linux ve Windows için ayrı ayrı kodları belirttim.

# Windows için aşağıdaki kod ile çalıştırabiliriz.
docker run -d ^
-p 9000:9000 ^
-p 9001:9001 ^
--name my-minio-app ^
-v C:\Users\alper\Desktop\myminioapp:/data ^
-e "MINIO_ROOT_USER=MR_ROBOT_IS_ALIVE" ^
-e "MINIO_ROOT_PASSWORD=MR_ROBOT_SECRET_PASS" ^
minio/minio:RELEASE.2022-01-27T03-53-02Z server /data --console-address ":9001"
# Linux için aşağıdaki kod ile çalıştırabiliriz.
docker run -d \
-p 9000:9000 \
-p 9001:9001 \
--name my-minio-app \
-v /home/alperreha/Desktop/myminioapp:/data \
-e "MINIO_ROOT_USER=MR_ROBOT_IS_ALIVE" \
-e "MINIO_ROOT_PASSWORD=MR_ROBOT_SECRET_PASS" \
minio/minio:RELEASE.2022-01-27T03-53-02Z server /data --console-address ":9001"

Yukarıdaki kodda “-v C:\User\alper\Desktop\myminioapp:/data” şeklinde verdiğim yol benim kendi bilgisayarımda proje için oluşturduğum bulunan dizindir. Siz de kendi ilk başta oluşturduğunuz dosya dizininin yolunu vererek kendi oluşturduğunuz klasör ile birleştirebilirsiniz.

Kurulumun tamamlanmasını bekliyoruz ve tamam!!! bu kadar basit😻 👌 Şu an min.io kurulumunu gerçekleştirdik. Arayüze bağlanıp yapabileceklerimize bakalım.

4.Bucket Oluşturma ve Yetkilendirme:

Kurulumu tamamladıktan sonra ilk olarak configurasyon ayarımızı yapıp ardından ilk bucket’ımızı oluşturarak sadece o bucket üzerinde yetkili bir kullanıcı oluşturmak ile başlayacağız. Ardından o kullanıcı ile birlikte Go dilinde Gin Framework’ü ile HTTP dosya yükleme ve çağırma servisi yazacağız.

4.1- Minio Console Giriş:

Kurulumun ardından http://localhost:9001/ adresine gidiyoruz ve orada yukarıdaki verdiğimiz isim ve şifre ile giriş yapıyoruz.
isim: MR_ROBOT_IS_ALIVE
şifre: MR_ROBOT_SECRET_PASS

4.2- Konfigürasyonlar:

Minio uygulamamızın S3 SDK kütüphaneleri ile doğru çalışabilmesini istiyorsak sunucumuzun lokasyon bilgisini null dışında bir değer girmeliyiz. Bu sebeple ana ekranda Settings->Configurations kısmına gelip oradan Region ayarları kısmındaki Server-Location kısmına “eu-central-1" şeklinde girip save dedikten sonra sunucuyu restart ediyoruz. Böylece ilk bucket oluşturmaya ve kullanmaya başlayabiliriz.

Settings->Configuration kısmı

4.3- Bucket ve User oluşturma:

Sunucumuz lokasyon bilgisini güncelleyip restart edildikten sonra artık bucket oluşturabiliriz.

Arayüzde bucket oluşturmak için Console ekranında Buckets kısmına gelip +Create Bucket sekmesine tıklayarak yeni Bucket ismimizi giriyoruz. Böylece Bucket’ımızı oluşturduk.

Buckets->Create Bucket bölümü

S3 ve replika projelerinde genel olarak istek ve aksiyon yaşam döngüsü şöyledir:

  • İstek atan kullanıcı isim ve şifresiyle (ACCESS_KEY, SECRET_KEY) ile birlikte istek atar.
  • Uygulama sunucusu gelen isteği sistem admini kurallarını koymuş olduğu ACL Policy (Access Control List) içerisinden kullanıcı rolü ve adminin izin vermiş olduğu RBAC (Role Based Access Control) kurallarını karşılaştırarak o isteğin yapılabilip yapılamayacağına karar verir.
  • Yetkilendirme işlemini geçen istek başarıyla çalıştırılır.
  • Eğer CUSTOM_WEBHOOK ayarlanmış ise yapılan işlem statü kodu ve bilgileri ayarlanan webhook’a uyarı amacıyla gönderilir.
  • Kullanıcıya yapılan işlem response olarak dönülür.

Yukarıdaki yaşam döngüsü için şimdi sizlerle sadece alyaprivate bucket üzerinde okuma,yazma ve listeleme yetkisine sahip bir IAM ACL Policy oluşturacağız ve ardından yalnızca bu yetkiye sahip olan bir kullanıcı oluşturacağız. Devamında Go dilinde bir uygulama yazarak o kullanıcı isim ve bilgileri ile o bucket’a dosya ekleyip elde etme işlemlerini gerçekleştireceğiz.

4.4- Yalnızca alyaprivate Bucket’ına Erişim Yetkisine Sahip ACL Oluşturma

Yalnızca alyaprivate üzerinde yetkiye sahip bir IAM Policy oluşturmak için aşağıdaki gibi bir kurallar tanımı içeren json dosyası oluşturmamız gerekiyor. (alyaprivatereadwriteonly IAM Policy’miz)

Yani Action olarak GET,PUT ve LIST yetkilerine sahip olan yetki tanımımız yalnızca alyaprivate/* içerisinde bulunan objeler için bu yetki tasarrufuna sahip olacağını belirtiyoruz. Bu policy’yi Console->Access->Create Policy kısmına alyaprivatereadwriteonly isminde aşağıdaki örnekteki gibi oluşturuyoruz.

alyaprivatereadwriteonly ACL json dosyamızın tanımlanması

Yetki sınırlarını belirten json dosyamızı tanımladık şimdi ise kendimize yeni bir kullanıcı oluşturup bu yetkileri o kullanıcıya atayalım.

4.5- Yeni Kullanıcı Oluşturma

Kullanıcı oluşturmak için de Console->Identity->Users->Create User kısmına geliyoruz ve kullanıcı bilgilerimizi giriyoruz.
Benim örneğimde kullanıcı bilgilerim aşağıdaki gibidir:
Access Key: MY_APP_SUPER_ACCESS
Secret Key: MY_APP_SUPER_SECRET

Uygulamalarımızda kullanmak için erişime sahip kullanıcımızı oluşturuyoruz.

Sunucumuz, yetkimiz ve kullanıcımız hazır. Artık Go dili ile kod yazıp dosya yükleme ve silme işlemi yapabiliriz. 🎉 🔥

5. Go Gin ile Minio File Upload HTTP Server’imizi Yazalım.

Go dili Gin framework’ü ile hafif ve hızlı bir şekilde HTTP sunucu template’imizi oluşturacağız ve yalnızca şu iki işlemi gerçekleştiren bir web servisi yazacağız.
POST /upload : (request olarak multipart file dosyası kabul edecek)
GET /uploads/:file_key : (response olarak istenen dosyayı dönecek)

5.1- Bu sebeple kendimize yeni bir klasör oluşturup orada Go projemizi başlatalım.

Cmd (Windows) veya Bash (Linux) ekranındamkdir go-fileupload-example
cd go-fileupload-example
go mod init go-fileupload-example
# Gerekli kütüphanelerimizi indirelim.
go get -u github.com/gin-gonic/gin
go get github.com/aws/aws-sdk-go/aws
go get github.com/aws/aws-sdk-go/aws/session

5.2- Uygulama kodumuzu yazmak için main.go isminde bir dosya açıyoruz ve içerisine yukarıdaki belirttiğim iki işlemi gerçekleştirebilmesi için aşağıdaki kodları yazıyoruz. Aşağıdaki kodda dikkatinizi çekecektir Minio’nun Go SDK kütüphanesi bulunuyor ancak ben bu örneğimizi Amazon S3 Go SDK ile birlikte yaptım. Böylece hem S3 hem de Minio uygulamalarınızı tek bir kod noktasından çalıştırabilirsiniz kod değişikliğine ihtiyacınız yoktur. (main.go dosyamız)

main.go dosyamız

5.3- Yukarıdaki main.go dosyamızı çalıştırabiliriz.

go run main.go

Uygulama başarılı bir şekilde ayağa kalkmış bulunuyor. Gelin şimdi bu uygulamayı Postman ile test edelim.

Dosya Yükleme: (POST http://localhost:9090/upload)

Dosya yükleme işlemi sonucu Postman ekran görüntüsü

Dosya yüklemi işlemi tamamlandıktan sonra Minio Console üzerinde alyaprivate bucket üzerine tıklarsanız dosyamızın yüklenmiş olduğunu görebilirsiniz.

Dosya yükleme işlemi sonrası Minio Console Bucket Objects Listesi

Dosya Elde Etme (GET http://localhost:9090/uploads/:file):
Az önce yüklemiş olduğumuz ic_default_avatar.png dosyamızı GET request ile çağıralım.

GET request sonrası dosyamızın Minio üzerinden yazdığımız Go HTTP uygulaması aracılığıyla bize gösterilmesi

Tebrikler! Kendi sunucunuzda barındırabileceğiniz bir Object Storage Server kurulumu yapmış oldunuz ve bu servisi kullanarak dosya okuma ve yazma işlemleri yapabilen bir HTTP uygulaması kodlayarak bu çözümü kendi servislerinizde kullanabilir hale geldiniz. 🎉 🔥

Sonuç:

Minio Object Storage Server Go dili ile yazılmış ve S3 Client SDK kodları ile uyumlu bir şekilde geliştirilme yapılan open source bir yazılımdır. Sizler de kendi sunucularınızda dosya saklama işlemleriniz için self-hosted bir çözüm olarak direkt olarak kullanmaya başlayabilirsiniz. Minio çokça veri tipini destekleyen ve saklayabilen bir servistir. İsterseniz kendi sunucularınızda Container Image Registry kullanıyorsanız container image verilerini saklamak için de kullanabilirsiniz. Ayrıca backup’larınız için de Minio-client kütüphanesini kullanarak kendi lokalinizdeki dosyaları uzaktaki Min.io servisinize göndererek günlük, haftalık yedekler alabilecek şekilde çözümler de üretebilirsiniz.

Bu makale kapsamında sizlerle basit bir şekilde Min.io kurulumunu ve demo web sunucusu uygulamamız ile birlikte de minio-server-client yapısını anlatmayı amaçlamıştım.

Diğer yazılarımda görüşmek üzere sağlıcakla kalın.

Alper Reha Yazgan.

--

--

Alper Reha YAZGAN
Turk Telekom Bulut Teknolojileri

Yıldız Teknik Üniversitesinde Bilgisayar Mühendisliği öğrencisi, yeni nesil teknoloji ve yeniliklere karşı araştırmacı ve meraklı birisiyim.