SSD Nodes Learn 8GB RAM — yılda $66
Rehberler Matt ConnorYazan Matt Connor · Güncellendi 2026-08-01

Ubuntu 24.04 VPS'te MinIO S3 Depolama Kurulumu

Ubuntu 24.04 üzerinde MinIO'yu doğrulanmış binary ve systemd ile kurun; mc, presigned URL ve restic için kendi yönettiğiniz S3 endpoint'ini hazırlayın.

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

MinIO ile self-hosted nesne depolama size ne sağlar

MinIO, Amazon S3 API'sini destekleyen self-hosted nesne depolama yazılımıdır. restic'i veya herhangi bir S3 SDK'sini kendi sunucunuza yönlendirin, tek bir endpoint ayarını değiştirin; istemci aradaki farkı algılayamaz. Bu kılavuzda Ubuntu 24.04 üzerinde tek düğümlü bir kurulum oluşturulur: doğrulanmış bir binary, özel bir sistem kullanıcısı, root kimlik bilgilerini unit dosyasından uzak tutan bir systemd unit'i ve restic'in yedekleri yazacağı bir bucket.

S3 (simple storage service), dosya sistemi yerine HTTP API'sidir. Bir nesneyi bir key altında bucket'a PUT ile yazıp GET ile alırsınız. Kısmi yazma ve yeniden adlandırma yoktur. Yedekleme araçları bu modeli tercih eder. Çünkü bir nesne ya eksiksiz olarak ulaşır ya da ulaşmaz.

Bir düğüm, verilerinizin tek bir kopyasını tutar. Yapılan tercih bunun karşılığıdır. Bir VPS maliyeti karşılığında denetiminizde olan bir S3 endpoint'i elde edilir. Buna karşılık, başarısız bir diski değiştirmekten sunucu yazılımına yama uygulamaya kadar cloud provider'ın daha önce yaptığı tüm işler de üstlenilir. Sonlara yakın bölümde bu tercihin hangi durumlarda uygun olduğu açıkça belirtilir.

Temmuz 2026'da MinIO topluluk sürümünün durumu

Üzerine kurulum yapmadan önce bu bölümü okuyun, çünkü yakın zamanda değişti. MinIO, Mayıs 2025'te topluluk sürümündeki web konsolundan yönetim özelliklerini kaldırdı. Tarayıcıda artık yalnızca bir nesne tarayıcısı bulunuyor. Bu nedenle bucket'lar ve erişim anahtarları bunun yerine mc komut satırı istemcisiyle yönetiliyor.

MinIO, 2025'in ilerleyen dönemlerinde önceden derlenmiş topluluk ikililerini yayımlamayı durdurdu. Projenin README dosyasında artık topluluk sürümünün yalnızca kaynak kodu olarak dağıtıldığı belirtiliyor. Eski indirme URL'leri hâlâ çalışıyor: Temmuz 2026 itibarıyla bu URL'ler sunucu derlemesi RELEASE.2025-09-07T16-13-09Z ve istemci derlemesi RELEASE.2025-08-13T08-35-41Z sağlıyor; daha yeni bir topluluk derlemesi yayımlanmadı. Bu nedenle aşağıdaki ikili gerçektir ve çalışır, ancak sabitlenmiştir. Eylül 2025'ten sonra yayımlanan güvenlik düzeltmeleri bu ikilide bulunmuyor.

Bu tek bilgi, kılavuzun geri kalanını belirliyor. MinIO'nun burada 127.0.0.1 üzerinde dinlemesinin ve internete yalnızca denetiminizdeki bir proxy üzerinden erişmesinin nedeni budur. Düzeltmeleri izlemek isterseniz kaynak koddan derleyin. Tedarikçi README dosyasında go install github.com/minio/minio@latest şeklinde tek bir komut veriliyor. Bu komut için bir Go araç zinciri gerekiyor ve ikiliyi ~/go/bin/minio konumuna yazıyor. Bu ikiliyi /usr/local/bin/minio konumuna yükleyin; buradaki diğer tüm adımlar değişmeden kalır.

MinIO ikili dosyasını kurma ve indirilen dosyayı doğrulama

Sabitlenen sürümü ve yayımlanmış sağlama değerini indirin. -f seçeneği, HTTP hatası oluştuğunda curl komutunun başarısız olmasını sağlar. Böylece hata sayfası istenen adla kaydedilmez. Aksi durumda 404 sayfası kurulabilir ve neden çalışmadığı anlaşılamayabilir.

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ırın.

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

