Mehrere Docker-Hosts einrichten
Mit mehreren Docker-Hosts verteilt CS2 Mapveto die Gameserver auf mehrere Rechner. Jedes neue Match startet auf dem Host mit den meisten freien Plätzen. Der Host bleibt im Match gespeichert.
Diese Anleitung geht davon aus, dass alle Rechner im LAN stehen und du sie per Windows-PC (mit Git Bash) erreichst.
1. Voraussetzungen
- 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
dockerist. Test:docker psohnesudofunktioniert. - 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. - 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.
2. SSH-Schlüssel anlegen
Auf dem Windows-PC, in Git Bash:
ssh-keygen -t ed25519 -f ~/.ssh/cs2_docker
Den öffentlichen Schlüssel auf jeden Rechner kopieren (nach jeder Abfrage das Passwort des Rechners eingeben):
ssh-copy-id -i ~/.ssh/cs2_docker.pub cs2@192.168.178.111
ssh-copy-id -i ~/.ssh/cs2_docker.pub cs2@192.168.178.112
Danach muss die Anmeldung ohne Passwort funktionieren:
ssh -i ~/.ssh/cs2_docker cs2@192.168.178.111 "docker ps"
Die Ausgabe ist eine leere Liste oder eine Tabelle, aber keine Passwortabfrage und keine Fehlermeldung.
Tipp: Damit du die Option -i nicht jedes Mal angeben musst, trage die Rechner in ~/.ssh/config ein:
Host cs2-host1
HostName 192.168.178.111
User cs2
IdentityFile ~/.ssh/cs2_docker
Host cs2-host2
HostName 192.168.178.112
User cs2
IdentityFile ~/.ssh/cs2_docker
Dann heißt das Ziel cs2-host1 statt cs2@192.168.178.111.
3. Hosts einrichten
Im Projektordner das Einrichtungsskript für jeden Host starten:
bash deploy/docker-host-einrichten.sh cs2-host1
bash deploy/docker-host-einrichten.sh cs2-host2
Das Skript:
- prüft die Verbindung,
- prüft Docker und zeigt den freien Platz,
- legt das Volume
cs2-mapveto-gamefilesan, - lädt das Image
joedwards32/cs2:latest.
Am Ende gibt es für jeden Host einen fertigen Eintrag für die .env.
4. Die Hosts in der .env eintragen
In der .env im Projektordner eine Zeile mit einer JSON-Liste schreiben. Alle Einträge auf eine Zeile:
CS2_DOCKER_HOSTS=[{"name":"host1","dockerHost":"ssh://cs2-host1","publicHost":"192.168.178.111","portStart":27100,"portEnd":27139},{"name":"host2","dockerHost":"ssh://cs2-host2","publicHost":"192.168.178.112","portStart":27100,"portEnd":27139}]
Bedeutung der Felder:
| Feld | Bedeutung |
|---|---|
name |
Eindeutiger Name des Hosts, z. B. host1 |
dockerHost |
Ziel für Docker per SSH, ssh://… (genau wie im SSH-Eintrag) |
publicHost |
Adresse, unter der Spieler den Host erreichen |
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.
5. Anwendung neu starten
Die Anwendung liest die .env nur beim Start. Also: Anwendung stoppen und wieder starten (npm start bzw. den Container neu starten).
6. Prüfen
- Im Admin-Bereich (
/admin) unter Einstellungen → Docker-Hosts steht oben die Auslastung. 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. - Ein Testmatch anlegen, Veto spielen. Die Karte zeigt danach einen Gameserver beim Host mit den meisten freien Plätzen.
- Im Serverpanel des Matches steht die Adresse des Hosts (
Server <Host>:<Port>).
Typische Probleme
| Problem | Lösung |
|---|---|
Permission denied (publickey) |
Der Schlüssel fehlt auf dem Rechner. ssh-copy-id erneut ausführen. |
docker: permission denied |
Der Benutzer ist nicht in der Gruppe docker. Auf dem Rechner: sudo usermod -aG docker cs2, danach neu anmelden. |
| 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. Einstellungen → 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. 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.
Die CS2-Spieldateien liegen im Volume jedes Hosts und kommen mit Spieldateien aktualisieren auf den neuesten Stand, auf allen Hosts gleichzeitig. Hosts mit laufenden Servern werden dabei ausgelassen. Siehe Docker-Betrieb.
Welcher Host einen neuen Server bekommt
- Zuerst Hosts, auf denen gerade kein Server hochfährt. Ein neuer Container lädt beim Start per SteamCMD die Spieldateien. Nach einem großen CS2-Update kann das lange dauern, und weitere Starts auf diesem Host müssten so lange warten. Gezählt werden Starts in der Warteschlange und Server, die laut Datenbank noch starten. So greift das auch nach einem Neustart der Anwendung.
- Danach der Host mit den meisten freien Plätzen.
- Hosts, auf denen gerade Spieldateien aktualisiert werden, bekommen keinen neuen Server. Sind alle anderen voll, schlägt der Start mit einem Hinweis darauf fehl.
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.