Files
Cs2-Mapveto/docs/container.md
T
SPP UserandClaude Haiku 5.5 413df03237 Stack unabhängig vom Host: deploy/compose.yml mit .env
CS2 Mapveto startet jetzt auf jedem Docker-Host (Linux) mit
'docker compose --env-file deploy/.env -f deploy/compose.yml up -d'.
Die Adresse kommt aus HOST_IP, nichts ist mehr fest eingetragen.
Anleitung für einen neuen Server: Image laden oder bauen, Spieldateien
kopieren oder neu laden, konfigurieren, starten.

Geprüft auf amp-cluster mit Demo-Adapter: Stack startet, Webseite
antwortet, Stack wieder entfernt, Spieldateien unverändert.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
2026-10-25 22:46:51 +01:00

6.4 KiB
Raw Blame History

CS2 Mapveto als Container betreiben

CS2 Mapveto läuft als ein Container: Webseite, Backend, Datenbank (SQLite) und ein Docker-Client. Er steht auf demselben Docker-Host wie die CS2-Server und startet pro Match über /var/run/docker.sock einen eigenen CS2-Container. Der Host kann jeder Linux-Rechner mit Docker sein, ein AMP-Server ist nicht nötig.

Docker-Host (beliebig, Linux, Adresse z. B. 192.168.178.111)
├── cs2-mapveto            ← diese Anwendung, Port 3000
├── cs2mv-<match>          ← CS2-Server pro Match (startet/entfernt CS2 Mapveto)
├── Volume cs2-mapveto-gamefiles   CS2-Spieldateien (~73 GB)
└── Volume cs2-mapveto-data        Datenbank der Anwendung

Nur eine Instanz pro Docker-Host. Läuft CS2 Mapveto zusätzlich anderswo mit demselben Host, streiten sich beide um Ports und Containernamen. Die andere Instanz vorher beenden.


Was du brauchst

Docker + Compose docker compose version muss funktionieren
Speicher ~80 GB frei für Spieldateien, Images und Updates
CPU / RAM pro gleichzeitigem Match etwa 1–2 Kerne und 2–3 GB RAM
Netz Ports TCP/UDP 27100–27139 (Spiel, RCON) und UDP 27101… (CSTV) sowie TCP 3000 im LAN freigeben
Dateien das Image cs2-mapveto (siehe Schritt 1) und die CS2-Spieldateien (Schritt 2)

Schritt 1: Image auf den neuen Host bringen

Du hast zwei Wege.

Weg A: Image-Datei kopieren (ohne Build, schnell)

Auf dem Rechner, auf dem das Image gebaut wurde, liegt die Datei dist/cs2-mapveto-image.tar (294 MB). Sie auf den neuen Host kopieren und laden:

scp cs2-mapveto-image.tar USER@NEUERHOST:/tmp/
ssh USER@NEUERHOST "docker load -i /tmp/cs2-mapveto-image.tar && rm /tmp/cs2-mapveto-image.tar"

Prüfen mit docker image ls cs2-mapveto.

Weg B: aus dem Repository bauen

Auf dem neuen Host ist Git nötig. Das Repository liegt auf dem Gitea (http://192.168.178.45:3002/marcel/Cs2-Mapveto.git):

git clone http://192.168.178.45:3002/marcel/Cs2-Mapveto.git
cd Cs2-Mapveto
docker build -t cs2-mapveto:latest .

Beim Bauen laufen alle Tests mit. Schlägt einer fehl, bricht der Build ab.


Schritt 2: CS2-Spieldateien auf den neuen Host bringen

Das Volume cs2-mapveto-gamefiles muss vor dem ersten Match vorhanden und befüllt sein. Sonst lädt jeder Match-Start die ~60 GB neu. Zwei Wege:

a) Vom bisherigen Host kopieren (im LAN, kein Internet nötig, dauert je nach Netz Stunden):

ssh ALTERHOST "docker run --rm -v cs2-mapveto-gamefiles:/from alpine tar -C /from -cf - ." \
  | ssh NEUERHOST "docker volume create cs2-mapveto-gamefiles >/dev/null && docker run --rm -i -v cs2-mapveto-gamefiles:/to alpine tar -C /to -xf -"

