Files
GSM/docs/gsm.md
Alexander Zielonka 2d9a5910fa
All checks were successful
Deploy GSM / deploy (push) Successful in 1m25s
Cleanup repo, add Gitea CI/CD workflow, improve error handling
- Remove temp files and reorganize docs
- Add .gitea/workflows/deploy.yml for automated deployment
- Add unreachable host checks to server routes (/:id, logs, start/stop/restart)
- Add unreachable checks to config routes (zomboid, terraria, openttd)
- Return HTTP 503 with unreachable flag instead of crashing

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 12:15:32 +01:00

9.4 KiB

Gameserver Monitor (GSM) - Dokumentation

Uebersicht

Der Gameserver Monitor ist eine Web-Applikation zur Ueberwachung und Verwaltung von Gameservern.

URL: https://monitor.dimension47.de
Server: 192.168.2.30 (LXC Container)


Architektur

Browser
   |
   v
+------------------+
|  nginx (Port 80) |  Reverse Proxy
+--------+---------+
         |
   +-----+-----+
   |           |
   v           v
Frontend    Backend
(dist/)     (Port 3000)
   |           |
   |     +-----+-----+
   |     |     |     |
   |     v     v     v
   |   SQLite SSH  RCON
   |     |     |     |
   |     |     +-----+-----+
   |     |           |     |
   |     v           v     v
   |  users.db    .50   .51   .52
   |  whitelist   Facto  MC  VRis
   |
   +---> Prometheus (Port 9090)
              |
              v
         Grafana (Port 3001)

Tech Stack

Komponente Technologie
Frontend React 18 + Vite + TailwindCSS 4 + recharts
Backend Node.js 20 + Express
Datenbank SQLite (better-sqlite3)
Auth JWT + bcrypt
Metrics Prometheus + Node Exporter
Dashboards Grafana
Reverse Proxy nginx

Verzeichnisstruktur

/opt/gameserver-monitor/
|
+-- backend/
|   +-- server.js              # Express Server Entry
|   +-- config.json            # Server-Konfiguration
|   +-- .env                   # JWT_SECRET
|   +-- package.json
|   |
|   +-- routes/
|   |   +-- servers.js         # /api/servers Endpoints
|   |   +-- auth.js            # /api/auth Endpoints
|   |
|   +-- services/
|   |   +-- ssh.js             # SSH-Verbindungen, Status, Uptime
|   |   +-- rcon.js            # RCON-Kommunikation
|   |   +-- prometheus.js      # Prometheus Queries
|   |   +-- factorio.js        # Factorio Map-Gen Presets/Defaults
|   |
|   +-- middleware/
|   |   +-- auth.js            # JWT Middleware
|   |
|   +-- db/
|       +-- init.js            # DB-Schema, Caches, Templates
|       +-- users.sqlite       # User-Datenbank (users, whitelist_cache, factorio_templates, factorio_world_settings)
|
+-- frontend/
    +-- src/
    |   +-- main.jsx
    |   +-- App.jsx
    |   +-- api.js             # API Client
    |   |
    |   +-- pages/
    |   |   +-- Dashboard.jsx
    |   |   +-- ServerDetail.jsx
    |   |
    |   +-- components/
    |   |   +-- ServerCard.jsx
    |   |   +-- MetricsChart.jsx
    |   |   +-- LoginModal.jsx
    |   |   +-- SettingsModal.jsx
    |   |   +-- UserManagement.jsx
    |   |   +-- FactorioWorldManager.jsx  # Factorio Save-Verwaltung
    |   |   +-- WorldGenForm.jsx          # Map-Generation-Formular
    |   |
    |   +-- context/
    |       +-- UserContext.jsx
    |
    +-- public/
    |   +-- minecraft.png
    |   +-- factorio.png
    |   +-- vrising.png
    |   +-- navbarlogograuer.png
    |   +-- navbarlogoweiss.png
    |
    +-- dist/                  # Build Output (wird von nginx served)
    +-- index.html
    +-- package.json
    +-- vite.config.js
    +-- tailwind.config.js

API Endpoints

Authentifizierung

Method Endpoint Auth Beschreibung
POST /api/auth/login - Login, gibt JWT zurueck
GET /api/auth/me JWT Aktueller User + Rolle
POST /api/auth/change-password JWT Eigenes Passwort aendern
GET /api/auth/users superadmin Alle User auflisten
POST /api/auth/users superadmin Neuen User erstellen
PATCH /api/auth/users/:id/role superadmin Rolle aendern
PATCH /api/auth/users/:id/password superadmin Passwort setzen
DELETE /api/auth/users/:id superadmin User loeschen

Server

Method Endpoint Auth Beschreibung
GET /api/servers optional Alle Server mit Status/Metrics
GET /api/servers/:id optional Einzelner Server
POST /api/servers/:id/start moderator Server starten (body: {save: "name"} fuer Factorio)
POST /api/servers/:id/stop moderator Server stoppen
POST /api/servers/:id/restart moderator Server neustarten
GET /api/servers/:id/logs moderator Console Logs
POST /api/servers/:id/rcon moderator RCON Befehl senden
GET /api/servers/:id/whitelist optional Whitelist (gecached)
GET /api/servers/:id/metrics/history optional Prometheus History

Factorio World Management

