SSD Nodes Learn Hosting plans →
Rehberler Matt ConnorYazan Matt Connor · Güncellendi 2026-08-07

Ubuntu 24.04 uzerinde MinIO kurulumu ve S3 depolama

Ubuntu 24.04 VPS uzerinde kendi S3 uyumlu depolama alaninizi kurun. Binary kurulumu, systemd unit yapilandirmasi, mc komutlari ve restic yedekleme senaryolarini ogrenin.

Verified Every command ran end-to-end on a fresh Ubuntu 24.04 server, July 30, 2026.

MinIO ile kendi kendine barındırılan nesne depolamanın sağladıkları

MinIO, Amazon S3 API ile uyumlu, kendi kendine barındırılan bir nesne depolama çözümüdür. restic veya herhangi bir S3 SDK'sını kendi sunucunuza yönlendirip tek bir endpoint ayarını değiştirdiğinizde, istemci tarafı bir fark algılamaz. Bu kılavuz, Ubuntu 24.04 üzerinde tek düğümlü bir kurulumu ele alır: doğrulanmış bir binary dosyası, özel bir sistem kullanıcısı, root kimlik bilgilerini unit dosyasının dışında tutan bir systemd birimi ve restic yedeklemeleri için kullanılan 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 komutuyla gönderilir ve GET komutuyla geri alınır; kısmi yazma veya yeniden adlandırma işlemi yoktur. Yedekleme araçları bu modeli tercih eder, çünkü bir nesne ya bütünüyle ulaşmıştır ya da hiç ulaşmamıştır.

Tek bir düğüm, verilerinizin 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 arızalı bir diskin değiştirilmesinden sunucu yazılımının yamalanmasına kadar bulut sağlayıcısının üstlendiği tüm sorumlulukları da devralırsınız. Bölümün sonuna doğru, bu takasın ne zaman mantıklı olduğu açıkça belirtilmiştir.

Temmuz 2026 itibarıyla MinIO community edition'ın durumu

Bu bölümü üzerine inşa etmeden önce okuyun, çünkü yakın zamanda değişiklik yapıldı. Mayıs 2025'te MinIO, community edition içindeki web konsolundan yönetim özelliklerini kaldırdı. Tarayıcıda kalan kısım yalnızca 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ı yayınlamayı durdurdu. Projenin README dosyası artık community edition'ın yalnızca kaynak kod olarak dağıtıldığını belirtmektedir. Eski indirme URL'leri çalışmaya devam etmektedir: Temmuz 2026 itibarıyla RELEASE.2025-09-07T16-13-09Z sunucu sürümünü ve RELEASE.2025-08-13T08-35-41Z istemci sürümünü sunmaktadırlar ve daha yeni bir community sürümü yayınlanmamıştır. Dolayısıyla aşağıdaki ikili dosya gerçektir, çalışır durumdadır ve dondurulmuştur. Eylül 2025'ten sonra yayınlanan güvenlik yamaları bu sürümde yer almamaktadır.

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ünüzdeki bir proxy üzerinden erişmesinin nedeni budur. Eğer yamaları takip etmek isterseniz, kaynak koddan derleme yapın. Üreticinin README dosyası, bir Go araç zinciri gerektiren ve ikili dosyayı ~/go/bin/minio konumuna yazan go install github.com/minio/minio@latest komutunu sunmaktadır. Bu ikili dosyayı /usr/local/bin/minio konumuna kurduğunuzda, buradaki diğer tüm adımlar aynı kalacaktır.

MinIO binary dosyasını kurun ve indirmeyi doğrulayın

Sabitlenmiş sürümü ve yayınlanan sağlama toplamını (checksum) indirin. -f bayrağı, curl komutunun bir HTTP hatası durumunda hata sayfasını belirttiğiniz isimle kaydetmek yerine başarısız olmasını sağlar; kullanıcıların bir 404 sayfasını indirip neden çalışmadığını sorgulamasına yol açan durum budur.

cd /tmp
REL=RELEASE.2025-09-07T16-13-09Z
curl -fsSL "https://dl.min.io/server/minio/release/linux-amd64/archive/minio.$REL" -o minio
curl -fsSL "https://dl.min.io/server/minio/release/linux-amd64/archive/minio.$REL.sha256sum" -o minio.sha256sum

İki hash değerini karşılaştırın; yalnızca hash değerlerini karşılaştırdığınızdan emin olun.

published=$(awk '{print $1}' minio.sha256sum)
downloaded=$(sha256sum minio | awk '{print $1}')
[ "$published" = "$downloaded" ] && echo "checksum ok"

