# 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`:

```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

### Navbar-Logo
- 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
```bash
ssh root@192.168.2.30
pkill -f 'node server.js'
cd /opt/gameserver-monitor/backend
node server.js &
```

### Frontend neu bauen
```bash
ssh root@192.168.2.30
cd /opt/gameserver-monitor/frontend
npm run build
nginx -s reload
```

### Logs pruefen
```bash
# 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
