diff --git a/Dockerfile b/Dockerfile index 84e465e..b382379 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:bookworm-slim +FROM debian:bullseye-slim RUN mkdir /opt/tmserver @@ -22,6 +22,17 @@ RUN unzip /opt/tmserver/TrackmaniaServer_2011-02-21.zip -d /opt/tmserver \ COPY assets/config/dedicated_cfg.txt /opt/tmserver/GameData/Config/dedicated_cfg.txt COPY assets/config/custom_game_settings.txt /opt/tmserver/GameData/Tracks/MatchSettings/ +# Config-Verzeichnis rekursiv beschreibbar machen (Server benoetigt Schreibzugriff) +RUN chmod -R 777 /opt/tmserver/GameData/Config/ + +# Tracks-Verzeichnis fuer AdminServ beschreibbar machen (Maps-Upload/Download) +RUN chown -R www-data:www-data /opt/tmserver/GameData/Tracks/ \ + && chmod -R 755 /opt/tmserver/GameData/Tracks/ + +# AdminServ-Verzeichnisse im Config-Ordner anlegen +RUN mkdir -p /opt/tmserver/GameData/Config/AdminServ/ServerOptions \ + && chown -R www-data:www-data /opt/tmserver/GameData/Config/AdminServ + # Gesamtes GameData als Default-Template sichern (wird beim ersten Start ins Volume kopiert) RUN cp -r /opt/tmserver/GameData /opt/tmserver/default-gamedata @@ -32,16 +43,16 @@ RUN sed -i 's/\r$//' /opt/tmserver/RunTrackmaniaServer.sh \ COPY assets/bin/AdminServ_v2.1.1.zip /var/www/html RUN unzip /var/www/html/AdminServ_v2.1.1.zip -d /var/www/html \ && rm -f /var/www/html/AdminServ_v2.1.1.zip \ - && chmod -R 777 /var/www/html/ \ && rm -f /var/www/html/index.html \ && mkdir -p /var/www/html/logs \ - && chmod 777 /var/www/html/logs + && chmod -R 777 /var/www/html/logs \ + && chmod 666 /var/www/html/config/adminlevel.cfg.php \ + && chmod 666 /var/www/html/config/servers.cfg.php \ + && chmod 666 /var/www/html/config/adminserv.cfg.php \ + && chown -R www-data:www-data /var/www/html/ -# PHP 8 Kompatibilitaets-Patches fuer AdminServ -# stristr() akzeptiert seit PHP 8 keine Arrays mehr – is_string()-Check hinzufuegen -RUN sed -i \ - 's|if(stristr($value, "../"))|if(is_string($value) \&\& stristr($value, "../"))|g' \ - /var/www/html/index.php +# AdminServ-Dateien als Default-Template sichern (wird beim ersten Start ins Volume kopiert) +RUN cp -r /var/www/html /opt/tmserver/default-adminserv # PHP-Debug-Konfiguration: wird zur Laufzeit vom Startup-Script gesetzt # (kein Rebuild noetig – nur Container neustarten) @@ -72,8 +83,9 @@ ENV FORCE_CONFIG_UPDATE=false # Debugging ENV PHP_DISPLAY_ERRORS=false -# Volume fuer persistente GameData (Config, Tracks, Skins, Scores, etc.) +# Volumes fuer persistente Daten VOLUME /opt/tmserver/GameData +VOLUME /var/www/html EXPOSE 5000/tcp EXPOSE 2350/tcp diff --git a/assets/bin/RunTrackmaniaServer.sh b/assets/bin/RunTrackmaniaServer.sh index f9fcc30..6d963db 100644 --- a/assets/bin/RunTrackmaniaServer.sh +++ b/assets/bin/RunTrackmaniaServer.sh @@ -24,6 +24,58 @@ error_log = /var/log/php_errors.log EOF fi +# ============================================================ +# AdminServ: First-Run-Logik +# ============================================================ +# Beim ersten Start (leeres Volume) werden die AdminServ-Dateien +# aus dem Default-Template ins Volume kopiert. +# Bei weiteren Starts bleiben vorhandene Daten (Passwort, +# Server-Eintraege, etc.) erhalten. +# ============================================================ + +ADMINSERV_DIR="/var/www/html" +DEFAULT_ADMINSERV="/opt/tmserver/default-adminserv" + +if [ ! -f "$ADMINSERV_DIR/index.php" ]; then + echo "==> Erster Start erkannt: Kopiere AdminServ-Dateien ins Volume..." + cp -r "$DEFAULT_ADMINSERV"/* "$ADMINSERV_DIR/" + chmod -R 777 "$ADMINSERV_DIR/logs/" + chmod 666 "$ADMINSERV_DIR/config/adminlevel.cfg.php" + chmod 666 "$ADMINSERV_DIR/config/servers.cfg.php" + chmod 666 "$ADMINSERV_DIR/config/adminserv.cfg.php" + chown -R www-data:www-data "$ADMINSERV_DIR/" + + # AdminServ-Server-Eintrag automatisch konfigurieren + XMLRPC_PORT="${SERVER_XMLRPC_PORT:-5000}" + # Servernamen fuer PHP-Single-Quotes escapen + SAFE_NAME=$(printf '%s' "${SERVER_NAME:-Trackmania Server}" | sed "s/'/\\\\'/g") + # ds_pw: Passwort fuer DisplayServ (Serverstatusanzeige auf der Login-Seite) + DS_PW=$(printf '%s' "${SERVER_USER_PASSWORD:-User}" | sed "s/'/\\\\'/g") + cat > "$ADMINSERV_DIR/config/servers.cfg.php" < array( + 'address' => '127.0.0.1', + 'port' => ${XMLRPC_PORT}, + 'mapsbasepath' => '', + 'matchsettings' => 'MatchSettings/', + 'adminlevel' => array('SuperAdmin' => 'all', 'Admin' => 'all', 'User' => 'all'), + 'ds_pw' => '${DS_PW}' + ), + ); +} +?> +EOPHP + chmod 666 "$ADMINSERV_DIR/config/servers.cfg.php" + chown www-data:www-data "$ADMINSERV_DIR/config/servers.cfg.php" + echo " AdminServ-Server-Eintrag automatisch konfiguriert (Port: ${XMLRPC_PORT})." + + echo " AdminServ-Dateien erfolgreich kopiert." +else + echo "==> Vorhandene AdminServ-Daten gefunden. Keine Aenderungen." +fi + echo "Starting apache server" service apache2 start @@ -47,6 +99,9 @@ FORCE_CONFIG_UPDATE="${FORCE_CONFIG_UPDATE:-false}" if [ ! -f "$CONFIG" ]; then echo "==> Erster Start erkannt: Kopiere Default-GameData ins Volume..." cp -r "$DEFAULT_GAMEDATA"/* "$GAMEDATA_DIR/" + chmod -R 777 "$GAMEDATA_DIR/Config/" + mkdir -p "$GAMEDATA_DIR/Config/AdminServ/ServerOptions" + chown -R www-data:www-data "$GAMEDATA_DIR/Config/AdminServ" APPLY_ENV=true elif [ "$FORCE_CONFIG_UPDATE" = "true" ]; then echo "==> FORCE_CONFIG_UPDATE ist aktiv: Umgebungsvariablen werden erneut angewendet..." diff --git a/docker-compose.yml b/docker-compose.yml index 52bdc7f..141bb4d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,15 +5,16 @@ services: container_name: tmserver restart: unless-stopped ports: - - "${SERVER_PORT:-2350}:2350/tcp" - - "${SERVER_PORT:-2350}:2350/udp" - - "${SERVER_P2P_PORT:-3450}:3450/tcp" - - "${SERVER_XMLRPC_PORT:-5000}:5000/tcp" + - "${SERVER_PORT:-2350}:${SERVER_PORT:-2350}/tcp" + - "${SERVER_PORT:-2350}:${SERVER_PORT:-2350}/udp" + - "${SERVER_P2P_PORT:-3450}:${SERVER_P2P_PORT:-3450}/tcp" + - "${SERVER_XMLRPC_PORT:-5000}:${SERVER_XMLRPC_PORT:-5000}/tcp" - "80:80/tcp" env_file: - .env volumes: - ./data/GameData:/opt/tmserver/GameData + - ./data/AdminServ:/var/www/html networks: tmserver_net: ipv4_address: 172.20.60.10 diff --git a/docs/adminserv.md b/docs/adminserv.md index fd4cc8c..0fd07bb 100644 --- a/docs/adminserv.md +++ b/docs/adminserv.md @@ -27,3 +27,40 @@ Die Server-Verwaltungsoberfläche basiert auf [AdminServ](https://github.com/Chr Die Admin-Stufen können unter `http:///config` geändert werden. > **Hinweis:** Es wird empfohlen, die Standard-Passwörter über die `.env`-Datei (`SERVER_SA_PASSWORD`, `SERVER_ADM_PASSWORD`) zu ändern. Siehe [Umgebungsvariablen](umgebungsvariablen.md). + +## Persistente Speicherung + +Alle AdminServ-Daten (Passwort, Server-Einträge, Konfiguration, Logs) werden über einen Bind-Mount (`./data/AdminServ`) persistent auf dem Host gespeichert. Beim ersten Start werden die Dateien automatisch aus dem Image ins Volume kopiert. + +| Host-Pfad | Container-Pfad | Beschreibung | +|-----------|----------------|-------------| +| `./data/AdminServ` | `/var/www/html` | Gesamte AdminServ-Installation | + +## Fehlerbehebung + +### Login funktioniert nicht nach dem Anlegen eines Servers + +Falls der Login nicht funktioniert oder ein Authentifizierungsfehler angezeigt wird, können die PHP-Logs Aufschluss geben: + +1. In der `.env`-Datei `PHP_DISPLAY_ERRORS=true` setzen +2. Container neu starten: `docker compose up -d` +3. AdminServ im Browser öffnen und den Fehler reproduzieren +4. Die PHP-Fehlermeldung wird direkt auf der Seite angezeigt + +Alternativ können die PHP-Logs eingesehen werden: + +```bash +docker exec tmserver cat /var/log/php_errors.log +``` + +### AdminServ komplett zurücksetzen + +Falls AdminServ in einen inkonsistenten Zustand geraten ist: + +```bash +# AdminServ-Daten auf dem Host löschen +rm -rf ./data/AdminServ/* + +# Container neu starten – AdminServ wird frisch initialisiert +docker compose up -d +``` diff --git a/docs/konfiguration.md b/docs/konfiguration.md index 2940270..30e887e 100644 --- a/docs/konfiguration.md +++ b/docs/konfiguration.md @@ -12,11 +12,12 @@ Das gesamte **GameData-Verzeichnis** wird über ein Bind-Mount (`./data/GameData - Manuelle Änderungen gehen nicht verloren, auch wenn der Container neu erstellt wird - Dateien können direkt auf dem Host bearbeitet werden -### Volume-Pfad +### Volume-Pfade | Host-Pfad | Container-Pfad | Beschreibung | |-----------|----------------|-------------| | `./data/GameData` | `/opt/tmserver/GameData` | Gesamtes GameData-Verzeichnis | +| `./data/AdminServ` | `/var/www/html` | AdminServ-Daten (Passwort, Server-Einträge, Logs) | ### Enthaltene Unterordner diff --git a/docs/schnellstart.md b/docs/schnellstart.md index 1b39711..00bfc88 100644 --- a/docs/schnellstart.md +++ b/docs/schnellstart.md @@ -45,8 +45,7 @@ docker run -d \ -p 2350:2350/udp \ -p 3450:3450/tcp \ -p 80:80/tcp \ - -v ./data/GameData:/opt/tmserver/GameData \ - --name tmserver tmserver:latest + -v ./data/GameData:/opt/tmserver/GameData \ -v ./data/AdminServ:/var/www/html \ --name tmserver tmserver:latest ``` ### LAN-Modus (docker run) @@ -62,6 +61,7 @@ docker run -d \ -p 3450:3450/tcp \ -p 80:80/tcp \ -v ./data/GameData:/opt/tmserver/GameData \ + -v ./data/AdminServ:/var/www/html \ --name tmserver tmserver:latest ``` @@ -71,6 +71,13 @@ Die Verwaltungsoberfläche ist unter `http://` erreichbar. Weitere Deta ## Persistente Konfiguration -Die gesamten Server-Daten (`GameData/`) werden über einen Bind-Mount (`./data/GameData`) persistent auf dem Host gespeichert. Beim ersten Start wird das gesamte GameData-Verzeichnis automatisch aus dem Image erzeugt und die Umgebungsvariablen aus der `.env`-Datei angewendet. Bei weiteren Starts bleibt alles erhalten. +Alle Server- und AdminServ-Daten werden über Bind-Mounts persistent auf dem Host gespeichert: + +| Host-Pfad | Container-Pfad | Beschreibung | +|-----------|----------------|-------------| +| `./data/GameData` | `/opt/tmserver/GameData` | TM-Server-Daten (Config, Tracks, Skins, etc.) | +| `./data/AdminServ` | `/var/www/html` | AdminServ-Daten (Passwort, Server-Einträge, Logs) | + +Beim ersten Start werden die Verzeichnisse automatisch aus dem Image erzeugt und die Umgebungsvariablen aus der `.env`-Datei angewendet. Bei weiteren Starts bleibt alles erhalten. Weitere Details unter [Konfiguration](konfiguration.md).