Burada sha256sum -c minio.sha256sum kullanmayın. Dosya içindeki hash değerinden sonra yazan etiket minio.RELEASE.2025-09-07T16-13-09Z şeklindedir, ancak biz indirmeyi minio olarak kaydettik; bu nedenle -c mevcut olmayan bir dosyayı arar. Bu durum No such file or directory raporuna ve ardından WARNING: 1 listed file could not be read çıktısına neden olur; bu, indirme işleminin bozuk olduğu izlenimini verse de aslında öyle değildir. Etiket sadece bir isimdir. Garanti sağlayan kısım hash değeridir.

Bu kontrolün neyi kanıtladığı konusunda net olun. Binary dosyası ve hash değeri aynı satıcıdan aynı bağlantı üzerinden geldiği için, eşleşme indirme işleminin tamamlandığını ve aktarım sırasında hasar görmediğini veya değiştirilmediğini kanıtlar. Bu, satıcının güvenilir olduğunu kanıtlamaz. Bu farklı bir sorundur ve hiçbir sha256sum komutu bunu çözemez.

sudo install -o root -g root -m 755 minio /usr/local/bin/minio
minio --version

minio --version komutu minio version RELEASE.2025-09-07T16-13-09Z çıktısını ve ardından birkaç derleme satırını yazdırır. Burada alınan bir Permission denied hatası, modun yanlış olduğu anlamına gelir; command not found hatası ise /usr/local/bin dosyasının PATH yolunuzda bulunmadığını gösterir.

Bir sistem kullanıcısı ve veri dizini oluşturma

MinIO ağ üzerinden yükleme kabul eder, bu nedenle root yetkileriyle çalıştırılmamalıdır. Kullanıcıya ev dizini olmayan ve giriş kabuğu (login shell) bulunmayan 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, 1000'in altında bir UID ile sistem hesabı oluşturur; bu, hesabın kullanıcılar için ayrılan aralığın dışında kalmasını sağlar. -M, sisteme giriş yapmayan bir hesabın ev dizinine ihtiyacı olmadığından bu dizini oluşturmaz. 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 birim (volume) içerisinde .minio.sys dizini oluşturur. Bu nedenle root sahipliğindeki bir dizin, MinIO'nun başlatma sırasında permission denied ile biten bir mesajla kapanmasına neden olur. Aynı kural bu şekilde çalıştırdığınız tüm servisler için geçerlidir ve 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ığı için, herkes tarafından okunabilen unit dosyasında tutulmamalıdır. Dosyayı önce doğru izinlerle oluşturun ve 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/minio

tee, 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 ile durumu doğrulayın. Bu komut Permission denied çıktısını vermelidir.

MinIO'yu başlatmadan önce iki davranışını bilmekte fayda vardır. Ortamında MINIO_ROOT_USER ve MINIO_ROOT_PASSWORD bulunmadığında, MinIO başlatılmayı reddetmez. Belgelenmiş varsayılan kimlik bilgileri olan minioadmin:minioadmin ile başlar; bu, herhangi bir tarayıcının deneyeceği ilk çifttir ve bu sırada tamamen sağlıklı görünür. 8 karakterden kısa bir parola ise reddedilir: MinIO, erişim anahtarının en az 3, gizli anahtarın ise en az 8 karakter olması gerektiğinden, kimlik bilgilerinin geçersiz olduğuna dair bir hata vererek başlangıçta kapanır.

MINIO_VOLUMES veri yoludur ve MINIO_OPTS bayrakları tutar. 127.0.0.1 adresine bağlanmak, bu VPS dışındaki hiçbir şeyin henüz S3 API'sine erişemeyeceği anlamına gelir; bu doğru varsayılan ayardır. Bunu daha sonra, sertifika tutan bir proxy aracılığıyla bilinçli 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.target

EnvironmentFile ü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 tırnak içine alınmamış değişkenleri boşluk karakterlerine göre ayrı argümanlara böldüğü için kasten tırnaksız bırakılmıştır. MINIO_OPTS içindeki dört kelimenin minio server komutuna dört ayrı argüman olarak geçirilme 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 sınır 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/live

is-active komutu active çıktısını vermeli ve sağlık kontrolü 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 izolasyon için [Service] bölümüne ProtectSystem=full ve ProtectHome=true ekleyin. Her ikisi de ana makine çekirdeğinden mount namespace desteğine ihtiyaç duyar. OpenVZ veya LXC gibi ana makine çekirdeğini paylaşan konteyner sanallaştırmalarında bu ayarlar başarısız olabilir ve birim status=226/NAMESPACE hatası verebilir. 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 rehberi, yönergelerin geri kalanını kapsamaktadır.

