İyi bir sunucu monitoring kurulumu, oyun sunucusu işletmenin sigortası gibidir: oyuncular lag yaşamadan önce CPU'nun tavan yaptığını, RAM'in dolduğunu veya bir process'in çöktüğünü görürsün. Bu yazıda Prometheus + node_exporter + Grafana üçlüsüyle bir Linux oyun sunucusunu (Metin2, Minecraft, CS, Discord bot host'u — fark etmez) baştan sona nasıl izlenir hale getireceğini anlatıyorum. Hepsi açık kaynak, hepsi tek bir VPS'te çalışır.
Neden Prometheus + Grafana?
Bu ikilinin işi net bir şekilde ayrılmıştır:
- Prometheus — zaman serisi veritabanı ve toplayıcı. Belirlediğin hedefleri (exporter'ları) düzenli aralıklarla "scrape" eder, metrikleri saklar ve sorgulanabilir hale getirir.
- node_exporter — Prometheus'un resmi exporter'ı; işletim sisteminden CPU, RAM, disk, ağ ve yük (load) metriklerini bir HTTP endpoint'inde yayınlar.
- Grafana — görselleştirme katmanı. Prometheus'u veri kaynağı olarak bağlar, panolar (dashboard) ve alarmlar oluşturursun.
Veri akışı tek yönlüdür: node_exporter → Prometheus → Grafana. Bu mimari, sunucu sayını büyüttüğünde bile aynı kalır; yeni makineye exporter kurar, Prometheus'a hedef olarak eklersin.
node_exporter kurulumu
node_exporter tek bir statik binary'dir; bağımlılığı yoktur. Resmi sürümü indirip systemd servisi olarak çalıştıralım:
cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar xzf node_exporter-1.8.2.linux-amd64.tar.gz
sudo cp node_exporter-1.8.2.linux-amd64/node_exporter /usr/local/bin/
sudo useradd --no-create-home --shell /usr/sbin/nologin node_exporter
Ardından bir systemd unit dosyası oluştur:
sudo tee /etc/systemd/system/node_exporter.service >/dev/null <<'EOF'
[Unit]
Description=Prometheus Node Exporter
After=network.target
[Service]
User=node_exporter
Group=node_exporter
ExecStart=/usr/local/bin/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
Doğrulama: curl http://localhost:9100/metrics komutu uzun bir metrik listesi döndürmeli. node_exporter varsayılan olarak 9100 portunda dinler.
Prometheus'u kurma ve hedef tanımlama
Prometheus'u da benzer şekilde binary olarak indirebilir veya Docker ile çalıştırabilirsin. Kalbi prometheus.yml yapılandırma dosyasıdır. Scrape hedeflerini burada tanımlarsın:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
labels:
instance: 'metin2-vps-1'
scrape_interval ne sıklıkla veri toplanacağını belirler; 15 saniye çoğu oyun sunucusu için yeterli çözünürlüktür. Birden fazla makinen varsa targets listesine yeni ip:9100 satırları eklersin. Prometheus'u Docker ile ayağa kaldırmak en pratik yoldur:
docker run -d --name prometheus -p 9090:9090 \
-v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
http://sunucu-ip:9090/targets adresinde hedefin UP göründüğünü kontrol et.
Oyuncu sayısı ve özel oyun metrikleri
node_exporter sana sistem metriklerini verir ama "kaç oyuncu online?" sorusunu cevaplayamaz. Burada iki pratik yaklaşım var:
- process metrikleri —
process-exporterile oyun sunucusu process'lerinin (örneğin Metin2 channel/game process'leri) CPU ve bellek tüketimini ayrı ayrı izleyebilirsin. Bir kanal aniden RAM yiyorsa hemen görürsün. - özel exporter — oyuncu sayısı genelde veritabanında ya da sunucunun bir API'sindedir. Küçük bir script yazıp Prometheus'un Pushgateway'ine değer gönderebilir ya da
textfile collectorkullanabilirsin.
textfile collector yöntemi en basitidir: node_exporter'ı --collector.textfile.directory=/var/lib/node_exporter ile başlatırsın, sonra bir cron script'i metriği bir .prom dosyasına yazar:
#!/bin/bash
# online oyuncu sayısını MySQL'den oku
COUNT=$(mysql -N -e "SELECT COUNT(*) FROM player_online;" game_db)
echo "game_players_online ${COUNT}" > /var/lib/node_exporter/players.prom.$$
mv /var/lib/node_exporter/players.prom.$$ /var/lib/node_exporter/players.prom
Atomik mv kullanmak, node_exporter'ın yarı yazılmış dosya okumasını engeller. Artık Grafana'da game_players_online metriğini grafiğe dökebilirsin.
Grafana panosu ve alarmlar
Grafana'yı kurduktan sonra (Docker: grafana/grafana, port 3000) ilk iş Prometheus'u Connections → Data sources altında veri kaynağı olarak eklemektir; URL olarak http://prometheus:9090 veya sunucu IP'sini verirsin. Sıfırdan pano yapmak yerine hazır bir tane import etmek en hızlısıdır: node_exporter için topluluk panosu ID 1860 (Node Exporter Full) CPU, RAM, disk ve ağ için onlarca panel getirir.
Asıl değer alarmlardadır. Birkaç pratik PromQL ifadesi:
- CPU kullanımı:
100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)— %90'ı geçince uyarı. - Boş RAM oranı:
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes— %10'un altına düşünce uyarı. - Disk doluluğu:
node_filesystem_avail_byteskök bölümde kritik eşiğin altına inince.
Grafana'da bir panelden Alert rule oluşturup eşik tanımlar, bildirimi Discord webhook'una, e-postaya ya da Telegram'a yönlendirirsin. Böylece gece 3'te sunucu çökerken telefonun titrer — sabah oyuncu şikayetiyle uyanmazsın.
Güvenlik notu
Exporter ve Prometheus portlarını (9100, 9090) asla halka açık internete açma. Bunlar kimlik doğrulama içermez ve sistemin hakkında bilgi sızdırır. Doğru yaklaşım: bu portları firewall'da (örn. ufw) yalnızca iç ağa ya da güvendiğin IP'lere izin vermek, makineler arasıysa bir VPN (WireGuard) ya da reverse proxy + basic auth arkasından geçirmektir. Grafana'nın 3000 portunu da TLS'li bir reverse proxy (Nginx/Caddy) arkasına almak en temiz yoldur.
Sık Sorulan Sorular
Tek bir VPS'te Prometheus ve oyun sunucusu birlikte çalışır mı?
Evet, küçük/orta ölçekte sorun yok. Prometheus ve node_exporter çok hafiftir. Ancak retention süresini (örneğin 15 gün) ve scrape aralığını makul tut; aylarca veriyi saniyede saklamak gereksiz disk yer.
Birden fazla oyun sunucumu nasıl izlerim?
Her makineye node_exporter kur, hepsini tek bir Prometheus'un prometheus.yml dosyasında targets altında topla ve her birine anlamlı bir instance etiketi ver. Grafana'da tek panodan instance seçerek hepsini izlersin.
Grafana alarmı yerine başka bir şey kullanmalı mıyım?
Grafana alarmları çoğu kullanım için yeterlidir. Daha karmaşık susturma/gruplama kuralları istersen Prometheus'un kendi Alertmanager bileşenini ekleyebilirsin; ikisi birlikte de çalışır.
Oyun sunucunu kör uçurmayı bırak. Prometheus + Grafana monitoring kurulumu, process izleme ve Discord'a düşen alarmlar dahil sunucunu profesyonel şekilde gözlemlenebilir hale getirmemi ister misin? Benimle iletişime geç — kurulumdan panolara kadar hallederim.