Ein solides Server-Monitoring-Setup ist die Versicherungspolice beim Betrieb eines Gameservers: Du siehst, wie die CPU am Anschlag läuft, der RAM volläuft oder ein Prozess abstürzt, bevor die Spieler überhaupt Lag spüren. In diesem Guide zeige ich dir, wie du einen Linux-Gameserver (Metin2, Minecraft, CS, ein Discord-Bot-Host — egal) mit dem Trio Prometheus + node_exporter + Grafana vollständig beobachtbar machst. Alles ist Open Source und läuft auf einem einzigen VPS.
Warum Prometheus + Grafana?
Die Rollen dieses Duos sind sauber getrennt:
- Prometheus — die Zeitreihendatenbank und der Collector. Er „scrapet" in regelmäßigen Abständen die Ziele (Exporter), die du definierst, speichert die Metriken und macht sie abfragbar.
- node_exporter — der offizielle Exporter von Prometheus; er veröffentlicht CPU-, RAM-, Festplatten-, Netzwerk- und Last-Metriken des Betriebssystems auf einem HTTP-Endpunkt.
- Grafana — die Visualisierungsschicht. Du verbindest Prometheus als Datenquelle und baust Dashboards und Alarme.
Die Daten fließen in eine Richtung: node_exporter → Prometheus → Grafana. Diese Architektur bleibt gleich, wenn du skalierst: Du installierst auf jeder neuen Maschine einen Exporter und fügst ihn als Ziel in Prometheus hinzu.
node_exporter installieren
node_exporter ist eine einzige statische Binary ohne Abhängigkeiten. Laden wir die offizielle Version herunter und führen sie als systemd-Dienst aus:
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
Erstelle anschließend eine systemd-Unit-Datei:
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
Verifizieren: curl http://localhost:9100/metrics sollte eine lange Liste von Metriken zurückgeben. node_exporter lauscht standardmäßig auf Port 9100.
Prometheus einrichten und Ziele definieren
Du kannst Prometheus genauso als Binary herunterladen oder mit Docker betreiben. Sein Herzstück ist die Konfigurationsdatei prometheus.yml, in der du deine Scrape-Ziele definierst:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
labels:
instance: 'metin2-vps-1'
scrape_interval legt fest, wie oft Daten erfasst werden; 15 Sekunden sind für die meisten Gameserver eine ausreichende Auflösung. Hast du mehrere Maschinen, füge unter targets neue ip:9100-Zeilen hinzu. Prometheus mit Docker hochzufahren ist der praktischste Weg:
docker run -d --name prometheus -p 9090:9090 \
-v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
Prüfe unter http://server-ip:9090/targets, dass dein Ziel als UP erscheint.
Spielerzahlen und eigene Game-Metriken
node_exporter liefert dir Systemmetriken, kann aber die Frage „Wie viele Spieler sind online?" nicht beantworten. Hier gibt es zwei praktische Ansätze:
- Prozess-Metriken — mit
process-exporterkannst du den CPU- und Speicherverbrauch der Gameserver-Prozesse (z. B. der Channel-/Game-Prozesse von Metin2) einzeln verfolgen. Frisst ein Channel plötzlich RAM, siehst du es sofort. - eigener Exporter — die Spielerzahl steckt meist in einer Datenbank oder in der eigenen API des Servers. Ein kleines Skript kann Werte an das Pushgateway von Prometheus pushen, oder du nutzt den
textfile collector.
Die Textfile-Collector-Methode ist die einfachste: Starte node_exporter mit --collector.textfile.directory=/var/lib/node_exporter, dann schreibt ein Cron-Skript die Metrik in eine .prom-Datei:
#!/bin/bash
# die Anzahl der Online-Spieler aus MySQL lesen
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
Ein atomisches mv verhindert, dass node_exporter eine halb geschriebene Datei einliest. Jetzt kannst du die Metrik game_players_online in Grafana grafisch darstellen.
Grafana-Dashboard und Alarme
Nach der Installation von Grafana (Docker: grafana/grafana, Port 3000) ist der erste Schritt, Prometheus unter Connections → Data sources als Datenquelle hinzuzufügen; setze als URL http://prometheus:9090 oder die IP deines Servers. Statt ein Dashboard von Grund auf zu bauen, ist der Import eines fertigen am schnellsten: Für node_exporter bringt das Community-Dashboard ID 1860 (Node Exporter Full) Dutzende Panels für CPU, RAM, Festplatte und Netzwerk.
Der eigentliche Wert liegt in den Alarmen. Ein paar praktische PromQL-Ausdrücke:
- CPU-Auslastung:
100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)— warnen, wenn sie 90 % überschreitet. - Freier-RAM-Anteil:
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes— warnen, wenn er unter 10 % fällt. - Festplattenfüllung:
node_filesystem_avail_bytesauf der Root-Partition unter einem kritischen Schwellenwert.
In Grafana erstellst du aus einem Panel eine Alert rule, definierst den Schwellenwert und leitest die Benachrichtigung an einen Discord-Webhook, eine E-Mail oder Telegram weiter. So vibriert dein Handy um 3 Uhr nachts, wenn der Server ausfällt — statt dass du von Spielerbeschwerden geweckt wirst.
Sicherheitshinweis
Gib die Ports der Exporter und von Prometheus (9100, 9090) niemals ins öffentliche Internet frei. Sie haben keine Authentifizierung und verraten Informationen über dein System. Der richtige Ansatz: Beschränke diese Ports in der Firewall (z. B. ufw) nur auf dein internes Netz oder vertrauenswürdige IPs, und stelle sie für den Verkehr zwischen Maschinen hinter ein VPN (WireGuard) oder einen Reverse-Proxy mit Basic Auth. Stelle auch Grafanas Port 3000 hinter einen TLS-Reverse-Proxy (Nginx/Caddy) — das ist das sauberste Setup.
Häufige Fragen
Können Prometheus und der Gameserver auf demselben VPS laufen?
Ja, im kleinen bis mittleren Maßstab ist das in Ordnung. Prometheus und node_exporter sind sehr leichtgewichtig. Halte nur die Aufbewahrungsdauer (etwa 15 Tage) und das Scrape-Intervall vernünftig; monatelang Daten im Sekundentakt zu speichern verschwendet Festplattenplatz ohne Grund.
Wie überwache ich mehrere Gameserver?
Installiere node_exporter auf jeder Maschine, fasse sie alle unter targets in einer einzigen prometheus.yml zusammen und gib jedem ein aussagekräftiges instance-Label. In Grafana überwachst du sie alle von einem Dashboard aus, indem du die Instance auswählst.
Sollte ich statt Grafana-Alerting etwas anderes nutzen?
Grafana-Alarme reichen für die meisten Anwendungsfälle. Möchtest du komplexere Silencing-/Gruppierungsregeln, füge Prometheus' eigene Komponente Alertmanager hinzu; beide arbeiten auch zusammen.
Hör auf, deinen Gameserver blind zu fliegen. Soll ich deinen Server mit einem Prometheus-+-Grafana-Monitoring-Setup, Prozessüberwachung und Alarmen, die in Discord landen, richtig beobachtbar machen? Melde dich — ich kümmere mich um alles, von der Installation bis zu den Dashboards.