All checks were successful
Deploy GSM / deploy (push) Successful in 1m25s
- 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>
339 lines
9.4 KiB
Markdown
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
|