Sanallaştırma & Bulut

    MinIO ile Kendi S3 Uyumlu Depolamanız

    Kendi sunucunuzda S3 uyumlu depolama kurmak için MinIO'nun uçtan uca kurulumu.

    10 dk okuma Güncellendi: 25 Ağustos 2026

    Uygulamanız S3 API'siyle konuşuyor ama verilerin kendi sunucunuzda kalmasını istiyorsanız, MinIO tam olarak bu boşluğu doldurur. Tek bir Go ikilisinden ibaret, birkaç dakikada ayağa kalkan ve S3 API'sinin büyük bölümünü uygulayan bir nesne depolama sunucusudur. MinIO kurulumu yaparak yedeklerinizi, kullanıcı yüklemelerinizi ve statik varlıklarınızı dışarıya bağımlı olmadan S3 protokolüyle saklayabilirsiniz.

    Bu rehberde MinIO'yu bir Linux sunucusunda üretimde kullanılabilir şekilde kuracağız: disk hazırlığı, ayrı bir sistem kullanıcısı, systemd servisi, Nginx üzerinden TLS sonlandırma ve alt alan adı yapılandırması, mc istemcisiyle kova ve kullanıcı yönetimi, son olarak da yedekleme hedefi olarak kullanımı. Ayrıca tek disk ile çoklu disk (erasure coding) kurulumu arasındaki farkı ve üretimde en sık düşülen tuzakları da göreceksiniz.

    MinIO Ne İşe Yarar, Ne Zaman Doğru Seçimdir#

    MinIO, S3 API'sini konuşan bir sunucu yazılımıdır. Verileri sunucunuzun dosya sisteminde saklar ama dışarıya nesne depolama olarak sunar; yani aws s3 komutu, boto3, rclone, Veeam, Restic ya da WordPress'in S3 eklentisi MinIO ile fark etmeden çalışır. Kavramların temelini bilmiyorsanız önce S3 uyumlu nesne depolama nedir yazısını okumanız bu rehberi çok daha anlaşılır kılar.

    MinIO'nun doğru seçim olduğu senaryolar oldukça nettir. Verilerin yurt içinde ve kendi kontrolünüzdeki bir makinede kalması gerekiyorsa, yerel geliştirme ortamınızda üretimdeki S3 davranışını taklit etmek istiyorsanız, iç ağınızda yüksek hızlı bir yedek hedefi kuruyorsanız ya da egress ücreti ödemeden büyük hacimli veri okuyacaksanız MinIO uygun bir çözümdür. Buna karşılık coğrafi olarak dağıtık, %99,99 erişilebilirlik gerektiren ve siz uyurken de ayakta kalması beklenen bir hizmet kuruyorsanız, tek sunuculuk MinIO tek noktadan arıza olur; o durumda ya çok düğümlü bir küme kurmanız ya da yönetilen bir servisle birlikte kullanmanız gerekir.

    Depolama modelleri arasında hangisinin size uygun olduğundan emin değilseniz, nesne depolama mı blok depolama mı karşılaştırması karar vermenizi kolaylaştırır.

    Kurulum Öncesi Hazırlık: Disk ve Kullanıcı#

    MinIO'yu kök dosya sistemine kurmak en sık yapılan başlangıç hatasıdır; nesne verisi büyüdükçe işletim sistemi diskini doldurur ve sunucuyu kilitler. Veri için ayrı bir disk ya da en azından ayrı bir bölüm ayırın. Diski hazırlayıp kalıcı olarak bağlayalım:

    # Mevcut blok cihazları listele
    lsblk
    
    # Veri diskinde XFS oluştur (MinIO XFS'i önerir)
    sudo mkfs.xfs /dev/sdb
    
    # Bağlama noktasını oluştur ve UUID'yi öğren
    sudo mkdir -p /mnt/minio-veri
    sudo blkid /dev/sdb
    

    blkid çıktısındaki UUID'yi /etc/fstab dosyasına ekleyin; cihaz adları (/dev/sdb) yeniden başlatmada değişebilir, UUID değişmez:

    # /etc/fstab — MinIO veri diski
    UUID=8f3c2a10-4b77-4c1e-9d2b-6a1e5f0c9d31  /mnt/minio-veri  xfs  defaults,noatime  0  2
    

    noatime seçeneği her okuma işleminde erişim zamanı yazılmasını engeller ve nesne depolama gibi okuma yoğun yüklerde gereksiz yazma trafiğini azaltır. Bağlama ve fstab ayrıntıları için disk bağlama, mount ve fstab yazısına bakabilirsiniz.

    Şimdi ayrıcalıksız bir sistem kullanıcısı oluşturup dizin sahipliğini verelim. MinIO'yu asla root ile çalıştırmayın:

    sudo mount -a
    sudo groupadd -r minio-user
    sudo useradd -M -r -g minio-user minio-user
    sudo chown -R minio-user:minio-user /mnt/minio-veri
    

    MinIO Kurulumu ve systemd Servisi#

    MinIO tek bir çalıştırılabilir dosyadır; paket yöneticisine gerek yoktur.

    # Sunucu ikilisini indir ve kur
    curl -fsSL https://dl.min.io/server/minio/release/linux-amd64/minio \
      -o /tmp/minio
    sudo install -m 755 -o root -g root /tmp/minio /usr/local/bin/minio
    
    # Sürümü doğrula
    minio --version
    

    Yapılandırmayı ortam dosyasında tutalım. Kök kullanıcı adı ve parolası buradan okunur; parolayı en az 20 karakter ve rastgele seçin (şifre üretici aracımız işinizi görür):

    # /etc/default/minio
    MINIO_VOLUMES="/mnt/minio-veri"
    MINIO_OPTS="--address :9000 --console-address :9001"
    MINIO_ROOT_USER=minioyonetici
    MINIO_ROOT_PASSWORD=BURAYA_UZUN_RASTGELE_PAROLA
    MINIO_SERVER_URL="https://s3.firmaniz.com"
    MINIO_BROWSER_REDIRECT_URL="https://konsol.firmaniz.com"
    

    MINIO_SERVER_URL satırı çok önemlidir: MinIO imzalı URL'leri ve yönlendirmeleri bu adrese göre üretir. Ters vekil (reverse proxy) arkasındayken bunu ayarlamazsanız istemcileriniz localhost:9000 adresine yönlendirilir ve imzalar tutmaz.

    Bu dosyadaki değişkenlerin ne işe yaradığını ve hangisini atlarsanız neyin bozulduğunu tek tabloda toplayalım:

    Değişken / portNe yaparAtlanırsa ne olur
    MINIO_VOLUMESNesne verisinin duracağı dizin(ler)Varsayılan yoktur, servis başlamaz
    MINIO_ROOT_USERYönetici kullanıcı adıServis başlamaz
    MINIO_ROOT_PASSWORDYönetici parolasıServis başlamaz
    MINIO_SERVER_URLİmzalı URL ve yönlendirmelerin tabanıİstemciler iç adrese yönlendirilir, imza tutmaz
    MINIO_BROWSER_REDIRECT_URLKonsolun dış adresiKonsol girişi döngüye girebilir
    9000/tcpS3 API portuTers vekil bağlanamaz
    9001/tcpYönetim konsolu portuKonsol açılmaz

    Dosyayı yalnızca root okuyabilsin ve servisi tanımlayalım:

    sudo chmod 640 /etc/default/minio
    
    # /etc/systemd/system/minio.service
    [Unit]
    Description=MinIO Nesne Depolama
    After=network-online.target
    Wants=network-online.target
    
    [Service]
    User=minio-user
    Group=minio-user
    EnvironmentFile=/etc/default/minio
    ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
    Restart=always
    RestartSec=5
    LimitNOFILE=65536
    ProtectSystem=full
    PrivateTmp=true
    NoNewPrivileges=true
    
    [Install]
    WantedBy=multi-user.target
    
    sudo systemctl daemon-reload
    sudo systemctl enable --now minio
    sudo systemctl status minio --no-pager
    sudo journalctl -u minio -n 30 --no-pager
    

    LimitNOFILE satırını atlamayın; MinIO çok sayıda dosya tanımlayıcısı açar ve varsayılan 1024 limiti yoğun kullanımda "too many open files" hatası üretir.

    Tek disk yerine dayanıklılık istiyorsanız MinIO'yu birden çok diskle başlatarak silme kodlaması (erasure coding) devreye alabilirsiniz. Bu modda MinIO veriyi parçalayıp parity ile birlikte disklere dağıtır ve disk kaybına dayanır:

    # Dört ayrı diskle erasure coding modu
    /usr/local/bin/minio server /mnt/disk{1...4}
    

    Bu yaklaşım, altta RAID kurmaya benzer bir koruma sağlar ama uygulama katmanında çalışır ve nesne düzeyinde onarım yapabilir.

    Nginx ile TLS Sonlandırma#

    MinIO'yu doğrudan 9000 portundan internete açmayın. Önüne Nginx koyup TLS'i orada sonlandırmak hem sertifika yönetimini kolaylaştırır hem de erişim kayıtlarını tek yerde toplar. İki alan adı kullanacağız: s3.firmaniz.com API için, konsol.firmaniz.com yönetim arayüzü için.

    # API uç noktası — /etc/nginx/sites-available/minio-api
    server {
        listen 443 ssl http2;
        server_name s3.firmaniz.com;
    
        ssl_certificate     /etc/letsencrypt/live/s3.firmaniz.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/s3.firmaniz.com/privkey.pem;
    
        # Büyük nesne yüklemeleri için gövde sınırını kaldır
        client_max_body_size 0;
        proxy_request_buffering off;
        proxy_buffering off;
    
        location / {
            proxy_pass http://127.0.0.1:9000;
            proxy_http_version 1.1;
            proxy_set_header Host              $host;
            proxy_set_header X-Real-IP         $remote_addr;
            proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_connect_timeout 300;
            chunked_transfer_encoding off;
        }
    }
    
    # Yönetim konsolu — /etc/nginx/sites-available/minio-konsol
    server {
        listen 443 ssl http2;
        server_name konsol.firmaniz.com;
    
        ssl_certificate     /etc/letsencrypt/live/konsol.firmaniz.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/konsol.firmaniz.com/privkey.pem;
    
        location / {
            proxy_pass http://127.0.0.1:9001;
            proxy_http_version 1.1;
            proxy_set_header Host              $host;
            proxy_set_header X-Forwarded-Proto $scheme;
            # Konsol WebSocket kullanır
            proxy_set_header Upgrade    $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    }
    

    client_max_body_size 0; satırı kritiktir; varsayılan 1 MB sınırı büyük dosya yüklemelerini 413 Request Entity Too Large ile reddeder. proxy_request_buffering off; ise Nginx'in yüklemeyi diske tamponlamasını engeller, böylece büyük dosyalar sunucu diskini gereksiz doldurmaz.

    Yapılandırmayı test edip devreye alın, ardından 9000 ve 9001 portlarını dışarıya kapatın:

    sudo nginx -t && sudo systemctl reload nginx
    sudo ufw allow 443/tcp
    sudo ufw deny 9000/tcp
    sudo ufw deny 9001/tcp
    

    Sertifikaları ücretsiz SSL ile alıp certbot üzerinden otomatik yenilemeye bağlayabilirsiniz.

    mc İstemcisiyle Kova ve Kullanıcı Yönetimi#

    MinIO'nun kendi komut satırı istemcisi mc, kova ve kullanıcı yönetimi için en pratik araçtır.

    curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/mc -o /tmp/mc
    sudo install -m 755 /tmp/mc /usr/local/bin/mc
    
    # Sunucuyu bir takma adla tanımla
    mc alias set yerel https://s3.firmaniz.com minioyonetici BURAYA_PAROLA
    
    # Kova oluştur ve sürümlemeyi aç
    mc mb yerel/firmaniz-yedek
    mc version enable yerel/firmaniz-yedek
    
    # 30 günden eski eski sürümleri otomatik temizle
    mc ilm rule add --noncurrent-expire-days 30 yerel/firmaniz-yedek
    

    Kök kimlik bilgilerini uygulamalara vermeyin. Her uygulama için ayrı bir kullanıcı ve yalnızca kendi kovasına erişebilen bir politika oluşturun:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
          "Resource": ["arn:aws:s3:::firmaniz-yedek/*"]
        },
        {
          "Effect": "Allow",
          "Action": ["s3:ListBucket"],
          "Resource": ["arn:aws:s3:::firmaniz-yedek"]
        }
      ]
    }
    
    mc admin policy create yerel yedek-politikasi yedek-politikasi.json
    mc admin user add yerel yedekbot UZUN_RASTGELE_PAROLA
    mc admin policy attach yerel yedek-politikasi --user yedekbot
    

    Buradaki ayrım önemlidir: GetObject/PutObject gibi nesne eylemleri kova/* biçiminde nesne ARN'sini, ListBucket ise yıldızsız kova ARN'sini ister. Karıştırıldığında listeleme "erişim reddedildi" verirken yükleme çalışır ve hata kaynağı bulmak zorlaşır.

    Yedekleme Hedefi Olarak MinIO#

    MinIO'nun en yaygın kullanımı yedek deposu olmaktır. Restic, Borg (rclone üzerinden), Duplicati ve pek çok panel yazılımı S3 hedefini destekler. Restic ile tipik bir kurulum şöyle görünür:

    export AWS_ACCESS_KEY_ID=yedekbot
    export AWS_SECRET_ACCESS_KEY=UZUN_RASTGELE_PAROLA
    export RESTIC_REPOSITORY="s3:https://s3.firmaniz.com/firmaniz-yedek/sunucu1"
    export RESTIC_PASSWORD_FILE=/root/.restic-parola
    
    restic init
    restic backup /var/www /etc /home --exclude-caption
    restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
    restic check --read-data-subset 5%
    

    Son satır çoğu kurulumda atlanır ve bu bir hatadır: yedek almak yeterli değil, geri dönebildiğinizi doğrulamanız gerekir. Aynı sunucudaki bir MinIO'ya yedek almanın sunucu tamamen kaybolduğunda işe yaramayacağını da unutmayın; MinIO'yu ayrı bir makinede ya da ayrı bir lokasyonda konumlandırın. Bütünlüklü bir strateji için felaket kurtarma planı hazırlama ve Borg ile sunucu yedekleme yazılarına bakın.

    Sık Yapılan Hatalar ve Tuzaklar#

    Veriyi kök diske koymak. MINIO_VOLUMES değerini /opt/minio gibi kök dosya sistemindeki bir dizine ayarlarsanız, nesne verisi büyüdükçe sunucunun kendisi durur. Ayrı disk ya da bölüm kullanın.

    MINIO_SERVER_URL ayarlamamak. Ters vekil arkasında bu değişken tanımlı değilse MinIO imzalı URL'leri iç adrese göre üretir; istemciler SignatureDoesNotMatch ya da erişilemeyen bağlantı hataları alır.

    Nginx gövde sınırını unutmak. client_max_body_size varsayılanda 1 MB'dır. Büyük yüklemeler 413 hatasıyla reddedilir ve hata istemci tarafında anlaşılmaz görünür.

    Kök kimlik bilgilerini uygulamalara vermek. Kök kullanıcı tüm kovalara ve yönetim API'sine erişir. Sızarsa saldırgan yedekleri de silebilir. Uygulama başına dar kapsamlı kullanıcı ve politika üretin.

    Saat senkronizasyonunu ihmal etmek. S3 imzaları zaman damgası içerir. Sunucu saati birkaç dakika kaydığında tüm istekler RequestTimeTooSkewed ile reddedilir. sudo timedatectl set-ntp true ile NTP'yi açık tutun.

    Sürümlemeyi lifecycle kuralı olmadan açmak. Sürümleme her üzerine yazmada eski kopyayı saklar. Temizlik kuralı koymazsanız kova sessizce büyür ve diskiniz aylar içinde dolar.

    Tek düğümü yüksek erişilebilirlik sanmak. Tek sunuculu MinIO, disk kaybına (erasure coding ile) dayanabilir ama sunucu kaybına dayanmaz. Kritik hizmetlerde çok düğümlü kurulum ya da ikinci bir kopya gerekir.

    Sıkça Sorulan Sorular#

    MinIO ücretsiz mi#

    MinIO'nun sunucu yazılımı açık kaynaklıdır ve kendi altyapınızda ücretsiz olarak kurup kullanabilirsiniz. Lisans koşulları (AGPL) özellikle yazılımı kendi ürününüze gömüp dağıtacaksanız dikkat edilmesi gereken yükümlülükler içerir; kendi sunucunuzda dâhilî kullanım için sorun çıkarmaz. Ticari destek ve kurumsal özellikler için ayrı bir abonelik modeli sunulur.

    Tek diskle MinIO kurmak güvenli mi#

    Tek diskle kurulum çalışır ve geliştirme ortamı, test ya da ikincil yedek kopyası için yeterlidir. Ancak tek disk, hem disk arızasına hem sunucu arızasına karşı korumasızdır; MinIO'nun silme kodlaması özelliği en az dört disk ister. Üretimde kritik veri tutacaksanız ya birden çok disk kullanın ya da altta RAID kurup üstüne ikinci bir kopya stratejisi ekleyin.

    MinIO Amazon S3'ün yerini tam olarak tutar mı#

    Temel işlemlerde (kova, nesne, çok parçalı yükleme, imzalı URL, sürümleme, yaşam döngüsü) uyumluluk çok yüksektir ve çoğu uygulama fark etmeden çalışır. Farklar daha çok bulut sağlayıcısına özgü ileri servislerde ortaya çıkar: depolama sınıfları arası otomatik geçiş, bölgeler arası çoğaltma ve derin arşiv katmanları gibi özellikler ya yoktur ya farklı çalışır. Uygulamanızın kullandığı çağrıları önceden bir test kovasında doğrulamak en sağlıklı yaklaşımdır.

    MinIO konsoluna erişemiyorum, ne kontrol etmeliyim#

    Sırayla üç şeye bakın. Önce sudo systemctl status minio ile servisin gerçekten çalıştığını ve journalctl -u minio çıktısında hata olmadığını doğrulayın. Sonra konsolun dinlediği portun (--console-address :9001) Nginx tarafından doğru yönlendirildiğini ve WebSocket başlıklarının (Upgrade, Connection) eklendiğini kontrol edin; bu başlıklar yoksa arayüz açılır ama boş kalır. Son olarak MINIO_BROWSER_REDIRECT_URL değerinin dışarıdan eriştiğiniz adresle aynı olduğundan emin olun.

    Var olan dosyalarımı MinIO'ya nasıl taşırım#

    En pratik araç mc ya da rclone'dur. Yerel bir dizini kovaya yansıtmak için mc mirror /var/www/uploads yerel/firmaniz-yuklemeler komutu yeterlidir; --watch parametresiyle sürekli senkron da yapabilirsiniz. Başka bir S3 sağlayıcısından geçiyorsanız rclone sync kaynak:kova yerel:kova --progress kullanın. Taşımadan sonra kaynağı hemen silmeyin; birkaç gün doğrulama için bekletmek iyi bir alışkanlıktır.

    MinIO ne kadar RAM ve CPU ister#

    MinIO görece hafiftir; küçük ve orta ölçekli kurulumlar için 2 vCPU ve 4 GB RAM rahatlıkla yeter. Asıl darboğaz genellikle disk ve ağdır. Çok sayıda eşzamanlı istek ya da yüksek verim gereken senaryolarda RAM'i artırmak listeleme ve önbellek davranışını iyileştirir. Dosya tanımlayıcı limitini (LimitNOFILE) yükseltmeyi de unutmayın, aksi hâlde kaynak yeterli olsa bile yoğunlukta hata alırsınız.

    Kapanış#

    MinIO, S3 API'sini kendi sunucunuza taşımanın en kısa yoludur; tek bir ikili, bir systemd servisi ve önünde bir Nginx ile üretimde kullanılabilir bir nesne deposu elde edersiniz. Aklınızda kalması gereken alışkanlıklar şunlar: veriyi ayrı bir diskte tutun, MINIO_SERVER_URL ile Nginx'i uyumlu ayarlayın, her uygulama için dar kapsamlı kullanıcı ve politika üretin, sürümlemeyi açarken yanına mutlaka bir temizlik kuralı koyun ve yedeklerinizi MinIO'yu barındıran sunucudan başka bir yerde de tutun.

    Bu kurulum için tam root erişimi ve kendi disk düzeninizi kurma özgürlüğü gerekiyor; VDS ve dedicated sunucu paketlerimiz bu esnekliği sağlar, kaynak ihtiyacınız dalgalanıyorsa bulut sunucu seçeneğine bakabilirsiniz. Kurulum, TLS ve izleme tarafını bize bırakmak isterseniz sunucu yönetimi hizmetimiz devreye girebilir; ikinci bir kopya için yedekleme çözümlerimizi de değerlendirebilirsiniz.

    MinIOS3Depolama

    Uygulamaya geçmeye hazır mısınız?

    NVMe SSD, ücretsiz SSL ve %99.9 uptime garantisiyle Clou.TR hosting ve sunucu çözümleriyle projenizi hayata geçirin.