Linux’ta cron ile Minecraft sunucusunu otomatik yedekleme, tar ile dünya klasörlerini arşivleyen bir bash betiği yazıp bu betiği crontab üzerinden belirli aralıklarla çalıştırmaktan ibarettir. Kurulum yarım saat sürer, ama karşılığında bir grief olayında, bozuk chunk’ta veya yanlış çalıştırılmış bir eklenti komutunda kaybedeceğiniz şey birkaç saatlik oyun olur — aylarca emek değil.
Destek taleplerinde en sık gördüğümüz senaryo şu: sunucu bir yıldır sorunsuz çalışıyor, kimse yedek almayı düşünmemiş, sonra bir gün disk hatası veya yetkisiz bir /fill komutu geliyor ve geri dönülecek hiçbir nokta kalmıyor. Minecraft dünyasında geri alma tuşu yok. Sadece yedek var.
Bu rehber Ubuntu 24.04 LTS üzerinde, /opt/minecraft/server dizininde çalışan bir Paper 26.2 sunucusunu örnek alıyor. Aynı adımlar Debian 12, AlmaLinux ve Rocky Linux üzerinde de birebir geçerli; yalnızca paket kurulum komutu apt yerine dnf olur. Sunucunuz henüz kurulu değilse önce Linux üzerinde Minecraft sunucu kurulumu sayfasını tamamlayın.
Neyi Yedekliyoruz? Dünya Klasörleri ve Yapılandırma#
Sunucu dizininin tamamını yedeklemek ilk bakışta güvenli görünür ama pratikte kötü bir fikirdir. Jar dosyaları, kütüphane önbelleği ve log arşivleri arşivi gereksiz yere şişirir; saatlik yedekte bu fark disk alanını hızla yer. Yedeklenmesi gereken şey verinizdir, yeniden indirilebilecek dosyalar değil.
| Dosya / klasör | Yedeklensin mi? | Neden |
|---|---|---|
world/ | Evet | Ana dünya, oyuncu verisi, bölge dosyaları |
world_nether/, world_the_end/ | Evet | Nether ve End boyutları ayrı klasörlerdedir |
server.properties | Evet | Port, view-distance, whitelist ayarları |
plugins/*/config.yml ve veritabanları | Evet | LuckPerms grupları, ekonomi bakiyeleri, arsa kayıtları |
bukkit.yml, spigot.yml, config/ | Evet | Paper yapılandırması, elle ayarlanmış değerler |
ops.json, whitelist.json, banned-players.json | Evet | Yetki ve ceza listeleri, yeniden yazılması zor |
paper.jar ve libraries/ | Hayır | Resmî kaynaktan tekrar indirilebilir |
logs/, cache/ | Hayır | Arşivi şişirir, kurtarma değeri düşüktür |
Dünya klasörlerinizin adı farklı olabilir. Multiverse kullanıyorsanız skyblock, etkinlik gibi ek dünya dizinleriniz de vardır; betiğe onları da eklemeniz gerekir. Sunucu dizininde tam olarak ne olduğunu görmek için betiği yazmadan önce ls -la /opt/minecraft/server çalıştırıp klasör adlarını gözünüzle doğrulayın.
mysqldump ile ayrı yedeği alınmalıdır. CoreProtect gibi kendi dosya tabanlı veritabanını sunucu klasöründe tutan eklentilerde ise plugins/ yedeği yeterlidir.save-off, save-all, save-on: Tutarlı Yedeğin Şartı#
Minecraft sunucusu chunk verisini bellekte tutar ve periyodik olarak diske yazar. Yani world/region/ altındaki .mca dosyaları her an güncel değildir; üstelik yazma işleminin tam ortasında da olabilirler. tar tam o anda dosyayı okumaya kalkarsa yarım yazılmış bir bölge dosyasını arşive koyar. Yedek dosyası oluşur, boyutu da normal görünür, geri yüklediğinizde o bölge çöker.
Çözüm üç komuttan ibaret:
- save-off
- Sunucunun otomatik kaydını kapatır. Bu andan sonra dünya diske yazılmaz, değişiklikler bellekte birikir.
- save-all
- Bellekteki tüm chunk’ları tek seferde diske yazar. Bittiğinde disk üzerindeki dünya tutarlı bir kopyadır.
- save-on
- Otomatik kaydı geri açar. Arşiv bittikten sonra mutlaka çalıştırılmalıdır.
save-off gönderip save-on göndermeyi unutan bir betik, sunucu bir daha yeniden başlayana kadar hiçbir şeyi diske yazmaz. O arada makine elektrik kesintisiyle giderse aradaki tüm oyun kaybolur. Betiğinizde save-on satırının hata durumunda bile çalıştığından emin olun — aşağıdaki örnekte bunun için trap kullanıyoruz.Bu komutları betikten göndermenin en temiz yolu RCON’dur. Kurulumu birkaç dakika sürer ve mcrcon kurulumu ve uzaktan komut gönderme sayfasında adım adım anlatılıyor. Sunucuyu tmux içinde çalıştırıyorsanız alternatif olarak tmux send-keys -t mc "save-all" Enter satırını da kullanabilirsiniz; ayrıntısı screen ve tmux kullanımı sayfasında.
Yedekleme Betiğini Yazma#
Önce dizinleri hazırlayın. Betikleri sunucu dosyalarından ayrı bir klasörde tutmak, ileride sunucu dizinini toptan taşımanız gerektiğinde işinizi kolaylaştırır.
sudo mkdir -p /opt/minecraft/scripts /opt/minecraft/backups
sudo chown -R minecraft:minecraft /opt/minecraft/scripts /opt/minecraft/backups
sudo -u minecraft nano /opt/minecraft/scripts/yedek.sh
Aşağıdaki betik dünyayı arşivler, tarih damgalı bir dosya adı üretir, log yazar ve eski yedekleri temizler. Kendi dizin ve dünya adlarınıza göre üstteki değişkenleri düzenleyin — gerisi olduğu gibi kalabilir.
#!/bin/bash
# /opt/minecraft/scripts/yedek.sh
# Minecraft dunya yedegi — Batihost Wiki
set -uo pipefail
SUNUCU_DIZIN="/opt/minecraft/server"
YEDEK_DIZIN="/opt/minecraft/backups"
LOG="/opt/minecraft/backups/yedek.log"
SAKLAMA_GUN=7
DUNYALAR="world world_nether world_the_end"
AYARLAR="server.properties bukkit.yml spigot.yml ops.json whitelist.json banned-players.json"
TARIH=$(date +%Y-%m-%d_%H%M)
DOSYA="$YEDEK_DIZIN/dunya-$TARIH.tar.gz"
# mcrcon icin baglanti bilgileri
export MCRCON_HOST=127.0.0.1
export MCRCON_PORT=25575
export MCRCON_PASS='buraya-uzun-rastgele-parola'
log() { echo "[$(date +'%F %T')] $*" >> "$LOG"; }
kaydi_ac() {
command -v mcrcon >/dev/null 2>&1 && mcrcon save-on >/dev/null 2>&1
}
# Betik hata alsa veya yarida kesilse bile save-on calissin
trap kaydi_ac EXIT
mkdir -p "$YEDEK_DIZIN"
log "Yedekleme basladi -> $DOSYA"
# 1) Dunyayi diske yazdir, otomatik kaydi kapat
if command -v mcrcon >/dev/null 2>&1; then
mcrcon -w 2 "say Yedek aliniyor, birkac saniye surebilir" save-off save-all
sleep 5
log "save-off + save-all gonderildi"
else
log "UYARI: mcrcon bulunamadi, yedek canli veriyle aliniyor"
fi
# 2) Arsivi olustur (dusuk oncelikle, sunucuyu bogmasin)
nice -n 19 ionice -c3 tar -czf "$DOSYA" \
-C "$SUNUCU_DIZIN" $DUNYALAR $AYARLAR config plugins
SONUC=$?
# 3) Otomatik kaydi geri ac
kaydi_ac
trap - EXIT
if [ "$SONUC" -eq 0 ]; then
BOYUT=$(du -h "$DOSYA" | cut -f1)
log "Yedek tamamlandi: $DOSYA ($BOYUT)"
command -v mcrcon >/dev/null 2>&1 && mcrcon "say Yedek tamamlandi" >/dev/null 2>&1
else
log "HATA: tar $SONUC kodu ile cikti, arsiv eksik olabilir"
rm -f "$DOSYA"
fi
# 4) Eski yedekleri temizle
find "$YEDEK_DIZIN" -maxdepth 1 -name 'dunya-*.tar.gz' -type f -mtime +$SAKLAMA_GUN -delete
log "$SAKLAMA_GUN gunden eski yedekler silindi"
Betikte dikkat edilecek iki nokta var. Birincisi tar -C parametresi: arşivin içinde /opt/minecraft/server/world gibi tam yol yerine sadece world görünsün diye kullanılıyor. Bu, geri yüklerken hayat kurtarır. İkincisi trap kaydi_ac EXIT satırı; betik hangi noktada ölürse ölsün save-on komutunun gitmesini garantiler.
Betiği Çalıştırılabilir Yapma ve Elle Deneme#
Bash betikleri varsayılan olarak çalıştırma izniyle oluşmaz. cron’a eklemeden önce izni verin ve betiği bir kez elle çalıştırıp çıktısını gözünüzle görün.
sudo chmod +x /opt/minecraft/scripts/yedek.sh
sudo chown minecraft:minecraft /opt/minecraft/scripts/yedek.sh
# Elle calistir ve ciktiyi izle
sudo -u minecraft /opt/minecraft/scripts/yedek.sh
# Log dosyasina bak
tail -n 20 /opt/minecraft/backups/yedek.log
# Arsivin icerigini kontrol et
tar -tzf /opt/minecraft/backups/dunya-*.tar.gz | head -n 20
Buraya kadar herşey yolundaysa arşivin içinde world/, world_nether/, server.properties satırlarını görüyor olmalısınız. Sunucu konsolunda da “say” mesajlarınız görünmüşse RCON tarafı da çalışıyor demektir.
root olarak çalıştırırsanız oluşan arşiv dosyalarının sahibi root olur ve minecraft kullanıcısı sonraki yedeklerde bunları silemez. Baştan sona minecraft kullanıcısıyla çalışın; cron görevini de o kullanıcının crontab’ına ekleyin.crontab ile Zamanlama#
Betik hazır, sıra onu düzenli çalıştırmakta. cron dosyasını doğru kullanıcı için açın:
sudo -u minecraft crontab -e
Açılan dosyanın sonuna şu satırları ekleyin:
# Her saat basi dunya yedegi
0 * * * * /opt/minecraft/scripts/yedek.sh
# Her gece 04:30'da uzak sunucuya kopyala
30 4 * * * /opt/minecraft/scripts/uzak-kopya.sh
# Her pazar 05:00'te haftalik arsiv (silinmeyen kopya)
0 5 * * 0 /opt/minecraft/scripts/haftalik-yedek.sh
cron’un beş alanını karıştırmak çok yaygın. Sıralama soldan sağa dakika, saat, ayın günü, ay, haftanın günü şeklindedir:
| cron ifadesi | Ne zaman çalışır | Kullanım |
|---|---|---|
*/30 * * * * | Her 30 dakikada bir | Çok aktif sunucular |
0 * * * * | Her saatin 00. dakikasında | Önerilen dünya yedeği |
0 */6 * * * | Altı saatte bir | Küçük topluluk sunucuları |
30 4 * * * | Her gün 04:30 | Tam yedek ve uzak kopya |
0 5 * * 0 | Her pazar 05:00 | Haftalık kalıcı arşiv |
Görevlerin gerçekten kayıtlı olduğunu sudo -u minecraft crontab -l ile doğrulayın. cron sözdiziminin tamamını ve özel ifadeleri (@daily, @reboot) görmek isterseniz Linux’ta cron job ile zamanlanmış görev oluşturma sayfası ayrıntılı bir referans.
Yedek saatini restart saatiyle çakıştırmayın#
Sunucunuzda gecelik otomatik yeniden başlatma varsa iki işi aynı dakikaya koymayın. Yedek sırasında sunucunun kapanması arşivi yarıda bırakır. Aralarında en az 15 dakika olsun. Yeniden başlatma zamanlamasını otomatik yeniden başlatma kurulumu sayfasına göre ayarlıyorsanız yedek saatini ona göre kaydırın.
Eski Yedekleri find ile Temizleme#
Saat başı yedek alan bir sunucu günde 24 arşiv üretir. Temizlik olmazsa disk birkaç haftada dolar ve sunucu çalışamaz hâle gelir. find komutu bu işi tek satırda halleder.
# Once GORELIM: 7 gunden eski hangi dosyalar secilecek?
find /opt/minecraft/backups -maxdepth 1 -name 'dunya-*.tar.gz' -type f -mtime +7 -print
# Emin olduktan sonra sil
find /opt/minecraft/backups -maxdepth 1 -name 'dunya-*.tar.gz' -type f -mtime +7 -delete
# Saatlik yedeklerde gun degil saat bazli temizlik (48 saatten eski)
find /opt/minecraft/backups -maxdepth 1 -name 'dunya-*.tar.gz' -type f -mmin +2880 -delete
# Yedek dizininin toplam boyutunu gor
du -sh /opt/minecraft/backups
-mtime +7 ifadesi “değiştirilme zamanı 7 tam günden eski” demektir; +7 yazdığınızda 8. günden itibaren silinir. Saatlik yedekleriniz varsa gün yerine dakika bazlı çalışan -mmin daha isabetli olur. -maxdepth 1 parametresini eklemeyi ihmal etmeyin; alt dizinlerinizde tuttuğunuz haftalık arşivlere dokunmasın.
Yedeği Uzak Sunucuya Taşıma: rsync ve scp#
Aynı makinede duran yedek, makine ölünce yedek olmaktan çıkar. Disk arızası, dosya sistemi bozulması veya yanlış bir rm -rf hem dünyayı hem arşivi aynı anda götürür. En az bir kopya başka bir fiziksel makinede durmalı.
Önce parolasız aktarım için SSH anahtarı kurun. Adımları SSH anahtarı oluşturma ve sunucuya ekleme sayfasında bulabilirsiniz.
# minecraft kullanicisi icin anahtar uret ve hedefe gonder
sudo -u minecraft ssh-keygen -t ed25519 -f /opt/minecraft/.ssh/id_ed25519 -N ""
sudo -u minecraft ssh-copy-id -i /opt/minecraft/.ssh/id_ed25519.pub yedek@203.0.113.20
Ardından uzak kopya betiğini yazın:
#!/bin/bash
# /opt/minecraft/scripts/uzak-kopya.sh
set -uo pipefail
YEDEK_DIZIN="/opt/minecraft/backups"
LOG="$YEDEK_DIZIN/yedek.log"
ANAHTAR="/opt/minecraft/.ssh/id_ed25519"
HEDEF="yedek@203.0.113.20:/srv/minecraft-yedek/"
echo "[$(date +'%F %T')] Uzak kopya basliyor" >> "$LOG"
rsync -az --partial --bwlimit=20000 \
-e "ssh -i $ANAHTAR -o StrictHostKeyChecking=accept-new" \
--include='dunya-*.tar.gz' --exclude='*' \
"$YEDEK_DIZIN/" "$HEDEF" >> "$LOG" 2>&1
echo "[$(date +'%F %T')] Uzak kopya bitti (cikis kodu $?)" >> "$LOG"
# Tek dosya gonderecekseniz scp de yeterlidir:
# SON=$(ls -1t "$YEDEK_DIZIN"/dunya-*.tar.gz | head -n1)
# scp -i "$ANAHTAR" "$SON" "$HEDEF"
--bwlimit=20000 parametresi aktarımı saniyede yaklaşık 20 MB ile sınırlar; gece bile olsa hattı tamamen doldurup oyuncuların pingini bozmasın diye. --partial ise kopan aktarımın baştan başlamamasını sağlar, büyük dünyalarda bu ciddi zaman kazandırır. rsync yerine scp kullanacaksanız tek dosya göndermek zorunda olduğunuzu unutmayın; scp devam ettirme yeteneğine sahip değildir.
Log Tutma, İzleme ve Geri Yükleme Provası#
Betik sessizce çalışmamalı. Ne zaman çalıştığını, ne kadar sürdüğünü ve arşivin kaç MB olduğunu bir yere yazmalı. Yukarıdaki betikte bu iş log() fonksiyonuyla yapılıyor. cron çıktısını da ayrıca yakalamak isterseniz crontab satırını şöyle yazın:
0 * * * * /opt/minecraft/scripts/yedek.sh >> /opt/minecraft/backups/cron.log 2>&1
Yedeklerin gerçekten oluştuğunu haftada bir gözle kontrol edin. İki komut yeterli:
# Son 10 yedek, boyutlariyla birlikte
ls -lht /opt/minecraft/backups/dunya-*.tar.gz | head -n 10
# Arsivin okunabilir olup olmadigini sina (cikti yoksa saglam)
tar -tzf /opt/minecraft/backups/dunya-2026-08-25_0400.tar.gz > /dev/null && echo "Arsiv saglam"
# Yedek dizininin disk kullanimi
df -h /opt
Yedek boyutunun bir günden diğerine aniden düşmesi kötü işarettir; genelde bir dünya klasörünün adı değişmiştir ve tar onu sessizce atlamıştır. Sunucunun genel kaynak kullanımını izlemek için htop, top ve iotop ile kaynak izleme sayfasındaki yöntemleri kullanabilirsiniz; yedek saatinde disk I/O’sunun nasıl tavan yaptığını orada canlı görürsünüz.
Denenmemiş yedek, yedek değildir. Ayda bir kez geri yükleme provası yapın.
Prova basit: yedeği boş bir dizine açın, o dizinde test amaçlı bir sunucu başlatın ve dünyanın açıldığını görün. Gerçek bir kurtarma anında hangi komutları yazacağınızı yedekten dünya geri yükleme sayfasında adım adım bulabilirsiniz. Dünyanız zaten bozulduysa ve elinizde yedek yoksa bozuk dünya kurtarma rehberi son çareyi anlatıyor.
Donanım Tarafı: Yedek Alırken TPS Neden Düşer?#
Yedekleme bir CPU işi değil, disk işidir. tar -czf komutu gzip sıkıştırması yaptığı için tek çekirdeği doldurur, ama asıl darboğaz onlarca gigabaytlık bölge dosyasının okunmasıdır. Aynı anda Minecraft da chunk yazmaya çalışıyorsa iki iş disk kuyruğunda çakışır ve tick süresi uzar.
Bu yüzden NVMe SSD burada tercih değil zorunluluktur. SATA SSD’de bile yedek anında görünür bir takılma yaşanır, HDD’de ise sunucu resmen durur. Disk alanı olarak dünyanın kendisi için en az 50 GB, yedekler için ayrıca bir o kadar alan planlayın; modlu veya büyük haritalı sunucularda 100 GB ve üzeri gerekir.
İşlemci tarafında Minecraft’ın ana tick döngüsü hala tek çekirdekte çalıştığı için yüksek saat hızlı AMD Ryzen 9 sınıfı işlemciler doğru tercihtir; sıkıştırma işi de o hızdan faydalanır. RAM alt sınırınız 8 GB olsun, 10-30 oyunculu eklentili bir Paper sunucusunda 12 GB rahat eder. Kendi altyapınızı kurmak yerine hazır bir makine istiyorsanız yüksek frekanslı Ryzen VDS paketleri root erişimiyle gelir ve bu sayfadaki tüm adımları uygulayabilirsiniz. Yedekleme mimarisini kurumsal ölçekte planlıyorsanız sunucu yedekleme stratejileri ve 3-2-1 kuralı sayfası çerçeveyi veriyor.
Özetle#
Linux’ta Minecraft yedeklemesinin özeti şu: /opt/minecraft/scripts/yedek.sh altında bir bash betiği yazın, içinde save-off → save-all → tar → save-on sırasını izleyin, chmod +x ile çalıştırılabilir yapın ve sudo -u minecraft crontab -e ile saat başı çalıştırın. Eski arşivleri find -mtime +7 -delete temizlesin.
Üç şeyi atlamayın: trap ile save-on garantisi, rsync ile uzak makineye kopya ve ayda bir geri yükleme provası. Kurulumda takılırsanız destek talebi açabilirsiniz; komut göndermek için gereken RCON istemcisini kurmadıysanız bir sonraki durağınız mcrcon kurulumu sayfası olsun.