b) Neu laden (braucht Internet, ~60 GB). Der Container lädt die Dateien und stoppt danach von selbst:

docker volume create cs2-mapveto-gamefiles
docker run -d --name cs2-updater -e STEAMAPPVALIDATE=0 -e CS2_RCONPW=updater1 -v cs2-mapveto-gamefiles:/home/steam/cs2-dedicated/ joedwards32/cs2:latest
docker logs -f cs2-updater      # warten auf "Success! App '730' fully installed"
docker rm -f cs2-updater

Danach liegen unter docker system df -v rund 73 GB im Volume.

Das CS2-Image selbst (joedwards32/cs2:latest, ~3,7 GB) holt Docker beim ersten Match automatisch aus dem Docker Hub. Ohne Internet muss es vorher ebenfalls geladen werden (docker save/docker load wie bei Schritt 1).


Schritt 3: Konfiguration

Im Ordner deploy/ die Vorlage kopieren und anpassen:

cp deploy/.env.example deploy/.env

Das Wichtigste:

Variable Bedeutung
HOST_IP Pflicht. IP des neuen Hosts im LAN. Spieler verbinden sich dorthin, Einladungslinks zeigen darauf
WEB_PORT Port der Webseite (Standard 3000)
SERVER_ADAPTER docker für echte Server, demo nur zum Ausprobieren ohne CS2
CS2_GSLT leer = LAN-Modus (sv_lan 1), kein Token nötig
CS2_PORT_RANGE_START / _END Ports für Match-Server, zwei pro Match
CREATE_MATCH_PASSWORD Passwort zum Anlegen von Matches (empfohlen)
STREAM_KEY Schlüssel für /stream?key=… (optional)

Passwörter nur aus Buchstaben und Ziffern wählen.


Schritt 4: Starten

docker compose --env-file deploy/.env -f deploy/compose.yml up -d

Prüfen:

docker compose --env-file deploy/.env -f deploy/compose.yml ps     # Status "healthy" nach ~20 s
curl http://HOST_IP:3000/api/config                                 # JSON mit "adapter": "docker"

Danach ist die Webseite unter http://HOST_IP:3000 erreichbar, die Stream-Übersicht unter /stream.

Stoppen und neu starten:

docker compose --env-file deploy/.env -f deploy/compose.yml down
docker compose --env-file deploy/.env -f deploy/compose.yml up -d

Die Datenbank (Volume cs2-mapveto-data) bleibt dabei erhalten.

Mit Portainer statt Kommandozeile

Portainer → Stacks → Add stack → Web editor: den Inhalt von deploy/compose.yml einfügen. Die Variablen aus deploy/.env als Environment variables eintragen (mindestens HOST_IP). Danach Deploy the stack.


Aktualisieren

  1. Neues Image holen (Weg A oder B aus Schritt 1).
  2. docker compose … up -d erneut ausführen. Compose ersetzt den Container, die Datenbank bleibt.

Sicherheit

Der Container hat über /var/run/docker.sock volle Kontrolle über Docker auf dem Host. Das ist nötig, um Match-Container zu starten, entspricht aber Root-Rechten auf dem Host. Deshalb:

  • Port 3000 nur im LAN anbieten, nicht ins Internet weiterleiten.
  • CREATE_MATCH_PASSWORD setzen, wenn nicht jeder im LAN Matches anlegen soll.
  • deploy/.env enthält Passwörter. Nicht ins Repository einchecken (ist in .gitignore).

Fehlersuche

Symptom Ursache / Lösung
HOST_IP in deploy/.env eintragen beim Start deploy/.env fehlt oder HOST_IP ist leer
„Server wird angefordert“ bleibt stehen Log des Containers prüfen: docker logs cs2-mapveto
permission denied … docker.sock im Log Rootless-Docker oder anderer Socket-Pfad. Dann den Pfad im volumes:-Eintrag anpassen
Match-Server startet, Spieler finden ihn nicht Ports 27100–27139 im Host-Netz freigeben; HOST_IP muss die LAN-Adresse des Hosts sein
Keine Live-Ergebnisse HOST_IP falsch oder Port 3000 vom Match-Server aus nicht erreichbar
Ein Match-Start dauert sehr lange Spieldateien fehlen im Volume und werden neu geladen (Schritt 2)