Method Endpoint Auth Beschreibung
GET /api/servers/factorio/saves moderator Liste aller Saves
GET /api/servers/factorio/current-save JWT Aktuell geladener Save
GET /api/servers/factorio/presets moderator Map-Gen Presets + Defaults
GET /api/servers/factorio/presets/:name moderator Einzelnes Preset
GET /api/servers/factorio/templates moderator Gespeicherte Templates
POST /api/servers/factorio/templates moderator Template speichern
DELETE /api/servers/factorio/templates/:id moderator Template loeschen
POST /api/servers/factorio/create-world moderator Neue Welt erstellen
DELETE /api/servers/factorio/saves/:name moderator Save loeschen
GET /api/servers/factorio/saves/:name/settings moderator Erstellungs-Settings einer Welt

Rollensystem

Rolle Rechte
(kein Login) Dashboard ansehen, Metriken sehen
user Wie ohne Login
moderator + Server starten/stoppen, Logs, RCON, Whitelist
superadmin + Nutzerverwaltung

Server-Konfiguration

/opt/gameserver-monitor/backend/config.json:

{
  "servers": [
    {
      "id": "minecraft",
      "name": "All the Mods 10 | Minecraft",
      "host": "192.168.2.51",
      "type": "minecraft",
      "runtime": "screen",
      "screenName": "minecraft",
      "workDir": "/opt/minecraft",
      "startCmd": "./run.sh",
      "rconPort": 25575,
      "rconPassword": "gsm-mc-2026"
    },
    {
      "id": "factorio",
      "name": "Factorio",
      "host": "192.168.2.50",
      "type": "factorio",
      "runtime": "docker",
      "containerName": "factorio",
      "rconPort": 27015,
      "rconPassword": "jieTig6IkixaKuu"
    },
    {
      "id": "vrising",
      "name": "V Rising",
      "host": "192.168.2.52",
      "type": "vrising",
      "runtime": "systemd",
      "serviceName": "vrising",
      "workDir": "/home/steam/vrising"
    }
  ]
}

Runtime-Typen

Runtime Status-Check Start Stop Uptime
docker docker inspect docker start docker stop Container StartedAt
screen screen -ls screen -dmS screen -X quit ps -o etimes
systemd systemctl is-active systemctl start systemctl stop ActiveEnterTimestamp

Features

Oeffentliches Dashboard

  • Dashboard ist ohne Login sichtbar
  • Login-Modal fuer Admins ueber "Sign in" Button
  • Alle Server-Karten sichtbar, aber ohne Admin-Hints

Gameserver-Uptime

  • Zeigt Prozess-Uptime statt Host-Uptime
  • Docker: Container-Laufzeit
  • Screen: Session-Laufzeit
  • Systemd: Service-Aktivzeit

Whitelist-Caching (Minecraft)

  • Whitelist wird serverseitig in SQLite gecached
  • Anzeige auch wenn Server offline
  • Bearbeitung nur wenn Server online
  • Cache wird bei jeder Aenderung aktualisiert

Factorio World Management

  • Worlds-Tab in Server-Detail fuer Factorio-Server
  • Gesperrte Verwaltung wenn Server laeuft/startet/stoppt
  • Save-Auswahl beim Start: Klick auf "Start" bei einem Save startet den Server mit diesem Save
  • Current-Save-Anzeige: Im Overview-Tab wird angezeigt, welcher Save beim Starten geladen wird
  • Neue Welt erstellen:
    • Vollstaendiges Map-Generation-Formular (Terrain, Ressourcen, Gegner, Evolution)
    • Presets (Default, Rich Resources, Marathon, Death World, etc.)
    • Templates speichern und laden
    • Seed-Eingabe (optional)
  • World Settings anzeigen:
    • Info-Button bei jeder Welt zeigt Erstellungs-Einstellungen
    • Legacy-Fallback fuer Welten vor diesem Feature
  • Grau (navbarlogograuer.png) im Normalzustand
  • Weiss (navbarlogoweiss.png) bei Hover
  • Weiche CSS-Transition (300ms)
  • Link zu https://zeasy.software

Game-Logos

  • Automatische Erkennung anhand Server-Name
  • minecraft.png, factorio.png, vrising.png
  • Angezeigt in ServerCard und ServerDetail

Wartung

Backend neustarten

ssh root@192.168.2.30
pkill -f 'node server.js'
cd /opt/gameserver-monitor/backend
node server.js &

Frontend neu bauen

ssh root@192.168.2.30
cd /opt/gameserver-monitor/frontend
npm run build
nginx -s reload

Logs pruefen

# Backend (laeuft im Hintergrund)
# Fehler werden auf stderr ausgegeben

# nginx
tail -f /var/log/nginx/error.log
tail -f /var/log/nginx/access.log

Neuen Server hinzufuegen

  1. config.json bearbeiten (siehe oben)
  2. SSH-Key auf neuem Server hinterlegen
  3. Node Exporter installieren (fuer Prometheus)
  4. Backend neustarten

User verwalten

  • Ueber UI: Settings > Users (nur superadmin)
  • Direkt in DB: /opt/gameserver-monitor/backend/db/users.sqlite

Troubleshooting

502 Bad Gateway

  • Backend laeuft nicht
  • Loesung: Backend manuell starten

Server zeigt "offline" obwohl online

  • SSH-Verbindung fehlgeschlagen
  • Loesung: SSH-Key pruefen, Firewall pruefen

Whitelist leer

  • RCON-Verbindung fehlgeschlagen
  • Loesung: RCON-Port und Passwort pruefen

Metrics zeigen 0

  • Prometheus Target nicht erreichbar
  • Loesung: Node Exporter auf Gameserver pruefen