diff --git a/Home.md b/Home.md index 402cd18..e4cca56 100644 --- a/Home.md +++ b/Home.md @@ -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 - [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 +- [Mehrere Docker-Hosts](Mehrere-Docker-Hosts) – Gameserver auf mehrere Rechner verteilen - [Reverse-Proxy](Reverse-Proxy) – Webseite per HTTPS unter eigener Domain ## Stand diff --git a/Mehrere-Docker-Hosts.md b/Mehrere-Docker-Hosts.md new file mode 100644 index 0000000..45df3c3 --- /dev/null +++ b/Mehrere-Docker-Hosts.md @@ -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 :`). + +## 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.