From 7bf847d31cc7ba7ba9588ac0f84f67530cddbef2 Mon Sep 17 00:00:00 2001 From: scriptos Date: Thu, 26 Mar 2026 21:09:23 +0100 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20IP-Watcher=20=E2=80=93=20automatisc?= =?UTF-8?q?her=20Neustart=20bei=20IP-Wechsel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 6 ++++++ assets/bin/WatchPublicIP.sh | 31 +++++++++++++++++++++++++++++++ docker-compose.yml | 16 ++++++++++++++++ docs/README.md | 2 ++ docs/ip-watcher.md | 36 ++++++++++++++++++++++++++++++++++++ docs/umgebungsvariablen.md | 8 ++++++++ 6 files changed, 99 insertions(+) create mode 100644 assets/bin/WatchPublicIP.sh create mode 100644 docs/ip-watcher.md 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 | -- 2.49.1 From d77961818a5f21713b6955526271b9bed9e95459 Mon Sep 17 00:00:00 2001 From: scriptos Date: Thu, 26 Mar 2026 21:21:22 +0100 Subject: [PATCH 2/3] =?UTF-8?q?ci:=20Gitea=20Action=20f=C3=BCr=20automatis?= =?UTF-8?q?chen=20Docker-Build=20und=20Registry-Push=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/docker-publish.yml | 41 +++++++++++++++++++++++++++++ docs/README.md | 3 +++ docs/schnellstart.md | 4 +-- 3 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 .gitea/workflows/docker-publish.yml diff --git a/.gitea/workflows/docker-publish.yml b/.gitea/workflows/docker-publish.yml new file mode 100644 index 0000000..31673ab --- /dev/null +++ b/.gitea/workflows/docker-publish.yml @@ -0,0 +1,41 @@ +name: Build & Push Docker Image + +# Wird ausgeloest, wenn ein Tag wie "v1.3.0" gepusht wird +on: + push: + tags: + - 'v*' + +jobs: + build-and-push: + runs-on: ubuntu-latest + + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + # "v1.3.0" -> "1.3.0" (fuehrendes "v" entfernen) + - name: Version aus Tag extrahieren + id: version + run: | + VERSION=$(echo "${{ gitea.ref_name }}" | sed 's/^v//') + echo "VERSION=$VERSION" >> $GITHUB_OUTPUT + + - name: Bei Gitea Registry einloggen + run: | + echo "${{ secrets.REGISTRY_TOKEN }}" | \ + docker login git.techniverse.net \ + --username "${{ secrets.REGISTRY_USER }}" \ + --password-stdin + + - name: Docker Image bauen + run: | + docker build \ + -t git.techniverse.net/scriptos/trackmania-server:${{ steps.version.outputs.VERSION }} \ + -t git.techniverse.net/scriptos/trackmania-server:latest \ + . + + - name: Docker Image pushen + run: | + docker push git.techniverse.net/scriptos/trackmania-server:${{ steps.version.outputs.VERSION }} + docker push git.techniverse.net/scriptos/trackmania-server:latest diff --git a/docs/README.md b/docs/README.md index ccba1eb..5bf8362 100644 --- a/docs/README.md +++ b/docs/README.md @@ -47,6 +47,9 @@ │ │ └── teamspeak3.xml # TeamSpeak3-Konfiguration fuer XAseco │ └── db/ │ └── init-xaseco-db.sh # MariaDB Init-Script fuer XAseco-DB +├── .gitea/ +│ └── workflows/ +│ └── docker-publish.yml # CI/CD: Docker Image Build & Push bei neuem Release-Tag ├── docs/ # Dokumentation ├── docker-compose.yml # Docker Compose Konfiguration ├── Dockerfile # Docker Build-Definition diff --git a/docs/schnellstart.md b/docs/schnellstart.md index 02ae590..409f898 100644 --- a/docs/schnellstart.md +++ b/docs/schnellstart.md @@ -43,11 +43,9 @@ Die Konfiguration erfolgt über die `.env`-Datei, die automatisch eingelesen wir Alternativ kannst du das Image auch selbst bauen: ```bash -docker build -t tmserver:latest -t tmserver:1.3.0 . +docker build -t tmserver:latest . ``` -Damit wird das Image mit zwei Tags erstellt: `tmserver:latest` und `tmserver:1.3.0`. - Anschließend den Server starten: ```bash -- 2.49.1 From 5601b1469dc7ddc90c3812393155b624c994cd0c Mon Sep 17 00:00:00 2001 From: scriptos Date: Thu, 26 Mar 2026 21:24:26 +0100 Subject: [PATCH 3/3] Release: Docker Image Version 1.3.1 gepusht --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index ae34f6f..dac882e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,6 @@ services: tmserver: - image: git.techniverse.net/scriptos/trackmania-server:1.3.0 + image: git.techniverse.net/scriptos/trackmania-server:1.3.1 build: context: . container_name: tmserver -- 2.49.1