mc kurulumu ve gidiş-dönüş testi

MinIO istemcisi mc paketidir. Bunu apt install mc ile kurmayın. Bu paket, MinIO ile ilgisi olmayan bir dosya yöneticisi olan Midnight Commander'dır.

cd /tmp
curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/mc -o mc
curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/mc.sha256sum -o mc.sha256sum
[ "$(awk '{print $1}' mc.sha256sum)" = "$(sha256sum mc | awk '{print $1}')" ] && echo "checksum ok"
sudo install -o root -g root -m 755 mc /usr/local/bin/mc

Sunucuyu bir takma ad (alias) olarak kaydedin ve ardından üzerinden bir nesne 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.txt

mc ls komutu, hello.txt dosyasını boyutuyla birlikte listelemeli ve mc cat komutu hello object storage çıktısını vermelidir. Bu gidiş-dönüş testi, sunucunun çalıştığının kesin 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 komutu sunucu durumunu yazdırır.

Sunucu henüz boşken şimdi bir kontrol daha yapın.

mc alias set defaultcheck http://127.0.0.1:9000 minioadmin minioadmin

Bu 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çerisinde 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çerisine yerleştirir. Root takma adını tek bir yönetici hesabında tutun ve her uygulamaya kendi anahtarını verin.

Önceden imzalanmış bir URL ile nesne paylaşımı

Önceden imzalanmış bir URL, kendisine eklenmiş bir imza ve son kullanma tarihi içeren standart bir HTTPS bağlantısıdır. Bağlantıya sahip olan herkes, herhangi bir hesap veya istemci gereksinimi olmadan 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 durum vardır. Bağlantı, kullandığınız takma addaki (alias) uç noktadan oluşturulur; bu nedenle 127.0.0.1 üzerindeki bir takma ad, yalnızca bu makinenin açabileceği bir bağlantı üretir: göndermeyi planladığınız bağlantılar için genel ana makine adınızda (public hostname) ikinci bir takma ad oluşturun. Ayrıca, bir iptal düğmesi bulunmamaktadır. İmza, süresi dolana kadar geçerli kalır; bu nedenle tek kontrol mekanizmanız kısa bir son kullanma süresi belirlemektir. S3 imza formatının izin verdiği maksimum süre yedi gündür.

restic için özel bir anahtar ve bucket oluşturun

root kimlik bilgileri her bucket üzerinde okuma ve silme yetkisine sahiptir, bu nedenle bir yedekleme işi bu bilgileri tutmamalıdır. Bir bucket, yalnızca 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-backup

MinIO, 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 ismini 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 hataya neden 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 snapshots

restic init bir depo parolası ister. Bu parola depoyu şifreler, böylece MinIO yalnızca şifreli metin saklar; parolanın kaybedilmesi yedeğin de 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ü farklı bir makinede, ideal olarak farklı bir bölgede bulunmalıdır. VPS üzerinde restic yedeklemeleri bölümü, bunun üzerine zamanlama ve saklama politikalarını ele alır.

Terminate TLS with nginx

MinIO sits on localhost, so nginx is the public surface. Issue the certificate first, as described in Let's Encrypt certificates with certbot and nginx, then use this server block.

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;
    }
}

Several of those lines are load-bearing. client_max_body_size 0 removes the default 1 MB body limit, which otherwise rejects any larger upload with 413 Request Entity Too Large before MinIO sees the request at all. proxy_request_buffering off streams the upload straight through, because the default spools the whole request into a temporary file first, and a large object then needs disk space twice over. proxy_set_header Host $http_host is the subtle one: an S3 signature covers the Host header, so a proxy that rewrites it makes every request fail with SignatureDoesNotMatch while the access log shows a normal request arriving.

Tell MinIO its public name as well, so the links it generates point at the proxy rather than at localhost.

echo 'MINIO_SERVER_URL=https://s3.example.com' | sudo tee -a /etc/default/minio
sudo systemctl restart minio

The firewall stays small. Allow SSH and HTTPS, and leave ports 9000 and 9001 with no rule at all, because an address bound to 127.0.0.1 is unreachable from another machine whatever the firewall says. ufw firewall basics on a VPS has the commands.

Tek düğümlü MinIO ne zaman yeterlidir ve ne zaman gerçek S3 istenir