Burada sha256sum -c minio.sha256sum komutunu kullanmayın. Dosyanın içinde hash değerinden sonra yazılan etiket minio.RELEASE.2025-09-07T16-13-09Z değeridir. İndirilen dosya ise minio adıyla kaydedilmiştir. Bu nedenle -c mevcut olmayan bir dosyayı arar. No such file or directory bildiriminin ardından WARNING: 1 listed file could not be read çıktısını verir. Bu durum bozuk bir indirme gibi görünür, ancak indirme bozuk değildir. Etiket yalnızca bir addır. Güvenceyi sağlayan kısım hash değeridir.

Bu denetimin neyi kanıtladığı açıkça belirtilmelidir. İkili dosya ile hash değeri aynı sağlayıcıdan ve aynı bağlantı üzerinden alınmıştır. Bu nedenle eşleşme, indirmenin eksiksiz olduğunu ve aktarım sırasında bozulmadığını veya değiştirilmediğini kanıtlar. Sağlayıcının güvenilir olduğunu kanıtlamaz. Bu farklı bir sorundur ve hiçbir sha256sum komutu bunu çözmez.

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

minio --version, minio version RELEASE.2025-09-07T16-13-09Z ile birlikte birkaç derleme satırı yazdırır. Burada Permission denied, kipin yanlış olduğu anlamına gelir. command not found ise /usr/local/bin değerinin PATH üzerinde bulunmadığı anlamına gelir.

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

MinIO ağdan yükleme kabul eder. Bu nedenle root olarak çalıştırılmamalıdır. MinIO için ana dizini ve oturum açma kabuğu olmayan bir hesap oluşturun.

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, UID değeri 1000'in altında olan bir sistem hesabı oluşturur. Böylece bu hesap, insanlar için kullanılan aralığın dışında kalır. -M ana dizini oluşturmaz. Oturum açmayacak bir hesabın ana dizine ihtiyacı yoktur. Sonucu id minio-user ile ve çıktısında minio-user 750 yazması gereken stat -c '%U %a' /var/lib/minio ile denetleyin.

Veri dizini yalnızca okunabilir değil, bu kullanıcı tarafından yazılabilir de olmalıdır. MinIO ilk başlatıldığında, kendi yapılandırmasını saklamak için volume içinde bir .minio.sys dizini oluşturur. Bu nedenle root sahibi bir dizin, başlangıç sırasında MinIO'nun permission denied ile biten bir iletiyle çıkmasına neden olur. Bu kural, bu şekilde çalıştırılan her hizmet için geçerlidir. VPS üzerinde en az ayrıcalıklı hizmet kullanıcıları bu konuyu ayrıntılı olarak açıklar.

root kimlik bilgilerini bir ortam dosyasına koyma

root kimlik bilgileri tüm bucket'lara erişim sağlar. Bu nedenle herkes tarafından okunabilen unit dosyasında bulunmamalıdır. Önce dosyayı doğru izinlerle oluşturun, ardından içine yazın. Böylece parola kısa bir süre için bile okunabilir bir dosyada bulunmaz.

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 dosyanın içeriğini silerek üzerine yazar ve dosyayı yeniden oluşturmaz. Bu nedenle izinler 600, sahip ise root olarak kalır. Bu davranış bilinçli olarak seçilmiştir. systemd, ayrıcalıkları User= hesabına düşürmeden önce EnvironmentFile dosyasını root olarak okur. Böylece servis hesabının kendi kimlik bilgilerini okuması gerekmez. Servis çalışmaya başladıktan sonra bunu sudo -u minio-user cat /etc/default/minio ile doğrulayın. Bu komut Permission denied çıktısını vermelidir.

MinIO'yu başlatmadan önce iki davranışını bilmek gerekir. Ortamında MINIO_ROOT_USER ve MINIO_ROOT_PASSWORD bulunmadığında MinIO başlatmayı reddetmez. Belgelenen varsayılan kimlik bilgileriyle, yani tarayıcıların ilk denediği çift olan minioadmin:minioadmin ile başlar ve bu sırada tamamen sağlıklı görünür. Bunun yerine 8 karakterden kısa bir parola reddedilir. MinIO başlangıç sırasında kimlik bilgilerinin geçersiz olduğunu belirten bir hatayla çıkar. Bunun nedeni, access key değerinin en az 3, secret key değerinin ise en az 8 karakter gerektirmesidir.

