5
Mehrere Docker Hosts
SPP User edited this page 2026-11-01 22:12:42 +01:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 docker ist. Test: docker ps ohne sudo funktioniert.
  • 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:

  1. prüft die Verbindung,
  2. prüft Docker und zeigt den freien Platz,
  3. legt das Volume cs2-mapveto-gamefiles an,
  4. 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

  1. 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.
  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>).

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.