diff --git a/.env.example b/.env.example index f1c55f3..4f075dc 100644 --- a/.env.example +++ b/.env.example @@ -117,3 +117,9 @@ XASECO_DB_PASSWORD="4KpL8mWnR3xYvBq" # Dedimania-Nation (3-Zeichen IOC-Code, z.B. DEU, AUT, CHE) # Server-Login und -Passwort werden automatisch aus SERVER_LOGIN / SERVER_LOGIN_PASSWORD übernommen. XASECO_DEDIMANIA_NATION=DEU + +# --- IP-Watcher --- +# Der IP-Watcher überwacht die ausgehende öffentliche IP des Containers und startet tmserver +# automatisch neu, wenn sich die IP ändert – damit er sich beim Masterserver neu registriert. +# Intervall in Sekunden, in dem die IP geprüft wird (Standard: 300 = 5 Minuten). +IP_WATCHER_INTERVAL=300 diff --git a/assets/bin/WatchPublicIP.sh b/assets/bin/WatchPublicIP.sh new file mode 100644 index 0000000..689dc27 --- /dev/null +++ b/assets/bin/WatchPublicIP.sh @@ -0,0 +1,31 @@ +#!/bin/sh +# Überwacht die ausgehende öffentliche IP des Containers und startet tmserver neu, +# wenn sich die IP ändert, damit er sich mit der neuen IP beim Masterserver registriert. + +set -e +apk add --no-cache curl docker-cli > /dev/null 2>&1 +set +e + +INTERVAL="${IP_WATCHER_INTERVAL:-300}" +LAST_IP="" + +echo "[ip-watcher] Gestartet. Prüfintervall: ${INTERVAL}s" + +while true; do + CURRENT_IP=$(curl -s --max-time 10 https://api.ipify.org 2>/dev/null) + + if [ -z "$CURRENT_IP" ]; then + echo "[ip-watcher] Öffentliche IP konnte nicht ermittelt werden. Neuer Versuch in ${INTERVAL}s." + elif [ "$CURRENT_IP" != "$LAST_IP" ]; then + if [ -n "$LAST_IP" ]; then + echo "[ip-watcher] IP geändert: ${LAST_IP} -> ${CURRENT_IP}. Starte tmserver neu..." + docker restart tmserver + echo "[ip-watcher] tmserver erfolgreich neu gestartet." + else + echo "[ip-watcher] Initiale öffentliche IP: ${CURRENT_IP}" + fi + LAST_IP="$CURRENT_IP" + fi + + sleep "$INTERVAL" +done diff --git a/docker-compose.yml b/docker-compose.yml index c0fdd9c..ae34f6f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -53,6 +53,22 @@ services: tmserver_net: ipv4_address: 172.20.60.11 + ip-watcher: + image: alpine:3.21 + container_name: tmserver-ip-watcher + restart: unless-stopped + depends_on: + - tmserver + command: ["/bin/sh", "/opt/WatchPublicIP.sh"] + env_file: + - .env + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - ./assets/bin/WatchPublicIP.sh:/opt/WatchPublicIP.sh:ro + networks: + tmserver_net: + ipv4_address: 172.20.60.12 + networks: tmserver_net: name: tmserver.dockernetwork.local diff --git a/docs/README.md b/docs/README.md index 6b9b40d..ccba1eb 100644 --- a/docs/README.md +++ b/docs/README.md @@ -15,6 +15,7 @@ | [AdminServ](adminserv.md) | Einrichtung der Server-Verwaltungsoberfläche | | [RemoteCP](remotecp.md) | Alternative Server-Verwaltungsoberfläche (inkl. Mods/Skins) | | [XAseco](xaseco.md) | Server-Controller für Rekorde, Karma und Jukebox | +| [IP-Watcher](ip-watcher.md) | Automatischer Neustart bei IP-Wechsel | | [Ports](ports.md) | Freigegebene Ports und deren Verwendung | ## Projektstruktur @@ -26,6 +27,7 @@ │ │ ├── remoteCP_v4.0.3.5.zip # RemoteCP Web-UI │ │ ├── RunTrackmaniaServer.sh # Container-Startscript │ │ ├── TrackmaniaServer_2011-02-21.zip # Trackmania Server Binary +│ │ ├── WatchPublicIP.sh # IP-Watcher-Script │ │ └── xaseco_v1.16.zip # XAseco Server-Controller │ ├── config/ │ │ ├── adminserv/ # AdminServ-Konfiguration diff --git a/docs/ip-watcher.md b/docs/ip-watcher.md new file mode 100644 index 0000000..3f35820 --- /dev/null +++ b/docs/ip-watcher.md @@ -0,0 +1,36 @@ +# IP-Watcher + +Der IP-Watcher ist ein Service (`tmserver-ip-watcher`), der automatisch die öffentliche IP des Hosts überwacht und den `tmserver`-Container neu startet, sobald sich die IP ändert. + +## Hintergrund + +Trackmania-Server registrieren sich beim Start mit ihrer aktuellen öffentlichen IP beim Nadeo-Masterserver. Bei dynamischen IP-Adressen kann sich diese IP jederzeit ändern – der Server bleibt dann unter der veralteten IP registriert und ist für Spieler nicht mehr erreichbar. + +Der IP-Watcher erkennt solche IP-Wechsel automatisch und startet `tmserver` neu, sodass er sich mit der neuen IP beim Masterserver neu registriert. + +## Funktion + +Der Watcher läuft als eigener Docker-Container und: + +1. Prüft regelmäßig die ausgehende öffentliche IP (identisch mit der IP, die auch `tmserver` nach außen verwendet) +2. Erkennt Abweichungen zur zuletzt bekannten IP +3. Startet `tmserver` über den Docker-Socket automatisch neu + +## Konfiguration + +| Variable | Beschreibung | Standard | +|----------|-------------|----------| +| `IP_WATCHER_INTERVAL` | Prüfintervall in Sekunden | `300` (5 Minuten) | + +## Deaktivieren + +Um den IP-Watcher zu deaktivieren, kommentiere den `ip-watcher`-Service in der `docker-compose.yml` aus: + +```yaml +# ip-watcher: +# ... +``` + +## Sicherheitshinweis + +Der IP-Watcher benötigt Zugriff auf den Docker-Socket (`/var/run/docker.sock`), um den `tmserver`-Container neu starten zu können. Dieser Zugriff ermöglicht volle Kontrolle über alle Docker-Container und -Images auf dem Host. Stelle sicher, dass der Host ausreichend abgesichert ist und der Zugriff auf den Docker-Socket auf vertrauenswürdige Dienste beschränkt bleibt. diff --git a/docs/umgebungsvariablen.md b/docs/umgebungsvariablen.md index fb499eb..5f4f1e0 100644 --- a/docs/umgebungsvariablen.md +++ b/docs/umgebungsvariablen.md @@ -188,6 +188,14 @@ XAseco ist ein Server-Controller für Rekorde, Karma, Jukebox und mehr. Siehe [X > **Hinweis:** Die Server-Zugangsdaten (`SERVER_SA_PASSWORD`, `SERVER_XMLRPC_PORT`) und Dedimania-Daten (`SERVER_LOGIN`, `SERVER_LOGIN_PASSWORD`) werden automatisch aus der bestehenden Konfiguration übernommen. +## IP-Watcher + +| Variable | Beschreibung | Standard | +|----------|-------------|----------| +| `IP_WATCHER_INTERVAL` | Prüfintervall in Sekunden, in dem die öffentliche IP geprüft wird | `300` | + +> **Hinweis:** Der IP-Watcher verwendet den Docker-Socket (`/var/run/docker.sock`), um `tmserver` bei einer IP-Änderung automatisch neu zu starten. Weitere Details unter [IP-Watcher](ip-watcher.md). + ## Debugging | Variable | Beschreibung | Standard |