MINIO_VOLUMES veri yoludur, MINIO_OPTS ise flag'leri içerir. 127.0.0.1 adresine bağlanmak, bu VPS dışındaki hiçbir istemcinin henüz S3 API'ye erişememesi anlamına gelir. Bu doğru varsayılandır. Erişim daha sonra sertifika barındıran bir proxy üzerinden, bilinçli olarak açılır.

systemd birimini yazma

/etc/systemd/system/minio.service 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şta - bulunmaması bir yazım hatası değil, bilinçli bir tercihtir. Tire kullanıldığında systemd eksik dosyayı yok sayar ve MinIO'yu yine başlatır. Bu nedenle silinmiş bir dosya veya yanlış yazılmış bir yol, fark edilmeden minioadmin:minioadmin üzerinde çalışan bir sunucu oluşturur. Tire kullanılmadığında eksik dosya, MinIO hiç çalışmadan önce birimin başarısız olmasına neden olur ve journalctl -u minio çıktısında Failed to load environment files: No such file or directory gösterilir. Başlamayı reddeden birimi fark etmek, varsayılan parolayı sessizce kabul eden bir sunucuyu fark etmekten çok daha kolaydır.

$MINIO_VOLUMES ve $MINIO_OPTS bilerek tırnaksız bırakılmıştır, çünkü systemd tırnaksız değişkenleri boşluklara göre ayrı bağımsız değişkenlere böler. Böylece MINIO_OPTS içindeki dört sözcük, minio server komutuna dört bağımsız değişken olarak aktarılır. LimitNOFILE=65536 dosya tanımlayıcı sınırını yükseltir. Bunun nedeni, her açık bağlantının ve her açık veri dosyasının bir dosya tanımlayıcısı kullanması ve varsayılan 1024 sınırının yoğun yük altında tükenmesidir.

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 çıktısında active görülmeli ve sağlık uç noktası 200 yanıtını vermelidir. journalctl -u minio -n 20 --no-pager, sunucunun dinlediği API adresini gösterir. Birim yeniden başlatılmayı sürdürürse systemd vazgeçer ve Start request repeated too quickly kaydını yazar. Bu, MinIO'nun her denemede çıktığı anlamına gelir. Nedeni, bu iletinin üstündeki satırlarda yazdırılır; bu nedenle 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 makinenin çekirdeğinden bağlama ad alanları desteği gerektirir. OpenVZ veya LXC gibi ana makine çekirdeğini paylaşan konteyner sanallaştırmalarında bu ayarlar başarısız olabilir ve birim bu durumda status=226/NAMESPACE bildirir. Bu iki satırı kaldırdığınızda birim başlar. Birimin kendisi olağan bir birimdir. Diğer yönergeler için VPS üzerinde systemd servisleri ve zamanlayıcıları bölümüne bakılabilir.

mc kurulumu ve gidiş-dönüş işleminin doğrulanması

MinIO istemcisi mc şeklindedir. apt install mc ile kurulmamalıdır. 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 olarak kaydedin, ardından bir nesneyi 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.txt

mc ls, hello.txt değerini boyutuyla birlikte listelemeli ve mc cat, hello object storage çıktısını vermelidir. Bu gidiş-dönüş işlemi, sunucunun çalıştığının gerçek kanıtıdır. Çünkü diğer tüm istemcilerin göndereceği imzalı S3 isteklerinin aynısını oluşturur. İkinci bir doğrulama için mc admin info local sunucu durumunu yazdırır.

Sistem hâlâ boşken şimdi bir kontrol daha gerçekleştirin.

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

Bu komut başarısız olmalıdır. Başarılı olursa ortam dosyası işleme ulaşmamış ve sunucunuz varsayılan kimlik bilgileriyle çalışıyor demektir. Makineye başka bir işlem erişmeden önce bu sorunu düzeltin.

mc, takma adları ~/.mc/config.json konumunda düz metin olarak saklar. Bu nedenle kimlik bilgileri, komutu çalıştıran kullanıcının giriş dizininde bulunur. mc komutunun sudo altında çalıştırılması, root kimlik bilgilerini /root/.mc/config.json konumuna yerleştirir. root takma adını tek bir yönetici hesabında tutun ve her uygulamaya kendi anahtarını verin.

