Einige Anpassungen und Verbesserungen
This commit is contained in:
30
Dockerfile
30
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
|
||||
|
||||
@@ -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..."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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).
|
||||
|
||||
Reference in New Issue
Block a user