systemd servisi ile Minecraft sunucusunu otomatik başlatmak, Linux üzerinde çalışan bir sunucuyu 7/24 ayakta tutmanın en sağlam yoludur. /etc/systemd/system/minecraft.service adında bir unit dosyası yazar, systemctl enable --now minecraft komutuyla devreye alırsınız; bundan sonra makine yeniden başlasa da, SSH oturumunuz kopsa da, sunucu çökse de Minecraft kendiliğinden ayağa kalkar.
screen veya tmux ile başlatılan bir sunucu yalnızca o oturum yaşadığı sürece çalışır. Sunucu makinesi çekirdek güncellemesi için yeniden başlatıldığında oyuncular kapıda kalır ve birinin SSH ile girip sunucuyu elle açması gerekir. systemd bu işi devralır: süreci izler, çıkış kodunu okur, gerekirse belirlediğiniz gecikmeyle yeniden başlatır ve tüm konsol çıktısını journald’a kaydeder.
Bu rehberde Ubuntu 24.04 LTS üzerinde çalışan bir Paper sunucusu örnek alınmıştır; aynı adımlar Debian 12, AlmaLinux ve Rocky Linux üzerinde de birebir geçerlidir. Vanilla, Purpur, Forge veya Fabric kullanıyorsanız yalnızca ExecStart satırındaki jar adı ve bayraklar değişir.
systemd Servisi Ne Kazandırır?#
Unit dosyası yazmak beş dakikalık bir iş ama getirisi büyük. En somut faydalar şunlar:
| Senaryo | screen / tmux | systemd servisi |
|---|---|---|
| Makine yeniden başladı | Sunucu kapalı kalır | Otomatik açılır |
| Java süreci çöktü | Elle müdahale şart | 15 saniyede yeniden başlar |
| SSH oturumu koptu | Etkilenmez | Etkilenmez |
| Log kaydı | Ekran tamponu, uçucu | journald, kalıcı ve filtrelenebilir |
| Canlı konsola yazmak | Doğrudan | Socket veya tmux gerekir |
| Kaynak sınırlama (CPU/RAM) | Yok | cgroup ile mümkün |
Ön Hazırlık: Kullanıcı, Dizin ve Java#
Servisi yazmadan önce sunucunun root olmayan bir kullanıcı altında, sabit bir dizinde çalışıyor olması gerekir. Minecraft’ı root olarak çalıştırmayın; bir eklenti açığı doğrudan makinenin tamamını ele geçirmeye dönüşür.
-
Ayrı bir sistem kullanıcısı açın#
Kabuk girişi olmayan, yalnızca sunucuyu çalıştıracak bir hesap yeterlidir.
sudo adduser --system --group --home /opt/minecraft --shell /usr/sbin/nologin minecraft sudo mkdir -p /opt/minecraft/server sudo chown -R minecraft:minecraft /opt/minecraft -
Java 25’i kurun ve yolunu öğrenin#
Minecraft 26.1 ve sonrası Java 25 ister. Kurulum ayrıntıları için Linux’a Java 25 kurulumu sayfasına bakın.
java -version which java # çıktı genelde: /usr/bin/java -
Sunucu jar’ını yerleştirip bir kez elle çalıştırın#
Servis yazmadan önce sunucunun elle açıldığından,
eula.txtdosyasının onaylandığından ve dünyanın oluştuğundan emin olun. Paper kurulumunun tamamı Ubuntu’da Paper sunucusu kurulumu sayfasında.
Bağlantılar resmî kaynaklara gider. Üçüncü taraf sitelerden jar indirmeyin.
minecraft.service Unit Dosyasını Yazma#
Unit dosyasını /etc/systemd/system/ altına açın. /lib/systemd/system/ dizinine dokunmayın; orası paket yöneticisinin alanıdır ve güncellemede üzerine yazılır.
sudo nano /etc/systemd/system/minecraft.service
Aşağıdaki içerik 12 GB’lık bir pakette çalışan Paper sunucusu içindir. Bayraklar Aikar’s Flags setidir ve 26.x sunucularında hâlâ geçerlidir.
[Unit]
Description=Minecraft Paper Sunucusu
Documentation=https://docs.papermc.io
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=minecraft
Group=minecraft
WorkingDirectory=/opt/minecraft/server
ExecStart=/usr/bin/java -Xms10G -Xmx10G \
--add-modules=jdk.incubator.vector \
-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 \
-XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch \
-XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M \
-XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 \
-XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 \
-XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 \
-XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 \
-Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true \
-jar paper.jar --nogui
Restart=on-failure
RestartSec=15s
TimeoutStopSec=120
KillSignal=SIGTERM
SendSIGKILL=yes
StandardOutput=journal
StandardError=journal
SyslogIdentifier=minecraft
[Install]
WantedBy=multi-user.target
paper-26.2-112.jar gibi build numarası taşır; ya bu adı yazın ya da ln -s paper-26.2-112.jar paper.jar ile sabit bir sembolik bağ oluşturun. Aksi halde “Unable to access jarfile” hatası alırsınız.Heap boyutunu paketinize göre ayarlayın#
Xms ve Xmx daima eşit verilir; JVM’in heap büyütüp küçültmesi tick içinde duraklama üretir. İşletim sistemine ve JVM’in heap dışı kullanımına 2 GB pay bırakın.
| Sunucu paketi | Heap ayarı | Uygun senaryo |
|---|---|---|
| 8 GB | -Xms6G -Xmx6G | 2-10 oyuncu, vanilla veya hafif eklentili |
| 12 GB | -Xms10G -Xmx10G | 10-30 oyuncu, eklentili Paper |
| 16 GB | -Xms14G -Xmx14G | 30-60 oyuncu, minigame veya modpack |
| 32 GB | -Xms28G -Xmx28G | 60+ oyuncu, proxy’li sunucu ağı |
16 GB üzeri heap kullanıyorsanız G1 yerine ZGC’yi değerlendirebilirsiniz; o durumda Aikar bayraklarını tamamen çıkarıp yalnızca -XX:+UseZGC yazarsınız. Java 25’te -XX:+ZGenerational bayrağı geçersizdir, eklemeyin. Bayrak seçiminin ayrıntısı RAM ayarları ve JVM flag’leri sayfasında.
Unit Dosyasındaki Satırlar Ne Yapıyor?#
Kopyalayıp geçmeden önce her direktifin ne işe yaradığını bilmek, ileride hata ayıklarken zaman kazandırır.
- After / Wants=network-online.target
- Ağ tamamen hazır olmadan Java başlamasın. Bu olmadan sunucu, IP henüz atanmadığı için porta bağlanamayabilir.
- Type=simple
- ExecStart’taki süreç ana süreçtir, arka plana düşmez. Minecraft jar’ı için doğru tip budur.
- User / Group=minecraft
- Süreci ayrıcalıksız hesapla çalıştırır. Dosya sahipliği de bu hesapta olmalıdır.
- WorkingDirectory
- Sunucu
world,plugins,logsklasörlerini bu dizinde arar. Yanlışsa sunucu yeni ve boş bir dünya oluşturur. - Restart=on-failure
- Sıfır dışı çıkış kodunda yeniden başlatır. Konsoldan
stopyazıldığında (çıkış kodu 0) yeniden başlatmaz. - RestartSec=15s
- Yeniden başlatmadan önce bekleme süresi. Çok kısa vermeyin; bozuk yapılandırmada saniyede onlarca kez döngüye girer.
- TimeoutStopSec=120
- Kapanış için tanınan süre. Büyük dünyalarda kayıt işlemi uzun sürer, varsayılan 90 saniye yetmeyebilir.
- SyslogIdentifier
- journald kayıtlarında satır başına yazılacak etiket. Filtrelemeyi kolaylaştırır.
Restart politikaları arasındaki fark#
| Değer | Davranış | Minecraft için |
|---|---|---|
no | Hiç yeniden başlatmaz | Test kurulumları |
on-failure | Sıfır dışı çıkış ve sinyalle ölümde başlatır | Önerilen |
on-abnormal | Yalnızca sinyal, zaman aşımı ve watchdog durumunda | OOM Killer senaryoları |
always | Her koşulda, stop komutundan sonra bile | Konsoldan durduramazsınız |
Restart=always kullanacaksanız StartLimitIntervalSec=300 ve StartLimitBurst=5 satırlarını [Unit] bölümüne ekleyin. Böylece 5 dakika içinde 5 başarısız denemeden sonra systemd durur ve bozuk bir kurulumu sonsuz döngüde çalıştırmaz.Servisi Etkinleştirme ve Günlük Kullanım#
Dosyayı kaydettikten sonra systemd’ye yeni unit’i okuması söylenmelidir. Her düzenlemeden sonra daemon-reload zorunludur.
sudo systemctl daemon-reload
sudo systemctl enable --now minecraft
systemctl status minecraft
enable --now hem açılışta otomatik başlatmayı etkinleştirir hem de servisi hemen çalıştırır. Günlük kullanımda ihtiyacınız olan komutlar:
# Durdur / başlat / yeniden başlat
sudo systemctl stop minecraft
sudo systemctl start minecraft
sudo systemctl restart minecraft
# Açılışta otomatik başlatmayı kapat
sudo systemctl disable minecraft
# Canlı log akışı
journalctl -u minecraft -f
# Son 200 satır, sayfalama olmadan
journalctl -u minecraft -n 200 --no-pager
# Bugünkü hatalar
journalctl -u minecraft --since today -p err
Bu komutları sık kullanacaksınız; systemd ve journalctl sözdizimini tazelemek isterseniz Linux temel komutları sayfası elinizin altında dursun.
Sunucu Konsoluna Komut Gönderme#
systemd servisi olarak çalışan bir sunucunun en çok şikâyet edilen yanı, konsola doğrudan yazamamanızdır. Üç çözüm var; ikisini burada, üçüncüsünü aşağıda anlatıyoruz.
Yöntem 1: Socket unit ile adlandırılmış boru#
systemd, servise standart girdi olarak bir FIFO bağlayabilir. Önce socket unit’ini oluşturun:
sudo nano /etc/systemd/system/minecraft.socket
[Unit]
BindsTo=minecraft.service
[Socket]
ListenFIFO=/run/minecraft/stdin
Service=minecraft.service
SocketMode=0660
SocketUser=minecraft
SocketGroup=minecraft
RemoveOnStop=true
Ardından minecraft.service dosyasının [Service] bölümüne şu üç satırı ekleyin ve varsa StandardInput ile çakışan bir satırı kaldırın:
Sockets=minecraft.socket
StandardInput=socket
ExecStop=/bin/sh -c 'echo stop > /run/minecraft/stdin'
sudo systemctl daemon-reload
sudo systemctl restart minecraft
# Artık konsola komut gönderebilirsiniz
echo "say Sunucu 5 dakika sonra yeniden başlayacak" | sudo tee /run/minecraft/stdin
echo "save-all" | sudo tee /run/minecraft/stdin
Bu yöntemin avantajı hiçbir ek yazılım gerektirmemesidir. Dezavantajı çıktının boruya değil journald’a gitmesi; yani komutu yazıp cevabı journalctl -u minecraft -f penceresinden okursunuz.
Yöntem 2: tmux hibrit servisi#
Canlı, çift yönlü bir konsol istiyorsanız servisi tmux oturumu içinde başlatın. Bu, çoğu sunucu yöneticisinin tercih ettiği kurulumdur.
[Service]
Type=forking
User=minecraft
Group=minecraft
WorkingDirectory=/opt/minecraft/server
ExecStart=/usr/bin/tmux new-session -d -s mc '/usr/bin/java -Xms10G -Xmx10G -XX:+UseG1GC -jar paper.jar --nogui'
ExecStop=/usr/bin/tmux send-keys -t mc "stop" Enter
ExecStop=/bin/sh -c 'while pgrep -u minecraft -f paper.jar > /dev/null; do sleep 2; done'
TimeoutStopSec=120
RemainAfterExit=no
# Canlı konsola bağlan
sudo -u minecraft tmux attach -t mc
# Çıkmak için (sunucuyu kapatmadan): Ctrl+B ardından D
Ctrl+C tuşlamayın; bu Java sürecini öldürür ve dünya kaydedilmeden kapanır. Doğru çıkış Ctrl+B sonra D tuş dizisidir. tmux kullanımının ayrıntısı için screen ve tmux ile arka planda çalıştırma sayfasına bakın.Yöntem 3: RCON#
server.properties içinde enable-rcon=true, rcon.port=25575 ve güçlü bir rcon.password tanımlayıp uzaktan komut gönderebilirsiniz. RCON portunu güvenlik duvarında dışarıya kesinlikle açmayın; yalnızca 127.0.0.1 üzerinden kullanın. Konsol komutlarının listesi sunucu konsol komutları sayfasında.
Güvenli Kapatma ve Veri Bütünlüğü#
Minecraft sunucusu SIGTERM sinyalini yakalayan bir kapanış kancası çalıştırır: oyuncuları düşürür, chunk’ları kaydeder ve eklentileri düzgün biçimde devre dışı bırakır. Yani systemctl stop dediğinizde veri kaybı yaşanmaz — bir şartla: systemd’nin sabrı yetmelidir.
Varsayılan TimeoutStopSec 90 saniyedir. 20 GB’lık bir dünyada, NVMe diskte bile kayıt işlemi bunu aşabilir. Süre dolunca systemd SIGKILL gönderir; kayıt yarıda kalır ve o bölgedeki chunk’lar bozulabilir. Bu yüzden değeri 120 saniyeye çekin, çok büyük dünyalarda 300 saniyeye kadar çıkın.
kill -9 veya systemctl kill -s SIGKILL ile asla kapatmayın. Bu, kayıt işlemini ortasından keser ve bölge dosyalarını (region/*.mca) bozar. Düzenli yedek almıyorsanız kayıp kalıcıdır; sunucu yedekleme rehberini mutlaka uygulayın.Bakım öncesi otomatik uyarı#
Kapatmadan önce oyuncuları uyarmak isterseniz socket yöntemiyle birlikte ExecStop zincirini genişletebilirsiniz:
ExecStop=/bin/sh -c 'echo "say Sunucu 30 saniye icinde bakima giriyor" > /run/minecraft/stdin'
ExecStop=/bin/sleep 30
ExecStop=/bin/sh -c 'echo "save-all" > /run/minecraft/stdin'
ExecStop=/bin/sleep 5
ExecStop=/bin/sh -c 'echo "stop" > /run/minecraft/stdin'
systemd ExecStop satırlarını yazıldıkları sırayla çalıştırır. Toplam sürenin TimeoutStopSec değerini aşmadığından emin olun.
Birden Fazla Sunucu: Şablon Unit#
Aynı makinede survival, skyblock ve minigame sunucularını ayrı ayrı yönetmek için her biri adına unit dosyası açmanız gerekmez. Dosyayı minecraft@.service adıyla kaydedin ve %i değişkenini kullanın.
[Unit]
Description=Minecraft Sunucusu (%i)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=minecraft
Group=minecraft
WorkingDirectory=/opt/minecraft/%i
EnvironmentFile=/opt/minecraft/%i/service.env
ExecStart=/usr/bin/java $JAVA_MEM $JAVA_FLAGS -jar $SERVER_JAR --nogui
Restart=on-failure
RestartSec=15s
TimeoutStopSec=120
SyslogIdentifier=mc-%i
[Install]
WantedBy=multi-user.target
Her sunucunun dizinine bir service.env dosyası koyun:
# /opt/minecraft/survival/service.env
JAVA_MEM=-Xms10G -Xmx10G
JAVA_FLAGS=-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200
SERVER_JAR=paper.jar
sudo systemctl daemon-reload
sudo systemctl enable --now minecraft@survival
sudo systemctl enable --now minecraft@skyblock
systemctl status 'minecraft@*'
Her örneğin server.properties dosyasında farklı bir server-port tanımlamayı ve bu portları UFW ile açmayı unutmayın. Sunucu ağı kuruyorsanız arka uçları dışarıya hiç açmayıp yalnızca proxy portunu yayınlamak daha doğrudur.
Servisi Sıkılaştırma ve Kaynak Sınırlama#
systemd, süreci çekirdek düzeyinde kısıtlayabilir. Aşağıdaki satırlar bir eklenti açığının zarar yüzeyini belirgin biçimde daraltır.
[Service]
NoNewPrivileges=true
PrivateTmp=true
PrivateDevices=true
ProtectSystem=strict
ProtectHome=true
ProtectKernelTunables=true
ProtectControlGroups=true
RestrictSUIDSGID=true
LockPersonality=true
ReadWritePaths=/opt/minecraft/server
# Kaynak sınırları
LimitNOFILE=1048576
OOMPolicy=continue
ProtectSystem=strict tüm dosya sistemini salt okunur yapar; bu yüzden ReadWritePaths ile sunucu dizinini istisna tutmak zorundasınız. Dynmap gibi harici dizine yazan eklentileriniz varsa o yolları da eklemeniz gerekir, aksi halde eklenti “permission denied” verir.MemoryMax direktifiyle cgroup düzeyinde bellek tavanı koymak cazip görünür ama dikkatli olun: JVM heap dışında metaspace, thread stack ve doğrudan bellek de kullanır. Tavanı -Xmx değerinin en az 2 GB üzerinde tutun, yoksa çekirdek OOM Killer süreci öldürür ve oyuncular ortada kalır.
Log Takibi ve Hata Ayıklama#
journald tüm konsol çıktısını saklar. Sunucu açılmıyorsa bakılacak ilk yer burasıdır.
# Son açılış denemesindeki hatalar
journalctl -u minecraft -b --no-pager | tail -n 80
# Belirli bir kelimeyi ara
journalctl -u minecraft --since "1 hour ago" | grep -i "exception"
# Servisin neden durduğunu gör
systemctl show minecraft -p ExecMainStatus -p Result
| Hata / durum | Anlamı | Çözüm |
|---|---|---|
status=203/EXEC | ExecStart’taki program çalıştırılamadı | which java ile tam yolu yazın |
status=200/CHDIR | WorkingDirectory yok veya erişilemiyor | Dizini ve chown minecraft:minecraft iznini kontrol edin |
status=1/FAILURE, hemen çıkıyor | Genelde EULA onaylanmamış | eula.txt içinde eula=true yapın |
UnsupportedClassVersionError | Java sürümü eski | Java sürüm hatası çözümü |
Failed to bind to port | 25565 zaten kullanımda | sudo ss -tulpn | grep 25565 ile süreci bulun |
| Servis “active” ama oyuncu giremiyor | Port güvenlik duvarında kapalı | sudo ufw allow 25565/tcp |
Sistem yeniden başlatıldıktan sonra servisin gerçekten kalkıp kalkmadığını test etmeden emin olmayın. Bakım penceresinde sudo reboot deyip iki dakika sonra systemctl is-enabled minecraft ve systemctl is-active minecraft çıktılarına bakın; ikisi de enabled ve active dönmelidir.
Otomatik Yeniden Başlatma Zamanlaması#
Uzun süre çalışan Minecraft sunucularında bellek parçalanması ve eklenti sızıntıları birikir. Günde bir kez planlı yeniden başlatma çoğu sunucuda TPS’i belirgin biçimde toparlar. Bunu cron yerine systemd timer ile yapmak daha temizdir:
# /etc/systemd/system/minecraft-restart.timer
[Unit]
Description=Minecraft sunucusunu her gece 05:00'te yeniden baslat
[Timer]
OnCalendar=*-*-* 05:00:00
Persistent=true
[Install]
WantedBy=timers.target
# /etc/systemd/system/minecraft-restart.service
[Unit]
Description=Minecraft yeniden baslatma islemi
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl restart minecraft
sudo systemctl daemon-reload
sudo systemctl enable --now minecraft-restart.timer
systemctl list-timers minecraft-restart.timer
Yeniden başlatma saatini oyuncu sayısının en düşük olduğu ana koyun. Aynı zaman diliminde yedek de alıyorsanız iki işi çakıştırmayın; disk I/O’su aynı anda hem kayıt hem kopyalama yapınca kapanma süresi uzar.
Donanım Tarafı: Servis Sağlam, Peki Sunucu?#
systemd sunucunuzu ayakta tutar ama performansı belirlemez. Minecraft’ın ana tick döngüsü tek çekirdekte çalışır; bu yüzden çekirdek sayısı değil saat hızı belirleyicidir. AMD Ryzen 9 7900X veya 7950X sınıfı işlemciler bu iş için doğru tercihtir, alt sınır olarak Ryzen 9 3900X kabul edilebilir. Xeon E3/E5 ve düşük frekanslı çok çekirdekli sunucu işlemcileriyle aynı oyuncu sayısında belirgin şekilde daha düşük TPS alırsınız.
Disk tarafında NVMe SSD şarttır; chunk okuma/yazma gecikmesi doğrudan tick süresine yansır. En az 50 GB, modlu veya büyük dünyalı sunucularda 100 GB ve üzeri alan planlayın. RAM alt sınırınız 8 GB olsun; 10-30 oyuncu için 12 GB, modpack için 16 GB rahat çalıştırır. Kendi donanımınızı kurmak yerine hazır bir altyapı istiyorsanız yüksek frekanslı Ryzen VDS paketleri root erişimiyle gelir ve bu rehberdeki adımların tamamını uygulayabilirsiniz. Donanım seçimini derinlemesine karşılaştırmak için doğru donanım nasıl seçilir sayfasına bakın.
Özetle#
systemd servisi, Linux üzerindeki Minecraft sunucusunu manuel bakımdan kurtarır. /etc/systemd/system/minecraft.service dosyasında doğru kullanıcı, doğru çalışma dizini, tam Java yolu ve Restart=on-failure tanımlarsanız sunucunuz yeniden başlatmalarda kendiliğinden ayağa kalkar, çökmelerde 15 saniye içinde döner ve tüm logları journald’da toplanır.
Kritik üç ayar: TimeoutStopSec değerini 120 saniyeye çekerek dünya kaydının yarıda kesilmesini önleyin, her düzenlemeden sonra daemon-reload çalıştırın ve konsol erişimi için socket unit’i ya da tmux hibrit yöntemini kurun. Kurulumun tamamını sıfırdan yapıyorsanız Linux üzerinde Minecraft sunucu kurulumu rehberi bu sayfanın önceki adımlarını kapsıyor.