Önceden imzalanmış URL ile tek bir nesneyi paylaşma

Önceden imzalanmış URL, imza ve sona erme süresi içeren sıradan bir HTTPS bağlantısıdır. Bağlantıya sahip olan herkes, hesap veya istemci kullanmadan bu tek nesneyi alabilir.

mc share download --expire 12h local/backups/hello.txt

Çıktıda sorgu dizesinde X-Amz-Signature ve X-Amz-Expires bulunur. Bu konuda iki nokta şaşırtıcı olabilir. Bağlantı, kullanılan addaki uç noktadan oluşturulur. Bu nedenle 127.0.0.1 üzerindeki bir addan oluşturulan bağlantıyı yalnızca bu makine açabilir. Göndermeyi planladığınız bağlantılar için genel ana makine adınızda ikinci bir ad oluşturun. Ayrıca iptal düğmesi yoktur. İmza, süresi dolana kadar geçerli kalır. Bu nedenle kullanabileceğiniz tek denetim kısa bir sona erme süresi belirlemektir. S3 imza biçiminin izin verdiği en uzun süre yedi gündür.

restic için ayrı bir anahtar ve bucket oluşturma

root kimlik bilgileri tüm bucket'ları okuyabilir ve silebilir. Bu nedenle bir yedekleme işi bu kimlik bilgilerini kullanmamalıdır. Bir bucket, yalnızca bu bucket ile sınırlı bir politika ve başka hiçbir yetki almayan 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 olacak yerleşik readwrite politikasını içerir. Bu politika sunucudaki tüm bucket'lara tam erişim verir. Yukarıdaki politika bucket adını bilerek iki kez belirtir: bucket listelemenin çalışması için arn:aws:s3:::restic olarak ve bucket içindeki nesneler için arn:aws:s3:::restic/* olarak. S3'te bir bucket ile içindeki nesneler ayrı kaynaklardır. Bu nedenle yalnızca birini belirten politika, istemcide sorun varmış gibi görünen bir şekilde başarısız olur.

Bu sınıra güvenmeden önce sınırı 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ı olur ve ikincisi Access Denied ile başarısız olur. Test edilmemiş bir politika yalnızca bir varsayımdır.

Şimdi restic'i bucket'ı kullanacak şekilde yapılandırın. restic, S3 kimlik bilgilerini standart AWS ortam değişkenlerinden okur. Bu nedenle restic'e özgü bir kimlik bilgileri dosyası kullanılmaz.

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 repository parolası ister. Bu parola repository'yi şifreler. Bu nedenle MinIO yalnızca şifreli verileri depolar ve parola kaybedilirse yedek de kaybedilir. Bir systemd timer tarafından başlatılan işlemin parola girmek için terminali yoktur. Bu nedenle zamanlanmış yedeklemelerde RESTIC_PASSWORD_FILE değişkenini mode 600 olan bir dosyaya ayarlayın.

Yukarıdaki komutların hepsinden daha önemli olan bir yerleşim kuralı vardır. Koruduğu verilerle aynı VPS üzerinde bulunan bir restic repository, yalnızca kötü bir rm durumundan kurtarır. Başka bir arızaya karşı koruma sağlamaz. MinIO düğümü farklı bir makinede, mümkünse farklı bir bölgede olmalıdır. VPS üzerinde restic yedeklemeleri bunun üzerine zamanlama ve saklama yapılandırmasını açıklar.

nginx ile TLS sonlandırma

MinIO localhost üzerinde çalıştığından, dışarıya açık arayüz nginx'tir. Önce sertifikayı, certbot ve nginx ile Let's Encrypt sertifikaları bölümünde açıklandığı şekilde oluşturun. Ardından bu server block'u 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ırların birkaçı kritik öneme sahiptir. client_max_body_size 0, varsayılan 1 MB gövde sınırını kaldırır. Aksi durumda daha büyük bir yükleme, MinIO isteği hiç görmeden 413 Request Entity Too Large ile reddedilir. proxy_request_buffering off, yüklemeyi doğrudan iletir. Çünkü varsayılan davranış, isteğin tamamını önce geçici bir dosyaya yazar. Bu nedenle büyük bir nesne için disk alanı iki kez gerekir. proxy_set_header Host $http_host daha az belirgin olan ayardır. Bir S3 imzası Host header'ını kapsar. Bu header'ı yeniden yazan bir proxy, her isteğin SignatureDoesNotMatch ile başarısız olmasına neden olur. Bu sırada access log, normal bir isteğin ulaştığını gösterir.

MinIO'ya genel adını da bildirin. Böylece oluşturduğu bağlantılar localhost yerine proxy'yi gösterir.

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

Güvenlik duvarı yapılandırması küçük kalır. SSH ve HTTPS'e izin verin. 9000 ve 9001 portları için hiçbir kural eklemeyin. Çünkü 127.0.0.1 adresine bağlanan bir servis, güvenlik duvarı ne derse desin başka bir makineden erişilemez. Komutlar için VPS üzerinde ufw güvenlik duvarı temelleri bölümüne bakın.

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

Burada tek düğüm, sıfır pariteli tek sürücü anlamına gelir. MinIO'nun kendi belgelerinde bu yerleşim, testler ve kullanılabilirlik gereksinimi olmayan küçük iş yükleri için uygun olarak açıklanır. Dağıtım içinde ikinci bir kopya bulunmaz. Bu nedenle her nesnenin dayanıklılığı, tek bir VPS diskinin dayanıklılığı kadardır. Dağıtık ve hata düzeltmeli bir arka uç varsayan özellikler, bunlar arasında bucket replication ve object locking de bulunur, birden çok sürücülü dağıtımlara aittir. Bu kurulumda kimseye değiştirilemez bir saklama ilkesi taahhüt edilmemelidir.

Başka bir bölgedeki ikinci VPS üzerinde restic hedefi olarak ve geliştirme çalışmalarıyla CI çıktıları için S3 uç noktası olarak uygundur. Bu senaryolarda bir bucket kaybedildiğinde yalnızca yeniden oluşturma işlemi gerekir. Küçük bir uygulamada kullanıcı yüklemeleri için de kullanılabilir. Ancak kurtarma planının sahibi olunmalı ve geri yükleme işlemi gerçekten test edilmiş olmalıdır.

Bir sözleşme veya düzenleyici kurum object lock ya da çok bölgeli dayanıklılık gerektiriyorsa managed S3 seçilmelidir. Bir diskin dolması nedeniyle 03:00'te müdahale çağrısı almak istenmiyorsa da managed S3 tercih edilmelidir. Dondurulmuş derleme de başka bir geçerli nedendir. July 2026 itibarıyla önceden derlenmiş topluluk binary dosyası September 2025 tarihli olup hiçbir düzeltme almamaktadır. Bu nedenle bu dosyayı çalıştırmak, bu durumu kabul etmek anlamına gelir. Diğer seçenek, kaynak koddan derleme yapmak ve projeyi kendiniz güncel tutmaktır.

Sık gündeme geldiği için bir sınır açıkça belirtilmelidir. Object storage bir veritabanı değildir. Her yazma işlemi nesnenin tamamını değiştirdiği için S3 bucket üzerindeki canlı bir SQL dosyası yavaş ve güvenli değildir. Veritabanı local disk üzerinde tutulmalı ve bunun yerine bucket'a yedeklenmelidir: VPS üzerinde SQLite'ı production ortamında çalıştırma bu ayrımı açıklar.

Hata durumları ve göreceğiniz iletiler

systemctl enable --now sonrasında birim hemen başarısız oluyor. journalctl -u minio -n 30 --no-pager çıktısını okuyun. Failed to load environment files: No such file or directory, birimde /etc/default/minio değerinin eksik olduğu veya yolunun yanlış yazıldığı anlamına gelir. permission denied ile biten bir ileti, veri dizininin hizmet hesabı tarafından yazılabilir olmadığını gösterir. Bu nedenle stat -c '%U' /var/lib/minio/data çıktısının minio-user olduğunu doğrulayın.

minioadmin:minioadmin hâlâ oturum açıyor. Ortam dosyası sürece ulaşmamış. Birimin EnvironmentFile=/etc/default/minio içerdiğini doğrulayın, sudo systemctl daemon-reload komutunu çalıştırın ve hizmeti yeniden başlatın. MinIO, root kimlik bilgilerini başlangıçta bir kez okur. Bu nedenle dosyanın yeniden başlatma olmadan düzenlenmesi hiçbir şeyi değiştirmez.

Başlangıçta Address already in use. Başka bir işlem 9000 portunu kullanıyor. MinIO portunu değiştirmeden önce işlemi sudo ss -ltnp | grep :9000 ile bulun.

Proxy üzerinden yapılan 1 MB üzerindeki yüklemeler başarısız oluyor. nginx 413 Request Entity Too Large yanıtını verdi ve MinIO isteği hiç almadı. Sunucu bloğunda client_max_body_size 0 değerini ayarlayın.

SignatureDoesNotMatch. Gizli anahtar yanlış olabilir veya istemci ile MinIO arasındaki bir bileşen, imzanın kapsadığı Host başlığını yeniden yazmış olabilir.

RequestTimeTooSkewed. İstemcinin veya sunucunun saati yanlış. Her S3 isteği bir zaman damgası içerir ve 15 dakikalık pencerenin dışında reddedilir. timedatectl komutunu çalıştırın ve zaman eşitlemesinin etkin olduğunu doğrulayın.

Mevcut olduğunu bildiğiniz bir bucket üzerinde Access Denied. Anahtar farklı bir bucket ile sınırlandırılmış. İlkenin gerçekte neye izin verdiğini mc admin policy info local restic-rw ile görüntüleyin ve kaynak satırlarındaki bucket adını karşılaştırın.

FAQ

Tek düğümlü MinIO gerçek yedeklemeler için yeterli midir?

Verilerin korunduğu makineden ayrı bir makinede çalışan bir restic hedefi olarak yeterlidir. Ancak tek kopya olarak yeterli değildir. Tek diskli bir dağıtımda hiç parity bulunmaz. Bu nedenle MinIO içinde ikinci bir kopya yoktur. VPS diski veri kaybederse nesneler de kaybolur. Başka bir yerde ikinci bir hedef bulundurun. Sürecin çalıştığından emin olmak için en az bir kez her iki hedeften de geri yükleme yapın.

MinIO'nun sağlama toplamı dosyasında sha256sum -c neden başarısız oluyor?

Bunun nedeni, dosyadaki hash değerinden sonra bulunan etiketin sürümün adını, minio.RELEASE.2025-09-07T16-13-09Z, belirtmesidir. İndirdiğiniz dosyanın adı ise genellikle minio olur. sha256sum -c, sağlama toplamı dosyasında yazılı olan ada sahip bir dosya arar. Dosyayı bulamaz ve No such file or directory ile WARNING: 1 listed file could not be read bildirimlerini verir. İndirme işlemi doğrudur. Hash dizelerini doğrudan karşılaştırın ve güvenlik açısından anlam taşımayan etiketi yok sayın.

MinIO yönetim web konsolu nereye gitti?

MinIO, Mayıs 2025'te topluluk sürümündeki konsoldan yönetim özelliklerini kaldırdı. Web arayüzünde yalnızca bir nesne tarayıcısı kaldı. Bucket'lar ve kullanıcılar artık mc istemcisiyle, mc admin user add ve mc admin policy attach gibi komutlar kullanılarak yönetilir. Topluluk sürümünde desteklenen yöntem budur; bir geçici çözüm değildir. Bu nedenle bu kılavuzdaki tüm işlemler komut satırından yapılır.

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 access key'i ve buna ait secret ile ayarlayın. Ardından s3:https://s3.example.com/restic biçiminde bir repository dizesi kullanın. Buradaki son path öğesi bucket adıdır. Bucket'ı önce mc mb ile oluşturun. Çünkü yalnızca bir bucket için yetkilendirilmiş bir key'in bucket oluşturma izni yoktur. restic, yükleme işleminden önce tüm verileri kendi repository password'üyle şifreler. Bu nedenle MinIO şifreli verileri depolar ve dosyalarınızı hiçbir zaman görmez.

MinIO'yu nginx arkasında çalıştırmak zorunda mıyım?

İstemci aynı makinede değilse TLS (transport layer security) kullanılması gerekir. Bunun nedeni, S3 kimlik bilgilerinin ve nesne verilerinin isteğin içinde taşınmasıdır. Port 443 üzerinde sertifikası certbot tarafından alınmış bir proxy kullanmak bunu sağlamanın en basit yoludur. Ayrıca sertifika yenileme işlemini MinIO'dan ayrı 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 service account'un yenilenen private key'i okuma iznine sahip olması gerekir. Aynı sonuç için ek işlem gerektiren bu yöntemde bu izinlerin yönetilmesi gerekir.

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