Ubuntu 24.04 uzerinde MinIO kurulumu ve yapilandirma
Ubuntu 24.04 VPS uzerinde MinIO kurulumu, sistemd birimi olusturma, mc komut satiri kullanimi ve restic yedekleme hedefleri icin adim adim teknik rehber sunulmaktadir.
MinIO ile self-hosted nesne depolamanın sağladıkları
MinIO, Amazon S3 API ile uyumlu, self-hosted bir nesne depolama çözümüdür. restic veya bir S3 SDK'sını kendi sunucunuza yönlendirip tek bir endpoint ayarını değiştirdiğinizde; günlük nesne okuma, yazma, listeleme ve önceden imzalanmış bağlantı (presigned link) işlemleri için gereken her şey tamamlanmış olur. Ancak uyumluluk, birebir aynılık anlamına gelmez. Örneğin MinIO, Amazon'un nesne ACL (Erişim Denetim Listesi) yapısını uygulamaz ve geliştiricileri bunu uygulama niyetlerinin olmadığını belirtmiştir. Bu nedenle, ACL davranışına bağımlı olan bir uygulamanın çalışması için sadece endpoint değişikliği yeterli olmayacaktır. Bu kılavuz, Ubuntu 24.04 üzerinde tek düğümlü bir yapı kurar: doğrulanmış kaynaktan derlenmiş bir binary, özel bir sistem kullanıcısı, root kimlik bilgilerini unit dosyasının dışında tutan bir systemd birimi ve restic yedeklerinin gönderileceği bir bucket.
S3 (Simple Storage Service), bir dosya sisteminden ziyade bir HTTP API'sidir. Bir bucket içerisine bir anahtar (key) altında nesne PUT eder ve onu GET ile geri alırsınız; standart bir bucket yapısında kısmi yazma veya yeniden adlandırma işlemi yoktur. Amazon'un S3 Express One Zone dizin bucket'ları, kendi ekleme (append) ve yeniden adlandırma çağrılarıyla bu durumun istisnasıdır; ancak bu sadece bir depolama sınıfıdır ve bu kılavuzdaki hiçbir yapı buna dayanmaz. Yedekleme araçları standart modeli tercih eder, çünkü bir nesne ya bütün olarak ulaşmıştır ya da hiç ulaşmamıştır.
Tek bir düğüm, verinizin tek bir kopyasını tutar. Yaptığınız takas budur. Bir VPS maliyeti karşılığında kontrolü sizde olan bir S3 endpoint'ine sahip olursunuz; ancak bununla birlikte, arızalı disk değişiminden sunucu yazılımının yamalanmasına kadar bulut sağlayıcısının eskiden yaptığı tüm işleri de üstlenmiş olursunuz. Son kısımdaki bölüm, bu takasın ne zaman mantıklı olduğunu açıkça belirtmektedir.
Ekim 2026 itibarıyla MinIO community edition durumu
Bu bölümü temel alarak ilerlemeden önce okuyun, çünkü yakın zamanda değişiklikler yapıldı. Mayıs 2025'te MinIO, community edition içerisindeki web konsolundan yönetim özelliklerini kaldırdı. Tarayıcıda kalan tek özellik bir nesne tarayıcısıdır; bu nedenle bucket'lar ve erişim anahtarları artık mc komut satırı istemcisi ile yönetilmektedir.
2025'in ilerleyen dönemlerinde MinIO, önceden derlenmiş community ikili dosyalarını (binary) yayınlamayı durdurdu. Projenin README dosyası, community edition'ın yalnızca kaynak kod olarak dağıtıldığını belirtmektedir ve Nisan 2026'dan beri minio/minio deposu THIS REPOSITORY IS NO LONGER MAINTAINED bildirimiyle arşivlenmiştir. Eski indirme sunucusu da community dosyalarına hizmet vermeyi bırakmıştır. 20 Ekim 2026 tarihinde yapılan kontrolde, bu kılavuzun indirme için kullandığı her dl.min.io yolu, sunucu ikili dosyası, istemci ikili dosyası ve bunların sağlama dosyaları 410 Gone yanıtını vermektedir; bu bir kesinti değil, bilinçli bir kaldırma işlemidir. Sunucuda kalan tek mc ikili dosyası, ticari ürün grubuna ait olan /aistor/mc/release/ altındaki AIStor Client'tır. min.io üzerindeki indirme sayfası artık AIStor Server, AIStor Client, AIStor SDK ve birkaç AIStor eklentisini listelemektedir; ayrıca geliştiricilere, araştırmacılara ve bağımsız kurulumlar çalıştıran küçük organizasyonlara yönelik olduğu belirtilen ücretsiz bir AIStor katmanı sunulmaktadır, ancak herhangi bir community sürümü bulunmamaktadır.
Kaynak kod hala mevcuttur ve son ikili dosyadan daha günceldir. Son community sürümü, 16 Ekim 2025 tarihinde güvenlik sürümü olarak yayınlanan RELEASE.2025-10-15T17-29-55Z'tir: bu sürüm, servis hesapları ve STS'deki bir oturum ilkesi atlaması yoluyla gerçekleşen yetki yükseltme açığını gidermektedir ve sürüm notları tüm kullanıcıların derhal yükseltme yapmasını tavsiye etmektedir. Son önceden derlenmiş ikili dosya Eylül 2025 sürümü olduğundan, bu düzeltmeyi hiçbir zaman almamıştır. Bu kılavuz Ekim sürümünü derlemektedir ve depo arşivlendiği için bu, community edition'ın alacağı son düzeltmedir.
Bu gerçek, kılavuzun geri kalanını şekillendirmektedir. MinIO'nun burada 127.0.0.1 üzerinde dinleme yapmasının ve internete yalnızca sizin kontrol ettiğiniz bir proxy üzerinden erişmesinin nedeni budur.
MinIO ikili dosyasını kurun ve indirmeyi doğrulayın
MinIO, Go diliyle yazılmıştır ve tedarikçinin README dosyası, Go 1.24 veya daha yeni bir sürüm gerektiren tek bir go install komutuyla derleme yapılmasını önerir. Öncelikle Go'yu resmi tarball dosyasından kurun. 20 Ekim 2026 itibarıyla go.dev/dl adresindeki güncel kararlı sürüm, crypto/x509 paketine yönelik bir güvenlik düzeltmesiyle 19 Ekim 2026 tarihinde yayınlanan go1.27.3 sürümüdür; aşağıdaki hash değeri, linux-amd64 arşivi için ilgili sayfada yayınlanan değerdir. Daha yeni bir Go sürümü seçerseniz, hash değerini aynı sayfadan almalısınız. -f bayrağı, curl aracının bir HTTP hatası durumunda hata sayfasını belirttiğiniz isimle kaydetmek yerine hata vermesini sağlar; aksi takdirde kullanıcılar bir 404 sayfasını arşiv dosyası sanıp açmaya çalışabilirler.
cd /tmp
GOVER=go1.27.3
curl -fsSL "https://go.dev/dl/$GOVER.linux-amd64.tar.gz" -o go.tar.gzİki hash değerini karşılaştırın; yalnızca hash değerlerini karşılaştırdığınızdan emin olun.
published=65efbc80fdc1fa2cd2631cad5b481777a68e8725f34e89f50fc6ac714e379b40
downloaded=$(sha256sum go.tar.gz | awk '{print $1}')
[ "$published" = "$downloaded" ] && echo "checksum ok"Bu kontrolün neyi kanıtladığı konusunda net olun. Eşleşme, indirmenin tamamlandığını ve aktarım sırasında hasar görmediğini veya değiştirilmediğini kanıtlar. Bu, tedarikçinin güvenilir olduğunu kanıtlamaz. Bu farklı bir sorundur ve hiçbir sha256sum komutu bunu çözemez.
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go.tar.gz
export PATH=$PATH:/usr/local/go/bin
go versionŞimdi topluluk sürümünü normal kullanıcı hesabınızla derleyin. go install, indirdiği her modülü (MinIO'nun kendi kaynak kodları dahil) sum.golang.org adresindeki Go'nun genel sağlama toplamı veritabanıyla karşılaştırır; bu sayede üzerinde oynanmış veya değiştirilmiş bir modül, ikili dosya üretilmeden önce güvenlik hatası vererek derlemeyi durdurur.
go install github.com/minio/minio@RELEASE.2025-10-15T17-29-55Z
sudo install -o root -g root -m 755 ~/go/bin/minio /usr/local/bin/minio
minio --version
go version -m /usr/local/bin/minio | head -n 3minio --version, sürüm adı olması gereken yerde DEVELOPMENT.GOGET çıktısını verir; çünkü go install, tedarikçinin kendi ikili dosyalarını damgalamak için kullandığı derleme bayraklarını uygulamaz. go version -m, Go'nun her ikili dosyaya gömdüğü modül bilgilerini okur ve mod github.com/minio/minio satırı derlediğiniz commit bilgisini gösterir. Burada bir Permission denied görülmesi modun yanlış olduğunu, command not found görülmesi ise /usr/local/bin aracının PATH yolunuzda bulunmadığını ifade eder. Eğer VPS derleme için yetersiz belleğe sahipse, aynı go install komutunu aynı mimariye sahip başka bir Linux makinesinde çalıştırıp ikili dosyayı kopyalayın.
Sistem kullanıcısı ve veri dizini oluşturma
MinIO ağ üzerinden yükleme kabul ettiği için root yetkileriyle çalıştırılmamalıdır. Bu servis için ev dizini ve giriş kabuğu olmayan bir hesap tanımlayın.
sudo groupadd -r minio-user
sudo useradd -M -r -g minio-user -s /usr/sbin/nologin minio-user
sudo mkdir -p /var/lib/minio/data
sudo chown -R minio-user:minio-user /var/lib/minio
sudo chmod 750 /var/lib/minio-r komutu, 1000'in altında bir UID ile sistem hesabı oluşturur; bu sayede hesap, kullanıcılar için ayrılan aralığın dışında tutulur. -M bayrağı, sisteme giriş yapmayan bir hesabın ev dizinine ihtiyacı olmadığı için bu dizinin oluşturulmasını engeller. Sonucu id minio-user ile kontrol edin; stat -c '%U %a' /var/lib/minio komutu ise minio-user 750 çıktısını vermelidir.
Veri dizini, ilgili kullanıcı tarafından yalnızca okunabilir değil, aynı zamanda yazılabilir olmalıdır. MinIO ilk başlatıldığında kendi yapılandırmasını tutmak için veri hacmi içerisinde bir .minio.sys dizini oluşturur. Bu nedenle root sahipliğindeki bir dizin, MinIO'nun başlatma sırasında permission denied ile biten bir hata mesajı vererek kapanmasına neden olur. Aynı kural bu şekilde çalıştırdığınız tüm servisler için geçerlidir; VPS üzerinde en düşük yetkili servis kullanıcıları rehberi bu konuyu detaylıca ele almaktadır.
Root kimlik bilgilerini bir ortam dosyasına yerleştirin
Root kimlik bilgileri tüm bucket'lara erişim sağladığından, herkes tarafından okunabilen unit dosyasında tutulmamalıdır. Dosyayı önce doğru izinlerle oluşturun, ardından içine yazın; böylece parola hiçbir an okunabilir bir dosyada açıkta kalmaz.
sudo install -o root -g root -m 600 /dev/null /etc/default/minio
printf 'MINIO_ROOT_USER=minio-root\nMINIO_ROOT_PASSWORD=%s\nMINIO_VOLUMES="/var/lib/minio/data"\nMINIO_OPTS="--address 127.0.0.1:9000 --console-address 127.0.0.1:9001"\n' "$(openssl rand -base64 24)" | sudo tee /etc/default/minio > /dev/null
sudo sed -n 's/^MINIO_ROOT_PASSWORD=//p' /etc/default/miniotee, mevcut bir dosyayı yeniden oluşturmak yerine içeriğini temizler; bu sayede dosya modu 600 ve sahibi root olarak kalır. Bu kasıtlı bir durumdur. systemd, EnvironmentFile dosyasını ayrıcalıkları User= kullanıcısına devretmeden önce root olarak okur; bu da servis hesabının kendi kimlik bilgilerini okumasına gerek kalmadığı anlamına gelir. Servis çalışmaya başladığında, sudo -u minio-user cat /etc/default/minio komutu ile durumu doğrulayın. Bu komut Permission denied çıktısını vermelidir.
MinIO'yu başlatmadan önce bilinmesi gereken iki davranış vardır. Ortamında MINIO_ROOT_USER ve MINIO_ROOT_PASSWORD tanımlanmadığında, MinIO başlatılmayı reddetmez. Dokümante edilmiş varsayılan kimlik bilgileri olan minioadmin:minioadmin ile başlar; bu, herhangi bir tarayıcının deneyeceği ilk kombinasyondur ve sistem bu durumda tamamen sağlıklı görünür. 8 karakterden kısa bir parola ise reddedilir: MinIO, access key en az 3, secret key ise en az 8 karakter gerektirdiği için kimlik bilgilerinin geçersiz olduğunu belirten bir hata ile başlatma aşamasında kapanır.
MINIO_VOLUMES veri yoludur ve MINIO_OPTS bayrakları tutar. 127.0.0.1 adresine bağlanmak, S3 API'ye henüz bu VPS dışından erişilemeyeceği anlamına gelir ki bu doğru varsayılan ayardır. Erişimi daha sonra, sertifika barındıran bir proxy üzerinden kasıtlı olarak açarsınız.
systemd birimini yazın
/etc/systemd/system/minio.service dosyasını oluşturun:
[Unit]
Description=MinIO object storage
Documentation=https://github.com/minio/minio
Wants=network-online.target
After=network-online.target
[Service]
User=minio-user
Group=minio-user
EnvironmentFile=/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO_VOLUMES $MINIO_OPTS
Restart=always
RestartSec=5
LimitNOFILE=65536
NoNewPrivileges=true
[Install]
WantedBy=multi-user.targetEnvironmentFile üzerinde başında - bulunmaması bir yazım hatası değil, bilinçli bir tercihtir. Tire işareti kullanıldığında systemd eksik bir dosyayı görmezden gelir ve MinIO'yu yine de başlatır; bu durumda silinmiş bir dosya veya yanlış yazılmış bir yol, sunucunun sessizce minioadmin:minioadmin üzerinde çalışmasına neden olur. Tire işareti olmadığında ise eksik bir dosya, MinIO çalışmadan önce birimin başarısız olmasına yol açar ve journalctl -u minio üzerinde Failed to load environment files: No such file or directory hatası görüntülenir. Başlamayı reddeden bir birimi fark etmek, varsayılan parolayı sessizce kabul eden bir sunucuyu fark etmekten çok daha kolaydır.
$MINIO_VOLUMES ve $MINIO_OPTS değişkenleri, systemd'nin tırnak içine alınmamış değişkenleri boşluk karakterlerine göre ayırarak ayrı argümanlara dönüştürmesi nedeniyle kasten tırnaksız bırakılmıştır. MINIO_OPTS içindeki dört kelimenin minio server için dört ayrı argümana dönüşme yöntemi budur. LimitNOFILE=65536, dosya tanımlayıcı sınırını yükseltir; çünkü her açık bağlantı ve her açık veri dosyası bir tanımlayıcı tüketir ve 1024 olan varsayılan değer yük altında yetersiz kalır.
sudo systemctl daemon-reload
sudo systemctl enable --now minio
systemctl is-active minio
curl -fsS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:9000/minio/health/liveis-active komutu active çıktısını vermeli ve sağlık durumu uç noktası 200 yanıtını döndürmelidir. journalctl -u minio -n 20 --no-pager, sunucunun dinlediği API adresini gösterir. Birim sürekli yeniden başlatılıyorsa systemd pes eder ve Start request repeated too quickly günlüğünü kaydeder; bu, MinIO'nun her denemede kapandığı anlamına gelir. Nedeni bu mesajın üzerindeki satırlarda yazılıdır, bu yüzden kayıtları yukarı doğru okuyun.
Daha fazla yalıtım için [Service] bölümüne ProtectSystem=full ve ProtectHome=true ekleyin. Her ikisi de ana makine çekirdeğinden mount ad alanlarına ihtiyaç duyar. OpenVZ veya LXC gibi ana makine çekirdeğini paylaşan kapsayıcı sanallaştırmalarında bu ayarlar başarısız olabilir ve birim status=226/NAMESPACE hatası bildirir. Bu iki satırı kaldırdığınızda birim çalışacaktır. Birimin kendisi standart bir birimdir ve VPS üzerinde systemd servisleri ve zamanlayıcıları belgesi, yönergelerin geri kalanını kapsamaktadır.
mc kurulumu ve gidiş-dönüş testi
MinIO istemcisi mc'dir. Kurulumu apt install mc ile yapmayın. Bu paket, MinIO ile ilgisi olmayan bir dosya yöneticisi olan Midnight Commander'dır.
dl.min.io hala bir mc ikili dosyası sunmaktadır ancak bu topluluk sürümü değildir. Eski topluluk yolu olan https://dl.min.io/client/mc/release/linux-amd64/mc, 410 Gone yanıtını vermektedir. MinIO'nun burada sunduğu şey, https://dl.min.io/aistor/mc/release/linux-amd64/mc adresindeki AIStor Client'tır; AIStor CLI referansı bunu işaret etmekte ve lisanslı AIStor Server dağıtımları için özel işlevlere sahip olduğunu belirtmektedir. Söz konusu referansta topluluk sunucusuyla kullanımına dair bir bilgi bulunmadığından, bu kılavuz topluluk istemcisi ile devam etmektedir. minio/mc deposu Temmuz 2026'dan beri arşivlenmiştir; bu nedenle son sürümü olan RELEASE.2025-08-13T08-35-41Z'ü aynı Go araç zinciriyle derleyin. Sağlama toplamı veritabanı bu indirmeyi de kapsamaktadır.
go install github.com/minio/mc@RELEASE.2025-08-13T08-35-41Z
sudo install -o root -g root -m 755 ~/go/bin/mc /usr/local/bin/mcSunucuyu bir takma ad (alias) olarak kaydedin ve ardından bir nesneyi bu sunucu üzerinden taşıyın.
MINIO_PASS=$(sudo sed -n 's/^MINIO_ROOT_PASSWORD=//p' /etc/default/minio)
mc alias set local http://127.0.0.1:9000 minio-root "$MINIO_PASS"
mc mb local/backups
echo "hello object storage" > /tmp/hello.txt
mc cp /tmp/hello.txt local/backups/hello.txt
mc ls local/backups
mc cat local/backups/hello.txtmc ls, hello.txt dosyasını boyutuyla birlikte listelemeli ve mc cat, hello object storage çıktısını vermelidir. Bu gidiş-dönüş testi, sunucunun çalıştığının gerçek kanıtıdır; çünkü diğer tüm istemcilerin yapacağı imzalı S3 isteklerinin aynısını gerçekleştirir. İkinci bir görüş almak isterseniz mc admin info local sunucu durumunu yazdırır.
Sunucu henüz boşken bir kontrol daha yapın.
mc alias set defaultcheck http://127.0.0.1:9000 minioadmin minioadminBu komut başarısız olmalıdır. Eğer başarılı olursa, ortam dosyası sürece ulaşmamış demektir ve sunucunuz varsayılan kimlik bilgileriyle çalışıyordur. Makineye başka herhangi bir işlem yapmadan önce bunu düzeltin.
mc, takma adları ~/.mc/config.json içinde düz metin olarak saklar; bu nedenle söz konusu kimlik bilgileri, komutu çalıştıran kişinin ev dizininde bulunur. mc komutunu sudo altında çalıştırmak, root kimlik bilgilerini /root/.mc/config.json içine yerleştirir. Root takma adını tek bir yönetici hesabında tutun ve her uygulamaya kendi anahtarını atayın.
Önceden imzalanmış bir URL ile tek bir nesne paylaşma
Önceden imzalanmış bir URL, ekinde imza ve son kullanma tarihi bulunan sıradan bir HTTPS bağlantısıdır. Bağlantıya sahip olan herkes, bir hesaba veya istemciye ihtiyaç duymadan ilgili nesneyi çekebilir.
mc share download --expire 12h local/backups/hello.txtÇıktı, sorgu dizisinde X-Amz-Signature ve X-Amz-Expires parametrelerini taşır. Bu konuda kullanıcıları şaşırtan iki husus vardır. Bağlantı, kullandığınız takma addaki uç noktadan oluşturulur; dolayısıyla 127.0.0.1 üzerindeki bir takma ad, yalnızca o makinenin açabileceği bir bağlantı üretir: göndermeyi planladığınız bağlantılar için genel ana makine adınızda ikinci bir takma ad oluşturun. Ayrıca bağlantı başına bir iptal düğmesi bulunmaz. İmza, süresi dolana veya onu imzalayan anahtar kaldırılana ya da değiştirilene kadar geçerli kalır. root kimlik bilgileriyle imzalanan bir bağlantı için bu, kimlik bilgilerinin değiştirilmesi anlamına gelir; bu nedenle kısa bir son kullanma süresi pratik bir kontrol yöntemidir. Yedi gün, S3 imza formatının izin verdiği maksimum süredir.
restic için özel bir anahtar ve bucket oluşturun
root kimlik bilgileri her bucket'ı okuyabilir ve silebilir; bu nedenle bir yedekleme işi bu yetkilere sahip olmamalıdır. Bir bucket, bu bucket ile sınırlandırılmış bir politika ve başka hiçbir yetkisi olmayan bir kullanıcı oluşturun.
mc mb local/restic
cat > /tmp/restic-rw.json <<'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket", "s3:GetBucketLocation"],
"Resource": ["arn:aws:s3:::restic"]
},
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
"Resource": ["arn:aws:s3:::restic/*"]
}
]
}
EOF
RESTIC_KEY=$(openssl rand -base64 24)
mc admin policy create local restic-rw /tmp/restic-rw.json
mc admin user add local restic-backup "$RESTIC_KEY"
mc admin policy attach local restic-rw --user restic-backupMinIO, bir komut daha kısa sürecek yerleşik bir readwrite politikası ile gelir ancak bu politika sunucudaki her bucket üzerinde tam erişim sağlar. Yukarıdaki politika, bucket adını kasten iki kez belirtir: bucket listeleme işleminin çalışması için arn:aws:s3:::restic olarak ve içindeki nesneler için arn:aws:s3:::restic/* olarak. S3'te bir bucket ve içindeki nesneler ayrı kaynaklardır; bu nedenle yalnızca birini belirten bir politika, bozuk bir istemci gibi görünen bir hata ile başarısız olur.
Sınırlamayı güvenilirliğinden emin olmadan önce test edin.
mc alias set resticuser http://127.0.0.1:9000 restic-backup "$RESTIC_KEY"
mc ls resticuser/restic
mc ls resticuser/backupsİlk ls başarılı olurken ikincisi Access Denied hatasıyla başarısız olur. Test etmediğiniz bir politika sadece bir tahmindir.
Şimdi restic'i bucket'a yönlendirin. restic, S3 kimlik bilgilerini standart AWS ortam değişkenlerinden okur; bu nedenle restic'e özel bir kimlik bilgisi dosyası gerekmez.
sudo apt install -y restic
export AWS_ACCESS_KEY_ID=restic-backup
export AWS_SECRET_ACCESS_KEY="$RESTIC_KEY"
restic -r s3:http://127.0.0.1:9000/restic init
restic -r s3:http://127.0.0.1:9000/restic backup /etc
restic -r s3:http://127.0.0.1:9000/restic snapshotsrestic init bir depo parolası ister. Bu parola depoyu şifreler; böylece MinIO yalnızca şifreli metin saklar ve parolanın kaybedilmesi yedeğin kaybedilmesi anlamına gelir. systemd zamanlayıcısı tarafından başlatılan bir çalıştırmanın parola girmek için bir terminali yoktur; bu nedenle zamanlanmış yedeklemeler için RESTIC_PASSWORD_FILE değişkenini 600 modunda bir dosyaya ayarlayın.
Bir yerleştirme kuralı, yukarıdaki tüm komutlardan daha önemlidir. Koruduğu verilerle aynı VPS üzerinde bulunan bir restic deposu, sizi yalnızca hatalı bir rm işleminden korur, başka hiçbir şeyden değil. MinIO düğümü, ideal olarak farklı bir bölgede bulunan ayrı bir makine olmalıdır. VPS üzerinde restic yedekleri konusu, bunun üzerine zamanlama ve saklama politikalarını kapsar.
Nginx ile TLS termination
MinIO localhost üzerinde çalıştığı için dış dünyaya açılan yüzey Nginx'tir. Öncelikle certbot ve nginx ile Let's Encrypt sertifikaları bölümünde açıklandığı şekilde sertifikayı alın, ardından bu server bloğunu kullanın.
server {
listen 443 ssl;
server_name s3.example.com;
ignore_invalid_headers off;
client_max_body_size 0;
proxy_buffering off;
proxy_request_buffering off;
location / {
proxy_set_header Host $http_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;
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_pass http://127.0.0.1:9000;
}
}Bu satırlardan birkaçı kritik öneme sahiptir. client_max_body_size 0, aksi takdirde daha büyük yüklemeleri MinIO isteği görmeden önce 413 Request Entity Too Large hatasıyla reddeden varsayılan 1 MB gövde sınırını kaldırır. proxy_request_buffering off, yüklemeyi doğrudan akıtır; çünkü varsayılan yapılandırma isteğin tamamını önce geçici bir dosyaya yazar ve büyük bir nesne için disk alanının iki kez kullanılmasına neden olur. proxy_set_header Host $http_host ise kritik bir ayardır: S3 imzası Host başlığını kapsar, bu nedenle başlığı yeniden yazan bir proxy, erişim loglarında normal bir istek görünmesine rağmen her isteğin SignatureDoesNotMatch hatasıyla başarısız olmasına yol açar.
MinIO'ya genel adını da bildirin; böylece oluşturduğu bağlantılar localhost yerine proxy'yi işaret eder.
echo 'MINIO_SERVER_URL=https://s3.example.com' | sudo tee -a /etc/default/minio
sudo systemctl restart minioGüvenlik duvarı kurallarını sınırlı tutun. SSH ve HTTPS trafiğine izin verin; 9000 ve 9001 numaralı portlar için herhangi bir kural tanımlamayın. Çünkü 127.0.0.1 adresine bağlı bir servis, güvenlik duvarı ayarı ne olursa olsun başka bir makineden erişilemez durumdadır. VPS üzerinde ufw güvenlik duvarı temelleri bölümünde ilgili komutlar yer almaktadır.
Tek düğümlü MinIO ne zaman yeterlidir ve ne zaman gerçek S3 istenir
Buradaki tek düğüm, tek bir sürücü anlamına gelir; dolayısıyla dağıtım içinde eşlik (parity) veya ikinci bir kopya yoktur ve her nesnenin dayanıklılığı, tek bir VPS diskinin dayanıklılığı ile sınırlıdır. Barındırılan topluluk belgeleri Ekim 2025'te kaldırıldığından beri yalnızca minio/docs deposunda kaynak olarak varlığını sürdüren MinIO'nun kendi belgeleri, bağımsız dağıtımı erken geliştirme ve değerlendirme aşamaları için tanımlamakta ve MinIO'nun bunu üretim ortamlarında önermediğini belirtmektedir. Nesne kilitleme (object locking) bir bucket için açılabilir, ancak tek bir VPS üzerinde bu özellik yalnızca S3 API aracılığıyla silmeyi engeller. Makinede root yetkisine sahip herhangi biri disk üzerindeki dosyaları yine de silebilir, bu nedenle bu kurulumda kimseye değiştirilemez bir saklama politikası taahhüdünde bulunmayın.
Bu kurulum, başka bir bölgedeki ikinci bir VPS üzerinde restic hedefi olarak ve bir bucket kaybının yalnızca yeniden oluşturma maliyeti getirdiği geliştirme çalışmaları ile CI çıktıları için S3 uç noktası olarak uygundur. Ayrıca, kurtarma planına sahip olduğunuz ve geri yükleme işlemini gerçekten test ettiğiniz sürece, küçük bir uygulamadaki kullanıcı yüklemeleri için de makuldür.
Bir sözleşme veya düzenleyici kurum nesne kilitleme ya da çoklu bölge dayanıklılığı talep ettiğinde veya bir disk dolduğu için saat 03:00'te aranacak kişi olmak istemediğinizde yönetilen S3 hizmetlerini tercih edin. Dondurulmuş kod, bir diğer dürüst gerekçedir. 20 Ekim 2026 itibarıyla topluluk sürümü arşivlenmiştir ve artık bakımı yapılmamaktadır; bu kılavuzun derlediği sürüm, onun son sürümü olan RELEASE.2025-10-15T17-29-55Z'dir. Bundan sonra hiçbir hata düzeltilmeyecektir, dolayısıyla bu sürümü çalıştırmak, bu durumu kabul etmek veya MinIO'nun ticari AIStor hattına ya da kendi kendine barındırılan MinIO alternatifleri sayfasında karşılaştırılan başka bir depolama çözümüne geçmek anlamına gelir.
Sıkça karşılaşıldığı için bir sınırı belirtmekte fayda vardır. Nesne depolama bir veritabanı değildir. Standart bir bucket içinde her yazma işlemi tüm nesnenin yerini alır; Amazon'un S3 Express One Zone için eklediği append çağrısı bile veriyi yalnızca sona ekler, bu nedenle S3 bucket üzerindeki canlı bir SQL dosyası yavaş ve güvensizdir. Veritabanını yerel diskte tutun ve bunun yerine bucket içine yedekleyin: VPS üzerinde üretim ortamında SQLite çalıştırma bu ayrımı açıklamaktadır.
Hata modları ve karşılaşacağınız mesajlar
Birim systemctl enable --now hemen ardından başarısız oluyor. journalctl -u minio -n 30 --no-pager dosyasını okuyun. Failed to load environment files: No such file or directory hatası, /etc/default/minio dosyasının eksik olduğu veya birim dosyasındaki yolunun yanlış yazıldığı anlamına gelir. permission denied ile biten bir mesaj, veri dizininin servis hesabı tarafından yazılabilir olmadığını gösterir; bu nedenle stat -c '%U' /var/lib/minio/data komutunun minio-user çıktısını verip vermediğini kontrol edin.
minioadmin:minioadmin hala oturum açıyor. Ortam dosyası sürece hiçbir zaman ulaşmadı. Birimin EnvironmentFile=/etc/default/minio içerdiğini doğrulayın, sudo systemctl daemon-reload komutunu çalıştırın ve ardından servisi yeniden başlatın. MinIO, kök kimlik bilgilerini yalnızca başlangıçta okur; bu nedenle dosyayı yeniden başlatma yapmadan düzenlemek hiçbir şeyi değiştirmez.
Başlangıçta Address already in use hatası. Başka bir süreç 9000 numaralı portu kullanıyor. MinIO'nun portunu değiştirmeden önce sudo ss -ltnp | grep :9000 komutu ile bu süreci bulun.
1 MB üzerindeki yüklemeler proxy üzerinden başarısız oluyor. nginx 413 Request Entity Too Large yanıtını verdi ve MinIO isteği hiç görmedi. Server bloğunda client_max_body_size 0 ayarını yapılandırın.
SignatureDoesNotMatch. Ya gizli anahtar yanlıştır ya da istemci ile MinIO arasındaki bir bileşen, imzanın kapsadığı Host başlığını yeniden yazmıştır.
RequestTimeTooSkewed. İstemci veya sunucudaki saat yanlıştır. İmzalı her S3 isteği bir zaman damgası taşır; MinIO da Amazon S3 gibi, zaman damgası kendi saatinden 15 dakikadan fazla farklı olan başlık imzalı istekleri reddeder. Önceden imzalanmış bağlantılar ise geçerlilik sürelerine göre kontrol edilir. timedatectl komutunu kontrol edin ve zaman eşitlemenin aktif olduğunu doğrulayın.
Var olduğunu bildiğiniz bir bucket üzerinde Access Denied. Anahtar farklı bir bucket ile sınırlandırılmıştır. Politikanın gerçekte neye izin verdiğini mc admin policy info local restic-rw ile yazdırın ve kaynak satırlarındaki bucket adını karşılaştırın.
FAQ
Tek düğümlü MinIO gerçek yedeklemeler için yeterli mi?
Verilerin korunduğu makineden ayrı bir sunucuda restic hedefi olarak çalıştırıldığında yeterlidir. Ancak tek yedekleme kopyanız olarak yeterli değildir. Tek diskli bir kurulumda eşlik (parity) verisi yoktur; bu nedenle MinIO içinde ikinci bir kopya bulunmaz ve VPS diski veri kaybına uğrarsa nesneler silinir. Başka bir konumda ikinci bir hedef bulundurun ve sürecin çalıştığından emin olmak için her iki hedeften de en az bir kez geri yükleme yapın.
sha256sum -c neden MinIO'nun sağlama toplamı (checksum) dosyasında başarısız oluyor?
Bu dosyayla yalnızca daha önce kaydedilmiş bir kopyada karşılaşırsınız; çünkü 20 Ekim 2026 tarihinde kontrol edildiğinde dl.min.io, tüm topluluk sürümleri ve sağlama toplamı dosyaları için 410 Gone yanıtını vermiştir. Dosya içindeki hash değerinden sonra gelen etiket, minio.RELEASE.2025-09-07T16-13-09Z gibi sürüm adını belirtirken, indirilen dosya genellikle minio olarak adlandırılır. sha256sum -c, sağlama toplamı dosyası içinde yazılı olan isimde bir dosya arar, bulamaz ve No such file or directory ile WARNING: 1 listed file could not be read hatalarını raporlar. İndirme işlemi sorunsuzdur. Hash dizilerini doğrudan karşılaştırın ve hiçbir güvenlik anlamı taşımayan etiketi görmezden gelin.
MinIO yönetici web konsolu nereye gitti?
MinIO, Mayıs 2025'te topluluk sürümü konsolundan yönetim özelliklerini kaldırmış ve web arayüzünde yalnızca bir nesne tarayıcısı bırakmıştır. Bucket'lar ve kullanıcılar artık mc admin user add ve mc admin policy attach gibi komutlar kullanılarak mc istemcisi ile yönetilmektedir. Bu, bir geçici çözüm değil, topluluk sürümünde hedeflenen yöntemdir; bu rehberin tüm işlemleri komut satırından yapmasının nedeni de budur.
restic'i S3 arka ucu olarak MinIO'ya nasıl yönlendiririm?
AWS_ACCESS_KEY_ID ve AWS_SECRET_ACCESS_KEY değişkenlerini bir MinIO erişim anahtarı ve gizli anahtarı ile ayarlayın, ardından son yol öğesinin bucket adı olduğu s3:https://s3.example.com/restic biçiminde bir depo dizgisi kullanın. Bucket'ı öncelikle mc mb ile oluşturun; çünkü tek bir bucket ile sınırlandırılmış bir anahtarın yeni bucket oluşturma yetkisi yoktur. restic, yükleme öncesinde her şeyi kendi depo parolasıyla şifreler; bu sayede MinIO yalnızca şifreli metni saklar ve dosyalarınızı asla göremez.
MinIO'yu nginx arkasında çalıştırmak zorunda mıyım?
İstemci aynı makinede olmadığında TLS (taşıma katmanı güvenliği) kullanmanız gerekir; aksi takdirde her nesne, erişim anahtarı kimliği ve istek imzasıyla birlikte ağ üzerinden düz metin olarak iletilir. S3 imzalama işlemi gizli anahtarı yalnızca yerel olarak imza hesaplamak için kullandığından, gizli anahtarın kendisi istemciden asla ayrılmaz. Ancak ağ yolundaki herhangi biri verilerinizi okuyabilir ve zaman damgası geçerli olduğu sürece yakalanan bir isteği tekrar oynatabilir (replay attack). certbot sertifikasıyla 443 numaralı portta bir proxy kullanmak, TLS sağlamanın en basit yoludur ve sertifika yenileme işlemini MinIO'dan uzak tutar. MinIO, --certs-dir değişkenini public.crt ve private.key dosyalarını içeren bir dizine yönlendirirseniz TLS sonlandırmasını kendisi de yapabilir; ancak bu durumda servis hesabının yenilenen özel anahtara okuma erişimi olması gerekir ki bu da aynı sonuç için fazladan iş yükü demektir.