Einige Anpassungen und Verbesserungen

This commit is contained in:
2026-03-19 22:04:43 +01:00
parent 67b0fafeea
commit c1c8ce5b3d
6 changed files with 130 additions and 17 deletions

View File

@@ -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

View File

@@ -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" <<EOPHP
<?php
class ServerConfig {
public static \$SERVERS = array(
'${SAFE_NAME}' => 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..."

View File

@@ -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

View File

@@ -27,3 +27,40 @@ Die Server-Verwaltungsoberfläche basiert auf [AdminServ](https://github.com/Chr
Die Admin-Stufen können unter `http://<host-server-des-containers>/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
```

View File

@@ -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

View File

@@ -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://<host-ip>` 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).