Wiki: Anleitung für mehrere Docker-Hosts

mregosar committed 2026-10-29 20:32:49 +01:00
1 parent 01a85964a0
commit 4ffea5bd71
2 files changed
+116

No files matched your search

+1
@@ -13,6 +13,7 @@ Diese Seiten erklären den Betrieb und die Bedienung der Match-Verwaltung für C
- [Turnierregeln](Turnierregeln) – Serverwerte nach FACEIT- und ESL-Richtwerten - [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, Rundenrücksprung
- [Docker-Betrieb](Docker-Betrieb) – CS2-Server als Container auf einem Docker-Host - [Docker-Betrieb](Docker-Betrieb) – CS2-Server als Container auf einem Docker-Host
- [Mehrere Docker-Hosts](Mehrere-Docker-Hosts) – Gameserver auf mehrere Rechner verteilen
- [Reverse-Proxy](Reverse-Proxy) – Webseite per HTTPS unter eigener Domain - [Reverse-Proxy](Reverse-Proxy) – Webseite per HTTPS unter eigener Domain
## Stand ## Stand
+115
@@ -0,0 +1,115 @@
# 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 freier Platz unter `/var/lib/docker`.
- Die Ports 27100 bis 27139 (TCP und UDP) sind auf jedem Rechner frei.
## 2. SSH-Schlüssel anlegen
Auf dem Windows-PC, in Git Bash:
```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):
```bash
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:
```bash
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
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` |
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`) erscheint oben die Karte **Docker-Hosts**. Pro Host stehen dort der Name, die Adresse, die belegten und freien Plätze und die laufenden Matches.
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. 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. |
| Ein Match hängt auf „Server wird angefordert“ | Die Startzeit läuft bis zu 20 Minuten. Danach „Server neu starten / wiederholen“ im Admin-Bereich. |
## 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.