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

339 lines
9.4 KiB
Markdown

# 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