Buradaki tek düğüm ifadesi, eşlik (parity) verisi olmayan tek bir sürücüyü ifade eder. MinIO'nun kendi belgeleri bu yerleşimi, test işlemleri ve kullanılabilirlik gereksinimi olmayan küçük iş yükleri için uygun olarak tanımlar. Dağıtım içerisinde ikinci bir kopya bulunmadığından, her nesnenin dayanıklılığı tek bir VPS diskinin dayanıklılığı ile sınırlıdır. Dağıtık silme kodlamalı (erasure-coded) bir arka ucu varsayan özellikler (bucket replikasyonu ve nesne kilitleme dahil), çok sürücülü dağıtımlara aittir; bu nedenle bu kurulum üzerinde kimseye değiştirilemez bir saklama politikası vaat etmeyin.

Bu yapı, başka bir bölgedeki ikinci bir VPS üzerinde restic hedefi olarak veya bir bucket kaybının yalnızca yeniden oluşturma maliyeti getirdiği geliştirme çalışmaları ve CI çıktıları için S3 uç noktası olarak iyi bir tercihtir. Kurtarma planına sahip olduğunuz ve geri yükleme işlemini fiilen test ettiğiniz sürece, küçük bir uygulamadaki kullanıcı yüklemeleri için de makul bir seçenektir.

Bir sözleşme veya düzenleyici kurum nesne kilitleme ya da çok bölgeli dayanıklılık talep ettiğinde veya bir disk dolduğu için saat 03:00'te aranacak kişi olmak istemediğinizde yönetilen S3 hizmetlerini seçin. Dondurulmuş derleme, bir diğer dürüst gerekçedir. Temmuz 2026 itibarıyla, önceden derlenmiş topluluk ikili dosyası Eylül 2025 tarihine aittir ve herhangi bir düzeltme almamaktadır; bu nedenle bu dosyayı çalıştırmak, durumu olduğu gibi kabul etmeyi veya kaynak koddan derleyip projeyi bizzat takip etmeyi gerektirir.

Sıkça gündeme geldiği için bir sınırı belirtmekte fayda vardır. Nesne depolama bir veritabanı değildir. Her yazma işlemi tüm nesneyi değiştirir; bu nedenle bir S3 bucket üzerindeki canlı 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 sonrasında hemen 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, /etc/default/minio değerinin 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 giriş yapıyor. Ortam değişkenleri dosyası sürece ulaşmadı. Birim dosyasının 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ğu içerisinde client_max_body_size 0 ayarını yapılandırın.

SignatureDoesNotMatch. Ya gizli anahtar (secret key) hatalı ya da istemci ile MinIO arasındaki bir bileşen, imzanın kapsadığı Host başlığını yeniden yazdı.

RequestTimeTooSkewed. İstemci veya sunucudaki saat yanlış. Her S3 isteği bir zaman damgası taşır ve 15 dakikalık pencerenin dışındaki istekler reddedilir. timedatectl komutunu kontrol edin ve zaman eşitlemesinin aktif olduğunu doğrulayın.

Var olduğunu bildiğiniz bir bucket üzerinde Access Denied hatası. Anahtar farklı bir bucket için tanımlanmış. 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 makinede çalıştırılan bir restic hedefi olarak yeterlidir. Tek kopyanız olarak kullanılması yeterli değildir. Tek sürücülü bir kurulumda eşlik (parity) yoktur; bu nedenle MinIO içinde ikinci bir kopya bulunmaz ve VPS diski veri kaybederse nesneler silinmiş olur. Başka bir yerde ikinci bir hedef tutun 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?

Çünkü o dosyanın içindeki karma değerinden sonra gelen etiket, minio.RELEASE.2025-09-07T16-13-09Z sürümünü belirtir; ancak indirdiğiniz dosya normalde minio olarak adlandırılır. sha256sum -c, sağlama toplamı dosyasının 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ı döndürür. İndirme işlemi sorunsuzdur. Karma 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ırdı ve web arayüzünde yalnızca bir nesne tarayıcısı bıraktı. 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 desteklenen yöntemdir; bu rehberin her şeyi 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 öğesi bucket ismi olan 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 nedenle MinIO sadece şifreli metni saklar ve dosyalarınızı asla görmez.

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, çünkü S3 kimlik bilgileri ve nesne verileri isteğin içinde taşınır. certbot sertifikası ile 443 numaralı portta bir proxy kullanmak bunu sağlamanın en basit yoludur ve sertifika yenileme işlemini MinIO'dan uzak tutar. --certs-dir değişkenini public.crt ve private.key dosyalarını içeren bir dizine yönlendirirseniz MinIO 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.

#minio#s3#object-storage#self-hosted#vps