Wiki: Admin-Bereich, Messer-Server, Steam-LAN-Browser, Docker-Hosts und Konfiguration aktualisiert

mregosar committed 2026-10-29 20:32:49 +01:00
1 parent 4ffea5bd71
commit c3748ac8d2
8 files changed
+235 -23

No files matched your search

+4 -3
@@ -9,15 +9,16 @@
Ein Code gilt nur für die Webseite. Den CS2-Serverzugang bekommen Spieler getrennt. Codes lassen sich jederzeit neu erzeugen, der alte Link wird dann ungültig.
4. **Spieler treten bei.** Über den Teamlink gibt ein Spieler seinen Namen ein (optional die SteamID64). Der erste Spieler eines Teams wird Captain. Jeder Spieler setzt sich auf „bereit“. Ein Team ist bereit, wenn mindestens ein Spieler dabei ist, ein Captain existiert und alle beigetretenen Spieler bereit sind. Mit `REQUIRE_FULL_TEAMS=true` muss das Team vollständig sein.
5. **Map-Veto.** Sind beide Teams bereit, startet der Organisator das Veto. Die Captains bannen und wählen abwechselnd nach dem festen Ablauf (siehe [Map-Pools und Veto](Map-Pools-und-Veto)). Die letzte verbleibende Map wird automatisch Entscheidungsmap.
5. **Map-Veto.** Sind beide Teams bereit, startet der Organisator das Veto. Die Captains bannen und wählen abwechselnd nach dem festen Ablauf (siehe [Map-Pools und Veto](Map-Pools-und-Veto)). Die letzte verbleibende Map wird automatisch Entscheidungsmap. Für die Seitenwahl per Messerrunde gibt es dauerhafte [Messer-Server](Messer-Server).
6. **Server konfigurieren.** Nach dem Veto richtet das Backend den laufenden Server ein: Spielmodus, erste Map, Teamnamen, Startseiten, Match-Einstellungen, Passwörter und die [Turnierregeln](Turnierregeln).
7. **Während der Serie.** Der Organisator beendet die Aufwärmphase (`mp_warmup_end`), pausiert und setzt fort (`mp_pause_match`, `mp_unpause_match`), lädt die nächste Map, stoppt den Server oder beendet das Match.
8. **Fehlerfälle.** Startet der Server nicht oder schlägt die Konfiguration fehl, zeigt die Seite den Grund. Der Organisator kann den Vorgang über „Server neu starten“ bzw. „Konfiguration wiederholen“ erneut anstoßen.
8. **Fehlerfälle.** Startet der Server nicht oder schlägt die Konfiguration fehl, zeigt die Seite den Grund. Der Organisator kann den Vorgang über „Server neu starten“ bzw. „Konfiguration wiederholen“ erneut anstoßen. Auch im laufenden Match lädt der neu gestartete Server danach die aktuelle Map samt Passwort wieder.
## Automatisches Herunterfahren
Das Backend prüft regelmäßig alle Server:
- Match abgeschlossen oder abgebrochen: Server wird gestoppt.
- Lobby, Veto oder Server ohne Spieler: Nach `SERVER_IDLE_TIMEOUT_MINUTES` ohne Aktivität wird der Server gestoppt.
- Lobby, Veto oder Server ohne Spieler: Nach `SERVER_IDLE_TIMEOUT_MINUTES` ohne Aktivität wird der Server gestoppt. Die Frist zählt frühestens ab dem letzten (Neu-)Start des Servers.
- Messer-Server sind davon ausgenommen, sie laufen dauerhaft.
- Nach `SERVER_MAX_LIFETIME_HOURS` wird jeder Server gestoppt, unabhängig von der Aktivität.
+75 -9
@@ -1,16 +1,82 @@
# Admin-Bereich und Rollback
## Admin-Bereich
## Anmeldung
Unter `/admin` verwaltet der Admin alle Matches. Die Anmeldung läuft über `ADMIN_PASSWORD`. Ohne dieses Passwort gibt es den Bereich nicht. Die Anmeldung ist auf 5 Versuche pro Minute begrenzt.
Unter `/admin` verwaltet der Admin alle Matches. Die Anmeldung läuft über `ADMIN_PASSWORD`. Ohne dieses Passwort gibt es den Bereich nicht. Die Anmeldung ist auf 5 Versuche pro Minute begrenzt und gilt 12 Stunden, aber nur, solange die Anwendung läuft. Nach einem Neustart der Anwendung muss man sich neu anmelden.
Der Admin kann:
- Veto starten und Veto-Schritte auch für ein Team ausführen
- Server neu starten, stoppen und konfigurieren
- Aufwärmphase beenden, pausieren und fortsetzen
- nächste Map laden, Match abschließen oder abbrechen
- Codes erneuern und Spieler entfernen
- Matches löschen
Der Admin-Bereich hat zwei Reiter: **Matches** und **Einstellungen**.
## Reiter „Matches“
### Docker-Hosts
Pro Host: belegte und freie Plätze, ein Balken für die Auslastung, der freie Speicher dort, wo das Gameserver-Volume liegt (auch wenn es auf einer anderen Platte liegt), und die Matches und Messer-Server auf dem Host.
### Messer-Server
Messer-Server für die Seitenwahl starten und verwalten (5v5 oder 2v2). Siehe [Messer-Server](Messer-Server).
### Suche und Filter
- **Suche** nach Teamnamen, Spielern und Match-ID.
- **Filter:** Alle · Laufend · Fehler · Abgeschlossen · Archiv, jeweils mit Anzahl. Gibt es Serverfehler, ist die Zahl bei „Fehler“ rot.
- Der gewählte Filter bleibt im Browser gespeichert.
### Matchkarte
- Teams, Modus, Format, Status und Live-Stand der aktuellen Map.
- **Adresse:** `Server 192.168.178.45:27015 · CSTV 192.168.178.45:27115`. Bei gestopptem Server ausgeblendet.
- **Angefordert:** Datum und Uhrzeit, wann der Server zuletzt angefordert wurde (auch nach „Server neu starten / wiederholen“).
- Abzeichen „Pausiert“ und „Archiviert“.
- Bei einem Serverfehler steht die Ursache rot direkt in der Karte.
### Aktionen
- Ansehen, Veto starten
- Aufwärmphase beenden, Pausieren und Fortsetzen
- Nächste Map
- Server neu starten / wiederholen, Server stoppen
- Match abschließen, Match abbrechen
- Archivieren, Aus dem Archiv holen
- Löschen
Unter **Details**: Einladungslinks und Codes (erneuerbar), Verbindungsbefehle für Spieler und CSTV, Spielerliste mit „Entfernen“ und der Rollback.
**Neustart im laufenden Match:** Startet man den Server eines laufenden Matches neu, lädt die Anwendung danach die aktuelle Map samt Passwort wieder. Ein frisch gestarteter Server hat die volle Leerlauf-Frist, bevor er automatisch heruntergefahren wird.
### Archiv
- Abgeschlossene oder abgebrochene Matches lassen sich archivieren. Laufende nicht.
- Archivierte Matches verschwinden aus der normalen Liste und stehen nur unter „Archiv“, mit Datum.
- Nach `ARCHIVE_AFTER_DAYS` Tagen (Standard 3) wandern abgeschlossene Matches automatisch ins Archiv. `0` schaltet das ab. Die Frist lässt sich auch unter Einstellungen → Zeiten ändern.
## Reiter „Einstellungen“
### Gameserver
| Gruppe | Werte |
|---|---|
| Match-Regeln | Runden Competitive und Wingman, Verlängerung, zusätzliche Konsolenbefehle |
| CSTV | an/aus (wirkt ab dem nächsten Mapwechsel), Verzögerung |
| Zeiten | Zeit pro Veto-Schritt, Leerlauf-Frist, maximale Laufzeit, Startzeit inklusive Download, Archiv-Frist |
- Die Werte aus der `.env` sind die Vorgabe. Änderungen stehen in der Datenbank und gelten auch nach einem Neustart.
- Mit **live** markierte Werte gehen beim Speichern sofort per RCON an alle laufenden Server. Die anderen gelten für neue Server und Vetos.
- Befehle, die Passwörter ändern oder den Server beenden, nimmt die Anwendung nicht an.
### Docker-Hosts
- Hosts hinzufügen, entfernen und bearbeiten: Name, Docker-Ziel, Adresse für Spieler, Portbereich, LAN-Ports, Volume.
- Die Liste ersetzt `CS2_DOCKER_HOSTS` aus der `.env`. **Liste aus .env verwenden** schaltet zurück.
- Ein Host mit laufendem Server lässt sich nicht entfernen, und seine Adresse lässt sich nicht ändern.
### Image aktualisieren
**Auf allen Hosts aktualisieren** lädt das CS2-Image auf allen Hosts gleichzeitig neu, direkt auf dem Host per SSH. Laufende Server laufen weiter, neue starten mit dem neuen Image. Das Ergebnis steht pro Host darunter.
### Discord-Meldungen
Welche Ereignisse gemeldet werden, plus **Testmeldung senden**.
## Rollback
+17 -5
@@ -4,12 +4,20 @@ Mit `SERVER_ADAPTER=docker` startet die Anwendung pro Match einen Container mit
## Grundlagen
- **Container:** Namen `cs2mv-<matchId>`, Label `cs2-mapveto=1`.
- **Ports:** Pro Match zwei Ports aus `CS2_PORT_RANGE_START` bis `CS2_PORT_RANGE_END` (Spiel TCP und UDP, CSTV UDP).
- **Container:** Namen `cs2mv-<matchId>` (Messer-Server `cs2mv-knife1` usw.), Label `cs2-mapveto=1`.
- **Ports:** Der Spielport kommt zuerst aus den LAN-Ports 27015–27020, danach aus `CS2_PORT_RANGE_START` bis `CS2_PORT_RANGE_END`. Der CSTV-Port liegt immer 100 darüber (`CS2_TV_PORT_OFFSET`). Details unter [Steam-LAN-Browser](Steam-LAN-Browser).
- **Netz:** Server auf LAN-Ports laufen im Netz des Hosts (`--network host`), alle anderen mit Port-Weiterleitung. Ist ein Port von einem fremden Dienst belegt, nimmt die Anwendung den nächsten.
- **Servername:** `MaxLAN | Team A vs. Team B` (Anfang über `CS2_SERVERNAME_PREFIX`).
- **Spieleranzahl:** `CS2_MAXPLAYERS` ist 6 bei Wingman und 12 bei Competitive. CSTV belegt einen Slot.
- **Volume:** `CS2_DOCKER_VOLUME` (Standard `cs2-mapveto-gamefiles`), rund 60 bis 73 GB. So lädt nicht jeder Container neu.
- **Start-Warteschlange:** Die Container starten nacheinander, damit SteamCMD nicht parallel auf das Volume schreibt. Ein Container gilt als bereit, sobald der Update-Check beendet ist oder RCON antwortet.
- **Startzeit:** `CS2_START_TIMEOUT_MINUTES` (Standard 20).
- **Startzeit:** `CS2_START_TIMEOUT_MINUTES` (Standard 20). Der erste Start auf einem neuen Host lädt rund 73 GB und braucht oft länger. Dann die Startzeit im Admin-Bereich erhöhen oder danach „Server neu starten / wiederholen“, der Download macht an der Stelle weiter.
- **Volume auf einer anderen Platte:** Ist auf der Systemplatte zu wenig Platz, legt man das Volume per Bind-Mount auf eine größere Platte:
```
sudo mkdir -p /mnt/daten/cs2-mapveto
docker volume create --driver local --opt type=none --opt o=bind --opt device=/mnt/daten/cs2-mapveto cs2-mapveto-gamefiles
```
Für die Anwendung ändert sich nichts. Der Admin-Bereich zeigt den freien Platz dieser Platte an.
## LAN oder Internet
@@ -27,7 +35,11 @@ Mit `SERVER_ADAPTER=docker` startet die Anwendung pro Match einen Container mit
Ein Container mit Webseite, Backend und Datenbank startet die CS2-Container auf demselben Host. Dafür gibt es `deploy/compose.yml` mit `deploy/.env`. Details im Repository unter `docs/container.md`.
## Image aktualisieren
Im Admin-Bereich unter Einstellungen → **Image aktualisieren** lädt die Anwendung das Image auf allen Hosts gleichzeitig neu. Laufende Server laufen weiter. Die CS2-Spieldateien aktualisiert jeder Container beim Start selbst.
## Bekannte Grenzen
- Der Docker- und der Static-Adapter sind bislang nicht gegen einen echten Server im Dauerbetrieb geprüft.
- Die Auswertung der `status`-Ausgabe (Map-Name, Spielerzahl) ist noch nicht gegen die echte Ausgabe getestet.
- Der Static-Adapter ist bislang nicht gegen einen echten Server im Dauerbetrieb geprüft.
- Ein laufendes Match lässt sich nicht auf einen anderen Host verschieben.
+4 -2
@@ -11,11 +11,13 @@ Diese Seiten erklären den Betrieb und die Bedienung der Match-Verwaltung für C
- [Map-Pools und Veto](Map-Pools-und-Veto) – Abläufe für Wingman und Competitive
- [Live-Ergebnisse und Stream](Live-Ergebnisse-und-Stream) – Auswertung der CS2-Logs und Stream-Ansichten
- [Turnierregeln](Turnierregeln) – Serverwerte nach FACEIT- und ESL-Richtwerten
- [Admin-Bereich und Rollback](Admin-Bereich-und-Rollback) – Verwaltung aller Matches, Rundenrücksprung
- [Admin-Bereich und Rollback](Admin-Bereich-und-Rollback) – Verwaltung aller Matches, Suche, Archiv, Einstellungen, Rundenrücksprung
- [Messer-Server](Messer-Server) – dauerhafte Server für die Messerrunde zur Seitenwahl (5v5 und 2v2)
- [Docker-Betrieb](Docker-Betrieb) – CS2-Server als Container auf einem Docker-Host
- [Mehrere Docker-Hosts](Mehrere-Docker-Hosts) – Gameserver auf mehrere Rechner verteilen
- [Steam-LAN-Browser](Steam-LAN-Browser) – Server im LAN-Reiter von Steam, Ports und CSTV
- [Reverse-Proxy](Reverse-Proxy) – Webseite per HTTPS unter eigener Domain
## Stand
Die Dokumentation folgt der README im Repository. Nicht gegen einen echten CS2-Server getestet sind bislang die Docker- und Static-Adapter sowie die Auswertung der `status`-Ausgabe.
Die Dokumentation folgt der README im Repository. Der Docker-Adapter läuft im echten Betrieb mit zwei Docker-Hosts. Nicht gegen einen echten Server getestet ist bislang der Static-Adapter.
+15
@@ -20,7 +20,22 @@ Alle Variablen mit Standardwerten stehen in `.env.example` im Repository. Hier d
| `STREAM_KEY` | leer | Schlüssel für die Stream-Übersicht aller Matches |
| `ADMIN_PASSWORD` | leer | Aktiviert den Admin-Bereich unter `/admin` |
| `LOG_DEBUG` | `false` | empfangene Logzeilen im Terminal ausgeben |
| `VETO_STEP_SECONDS` | `30` | Zeit pro Veto-Schritt, danach wird automatisch gewählt; `0` = ohne Frist |
| `ARCHIVE_AFTER_DAYS` | `3` | abgeschlossene Matches nach so vielen Tagen archivieren; `0` = nie |
| `DISCORD_WEBHOOK_URL` | leer | Discord-Webhook für Meldungen |
| `DOCKER_HOST` | leer | Docker-Ziel für einen einzelnen Host, z. B. `ssh://cs2docker` |
| `CS2_DOCKER_HOSTS` | leer | mehrere Docker-Hosts als JSON-Liste, siehe [Mehrere Docker-Hosts](Mehrere-Docker-Hosts) |
| `CS2_PORT_RANGE_START`, `CS2_PORT_RANGE_END` | `27015`, `27115` | Bereich der Spielports |
| `CS2_LAN_PORTS` | `27015-27020` | Spielports für den LAN-Reiter von Steam, werden zuerst vergeben; leer = aus |
| `CS2_TV_PORT_OFFSET` | `100` | CSTV-Port = Spielport + Abstand (27015 → 27115) |
| `CS2_SERVERNAME_PREFIX` | `MaxLAN` | Anfang des Servernamens im Serverbrowser |
| `CS2_START_TIMEOUT_MINUTES` | `20` | Startzeit eines Servers inklusive Download der Spieldateien |
| `KNIFE_MAP` | `de_mirage` | Standard-Map für [Messer-Server](Messer-Server) |
| `KNIFE_WARMUP_SECONDS` | `90` | Zeit zum Verbinden vor der Messerrunde |
| `KNIFE_MAX_SERVERS` | `4` | höchstens so viele Messer-Server |
Ohne `ADMIN_PASSWORD` antwortet `/admin` mit 404.
Viele Gameserver-Werte (Runden, Verlängerung, CSTV, Zeiten, Archiv-Frist) und die Docker-Hosts lassen sich auch im Admin-Bereich unter **Einstellungen** ändern. Die Werte aus der `.env` sind dann nur noch die Vorgabe. Siehe [Admin-Bereich und Rollback](Admin-Bereich-und-Rollback).
Passwörter für Server und CSTV erzeugt das Backend selbst. Sie bestehen nur aus Buchstaben und Ziffern, weil das Container-Image Umgebungswerte auswertet.
+15 -4
@@ -8,8 +8,11 @@ Diese Anleitung geht davon aus, dass alle Rechner im LAN stehen und du sie per W
- Auf jedem Rechner läuft Linux mit Docker (Installation: https://docs.docker.com/engine/install/).
- Auf jedem Rechner gibt es ein Benutzerkonto, das in der Gruppe `docker` ist. Test: `docker ps` ohne `sudo` funktioniert.
- Auf jedem Rechner sind rund 90 GB freier Platz unter `/var/lib/docker`.
- Die Ports 27100 bis 27139 (TCP und UDP) sind auf jedem Rechner frei.
- Auf jedem Rechner sind rund 90 GB frei, dort wo das Volume liegt (normal `/var/lib/docker`). Ist die Systemplatte zu klein, das Volume auf eine andere Platte legen, siehe [Docker-Betrieb](Docker-Betrieb).
- Auf jedem Rechner sind frei (TCP und UDP):
- 27015–27020 für den LAN-Reiter von Steam, dazu 27115–27120 für CSTV,
- 27100–27139 für weitere Server, dazu 27200–27239 für CSTV.
- Die Firewall des Rechners erlaubt die Ports 27015–27020 und 27115–27120. Server darauf laufen im Netz des Hosts, siehe [Steam-LAN-Browser](Steam-LAN-Browser).
## 2. SSH-Schlüssel anlegen
@@ -85,6 +88,9 @@ Bedeutung der Felder:
| `portStart`, `portEnd` | Portbereich für Matches auf diesem Host |
| `rconHost` | optional, wenn das Backend eine andere Adresse braucht |
| `volume` | optional, Standard ist `cs2-mapveto-gamefiles` |
| `lanPorts` | optional, Spielports für den LAN-Reiter, Standard `27015-27020`. Einschränken, wenn dort schon etwas läuft, z. B. `"27016-27019"`; `""` = aus |
**Statt in der `.env`** lassen sich die Hosts auch im Admin-Bereich unter Einstellungen → **Docker-Hosts** eintragen und bearbeiten. Diese Liste steht in der Datenbank und ersetzt dann `CS2_DOCKER_HOSTS`. Ein Neustart ist dafür nicht nötig.
Das Backend braucht die Adressen `publicHost` und `rconHost` in beide Richtungen: Spieler müssen den Host erreichen, und das Backend muss die RCON-Ports erreichen.
@@ -94,7 +100,7 @@ Die Anwendung liest die `.env` nur beim Start. Also: Anwendung stoppen und wiede
## 6. Prüfen
1. Im Admin-Bereich (`/admin`) erscheint oben die Karte **Docker-Hosts**. Pro Host stehen dort der Name, die Adresse, die belegten und freien Plätze und die laufenden Matches.
1. Im Admin-Bereich (`/admin`) erscheint oben die Karte **Docker-Hosts**. Pro Host stehen dort der Name, die Adresse, die belegten und freien Plätze (bis zu 40 pro Host), der freie Speicher und die laufenden Matches und Messer-Server.
2. Ein Testmatch anlegen, Veto spielen. Die Karte zeigt danach einen Gameserver beim Host mit den meisten freien Plätzen.
3. Im Serverpanel des Matches steht die Adresse des Hosts (`Server <Host>:<Port>`).
@@ -107,9 +113,14 @@ Die Anwendung liest die `.env` nur beim Start. Also: Anwendung stoppen und wiede
| Das Skript meldet wenig freien Platz | Speicher freimachen oder `/var/lib/docker` auf eine größere Platte verlegen. CS2 braucht rund 90 GB. |
| `Kein Docker-Host mit freien Ports` | Alle Hosts sind voll, oder die Ports sind belegt. Die Karte „Docker-Hosts“ zeigt, wo es hakt. |
| Ein Host fehlt in der Karte | Der Eintrag in `CS2_DOCKER_HOSTS` ist fehlerhaft. Die Anwendung meldet beim Start den Fehler, z. B. `CS2_DOCKER_HOSTS ist kein gültiges JSON`. |
| Der erste Start dauert sehr lange | Das ist normal. Der Host lädt die CS2-Spieldateien (60 bis 90 GB). Spätere Starts sind schneller. |
| Der erste Start dauert sehr lange | Das ist normal. Der Host lädt die CS2-Spieldateien (60 bis 90 GB). Spätere Starts sind schneller. Läuft die Startzeit ab, die Startzeit im Admin-Bereich erhöhen oder „Server neu starten / wiederholen“, der Download macht weiter. |
| `port is already allocated` | Ein anderer Dienst belegt einen Port. Die Anwendung nimmt dann den nächsten freien. Dauerhaft belegte LAN-Ports per `lanPorts` ausnehmen. |
| Ein Match hängt auf „Server wird angefordert“ | Die Startzeit läuft bis zu 20 Minuten. Danach „Server neu starten / wiederholen“ im Admin-Bereich. |
## Image aktualisieren
Im Admin-Bereich unter Einstellungen → **Image aktualisieren** auf „Auf allen Hosts aktualisieren“ klicken. Das Image wird auf allen Hosts gleichzeitig neu geladen, das Ergebnis steht pro Host darunter. Laufende Server laufen weiter.
## Ein Host fällt aus
Ein laufendes Match lässt sich nicht automatisch auf einen anderen Host verschieben. Der Admin beendet den Server über **Server stoppen** und startet ihn mit **Server neu starten / wiederholen** neu. Welcher Host dann gewählt wird, hängt von den freien Plätzen ab. Ist der Ausfall dauerhaft, den Host aus `CS2_DOCKER_HOSTS` entfernen und die Anwendung neu starten.
+56
@@ -0,0 +1,56 @@
# Messer-Server für die Seitenwahl
Messer-Server sind Gameserver, die keinem Match gehören und dauerhaft laufen. Teams verbinden sich, spielen ihre Messerrunde für die Seitenwahl und gehen wieder. Danach setzt sich der Server von selbst für die nächsten Teams zurück.
## Starten
Im Admin-Bereich, Reiter **Matches**, Karte **Messer-Server (Seitenwahl)**:
1. Modus wählen: **Competitive 5 gegen 5** oder **Wingman 2 gegen 2**.
2. Map wählen. Angeboten werden die Maps aus dem Map-Pool des Modus.
3. **Messer-Server starten** klicken.
Der Server braucht ein bis zwei Minuten, bis er „bereit“ ist. Es gibt höchstens `KNIFE_MAX_SERVERS` Messer-Server (Standard 4).
| Modus | Spielmodus | Plätze | Maps |
|---|---|---|---|
| 5v5 | Competitive (`game_mode 1`) | 12 | Competitive-Pool |
| 2v2 | Wingman (`game_mode 2`) | 6 | Wingman-Pool |
## Für die Spieler
- **Ohne Passwort.** Die Server stehen im LAN-Reiter von Steam, z. B. `MaxLAN | Messer 1 5v5 (Seitenwahl)`.
- Auf der **Startseite** gibt es den Abschnitt „Messer-Server für die Seitenwahl“ mit Adresse und Knopf **Verbinden**.
- Ablauf auf dem Server: Aufwärmphase zum Verbinden (`KNIFE_WARMUP_SECONDS`, Standard 90 Sekunden), dann eine Runde nur mit Messer, ohne Geld und ohne Kaufen. Danach startet das Spiel von selbst neu.
## Knöpfe pro Server
| Knopf | Wirkung |
|---|---|
| **Runde starten** | Aufwärmphase sofort beenden, die Messerrunde beginnt |
| **Zurücksetzen** | Spiel auf Aufwärmphase zurücksetzen (`mp_warmup_start`) |
| **Neu starten** | Container komplett neu starten, z. B. wenn der Server hängt |
| **Entfernen** | Server stoppen und löschen |
## Automatik
- **Nach der Runde:** CS2 startet das Spiel nach Spielende von selbst neu (`mp_match_end_restart 1`).
- **Server leer:** Gehen alle Spieler, setzt die Anwendung den Server zusätzlich zurück.
- **Ausfall:** Fällt ein Messer-Server aus, startet die Anwendung ihn neu, höchstens fünfmal in Folge. Danach steht er auf „ausgefallen“, dann hilft **Neu starten**.
- **Neustart der Anwendung:** Messer-Server stehen in der Datenbank und laufen weiter.
## Ports
Messer-Server belegen ihre Ports dauerhaft und bekommen zuerst einen LAN-Port (27015–27020), damit sie im LAN-Reiter von Steam stehen. Jeder Messer-Server ist damit ein Platz weniger im LAN-Reiter für Matches. Siehe [Steam-LAN-Browser](Steam-LAN-Browser).
## Einstellungen
| Variable | Standard | Zweck |
|---|---|---|
| `KNIFE_MAP` | `de_mirage` | vorausgewählte Map (wenn es sie im Pool des Modus gibt) |
| `KNIFE_WARMUP_SECONDS` | `90` | Zeit zum Verbinden vor der Messerrunde |
| `KNIFE_MAX_SERVERS` | `4` | höchstens so viele Messer-Server |
## Hinweis
CSTV bleibt auf den Messer-Servern an, weil das Container-Image es beim Start einschaltet. Das schadet nicht.
+49
@@ -0,0 +1,49 @@
# Server im Steam-Serverbrowser (LAN-Reiter)
Spieler finden die Server in Steam unter **Ansicht → Spielserver → LAN**. Dort erscheinen sie mit einem Schloss, weil Match-Server ein Passwort haben. Messer-Server erscheinen ohne Schloss.
## Warum nur bestimmte Ports
Der LAN-Reiter sucht per Broadcast und fragt nur die Ports **27015 bis 27020** ab. Server auf anderen Ports antworten nie und tauchen dort nicht auf. Pro IP-Adresse passen also höchstens 6 Server in den LAN-Reiter.
Deshalb vergibt die Anwendung den Spielport zuerst aus `CS2_LAN_PORTS` (Standard `27015-27020`). Sind die belegt, kommt der Spielport aus dem normalen Bereich (`CS2_PORT_RANGE_START` bis `CS2_PORT_RANGE_END`). Solche Server laufen ganz normal, Spieler erreichen sie über den Verbindungsbefehl auf der Webseite oder über die Favoriten in Steam.
## CSTV-Port
Der CSTV-Port liegt immer `CS2_TV_PORT_OFFSET` (Standard 100) über dem Spielport:
| Spielport | CSTV-Port |
|---|---|
| 27015–27020 (LAN-Reiter) | 27115–27120 |
| 27100–27139 (normal) | 27200–27239 |
Auf jedem Docker-Host müssen deshalb auch diese CSTV-Ports frei sein.
## Host-Netz
Docker reicht Broadcast-Pakete über die Port-Weiterleitung nicht an Container weiter. Server auf einem LAN-Port laufen deshalb direkt im Netz des Hosts (`--network host`). Alle anderen Server laufen wie bisher mit Port-Weiterleitung.
Folgen:
- **Fremde Dienste:** Im Host-Netz meldet Docker keinen Portkonflikt. Die Anwendung prüft deshalb vor dem Start per SSH (`ss`), ob ein fremder Dienst den Port belegt, und nimmt sonst den nächsten.
- **Firewall:** Ohne Docker-Weiterleitung greift die Firewall des Hosts. Sie muss die Ports erlauben.
## LAN-Ports pro Host
Läuft auf einem Host schon etwas auf einem der Ports 27015–27020, schränkt man die LAN-Ports für diesen Host ein. In `CS2_DOCKER_HOSTS`:
```
{"name":"cs2docker","dockerHost":"ssh://cs2docker","publicHost":"192.168.178.111","portStart":27100,"portEnd":27139,"lanPorts":"27016-27019"}
```
`"lanPorts":""` schaltet es für einen Host ab. Im Admin-Bereich steht das unter Einstellungen → Docker-Hosts in der Spalte **LAN-Ports (Steam)**.
## Servername
Im Browser heißen die Server `MaxLAN | Team A vs. Team B`, Messer-Server `MaxLAN | Messer 1 5v5 (Seitenwahl)`. Den Anfang ändert `CS2_SERVERNAME_PREFIX`.
## Prüfen
Erscheint ein Server nicht im LAN-Reiter:
1. Spielport ansehen (Admin-Bereich, Matchkarte). Liegt er nicht zwischen 27015 und 27020, ist das so gewollt.
2. Steht er auf einem LAN-Port, aber nicht in der Liste: Firewall des Hosts prüfen und ob der Container im Host-Netz läuft (`docker inspect <container> --format '{{.HostConfig.NetworkMode}}'` ergibt `host`).
3. Steam-Serverfenster schließen und neu öffnen, der LAN-Reiter sucht nur beim Öffnen und Aktualisieren.