mirror of
https://git.techniverse.net/scriptos/tmserver-docker.git
synced 2026-06-18 22:09:21 +00:00
Einige Anpassungen und Verbesserungen
This commit is contained in:
+21
-9
@@ -1,4 +1,4 @@
|
|||||||
FROM debian:bookworm-slim
|
FROM debian:bullseye-slim
|
||||||
|
|
||||||
RUN mkdir /opt/tmserver
|
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/dedicated_cfg.txt /opt/tmserver/GameData/Config/dedicated_cfg.txt
|
||||||
COPY assets/config/custom_game_settings.txt /opt/tmserver/GameData/Tracks/MatchSettings/
|
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)
|
# Gesamtes GameData als Default-Template sichern (wird beim ersten Start ins Volume kopiert)
|
||||||
RUN cp -r /opt/tmserver/GameData /opt/tmserver/default-gamedata
|
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
|
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 \
|
RUN unzip /var/www/html/AdminServ_v2.1.1.zip -d /var/www/html \
|
||||||
&& rm -f /var/www/html/AdminServ_v2.1.1.zip \
|
&& rm -f /var/www/html/AdminServ_v2.1.1.zip \
|
||||||
&& chmod -R 777 /var/www/html/ \
|
|
||||||
&& rm -f /var/www/html/index.html \
|
&& rm -f /var/www/html/index.html \
|
||||||
&& mkdir -p /var/www/html/logs \
|
&& 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
|
# AdminServ-Dateien als Default-Template sichern (wird beim ersten Start ins Volume kopiert)
|
||||||
# stristr() akzeptiert seit PHP 8 keine Arrays mehr – is_string()-Check hinzufuegen
|
RUN cp -r /var/www/html /opt/tmserver/default-adminserv
|
||||||
RUN sed -i \
|
|
||||||
's|if(stristr($value, "../"))|if(is_string($value) \&\& stristr($value, "../"))|g' \
|
|
||||||
/var/www/html/index.php
|
|
||||||
|
|
||||||
# PHP-Debug-Konfiguration: wird zur Laufzeit vom Startup-Script gesetzt
|
# PHP-Debug-Konfiguration: wird zur Laufzeit vom Startup-Script gesetzt
|
||||||
# (kein Rebuild noetig – nur Container neustarten)
|
# (kein Rebuild noetig – nur Container neustarten)
|
||||||
@@ -72,8 +83,9 @@ ENV FORCE_CONFIG_UPDATE=false
|
|||||||
# Debugging
|
# Debugging
|
||||||
ENV PHP_DISPLAY_ERRORS=false
|
ENV PHP_DISPLAY_ERRORS=false
|
||||||
|
|
||||||
# Volume fuer persistente GameData (Config, Tracks, Skins, Scores, etc.)
|
# Volumes fuer persistente Daten
|
||||||
VOLUME /opt/tmserver/GameData
|
VOLUME /opt/tmserver/GameData
|
||||||
|
VOLUME /var/www/html
|
||||||
|
|
||||||
EXPOSE 5000/tcp
|
EXPOSE 5000/tcp
|
||||||
EXPOSE 2350/tcp
|
EXPOSE 2350/tcp
|
||||||
|
|||||||
@@ -24,6 +24,58 @@ error_log = /var/log/php_errors.log
|
|||||||
EOF
|
EOF
|
||||||
fi
|
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"
|
echo "Starting apache server"
|
||||||
service apache2 start
|
service apache2 start
|
||||||
|
|
||||||
@@ -47,6 +99,9 @@ FORCE_CONFIG_UPDATE="${FORCE_CONFIG_UPDATE:-false}"
|
|||||||
if [ ! -f "$CONFIG" ]; then
|
if [ ! -f "$CONFIG" ]; then
|
||||||
echo "==> Erster Start erkannt: Kopiere Default-GameData ins Volume..."
|
echo "==> Erster Start erkannt: Kopiere Default-GameData ins Volume..."
|
||||||
cp -r "$DEFAULT_GAMEDATA"/* "$GAMEDATA_DIR/"
|
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
|
APPLY_ENV=true
|
||||||
elif [ "$FORCE_CONFIG_UPDATE" = "true" ]; then
|
elif [ "$FORCE_CONFIG_UPDATE" = "true" ]; then
|
||||||
echo "==> FORCE_CONFIG_UPDATE ist aktiv: Umgebungsvariablen werden erneut angewendet..."
|
echo "==> FORCE_CONFIG_UPDATE ist aktiv: Umgebungsvariablen werden erneut angewendet..."
|
||||||
|
|||||||
+5
-4
@@ -5,15 +5,16 @@ services:
|
|||||||
container_name: tmserver
|
container_name: tmserver
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
- "${SERVER_PORT:-2350}:2350/tcp"
|
- "${SERVER_PORT:-2350}:${SERVER_PORT:-2350}/tcp"
|
||||||
- "${SERVER_PORT:-2350}:2350/udp"
|
- "${SERVER_PORT:-2350}:${SERVER_PORT:-2350}/udp"
|
||||||
- "${SERVER_P2P_PORT:-3450}:3450/tcp"
|
- "${SERVER_P2P_PORT:-3450}:${SERVER_P2P_PORT:-3450}/tcp"
|
||||||
- "${SERVER_XMLRPC_PORT:-5000}:5000/tcp"
|
- "${SERVER_XMLRPC_PORT:-5000}:${SERVER_XMLRPC_PORT:-5000}/tcp"
|
||||||
- "80:80/tcp"
|
- "80:80/tcp"
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
volumes:
|
volumes:
|
||||||
- ./data/GameData:/opt/tmserver/GameData
|
- ./data/GameData:/opt/tmserver/GameData
|
||||||
|
- ./data/AdminServ:/var/www/html
|
||||||
networks:
|
networks:
|
||||||
tmserver_net:
|
tmserver_net:
|
||||||
ipv4_address: 172.20.60.10
|
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.
|
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).
|
> **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
|
- Manuelle Änderungen gehen nicht verloren, auch wenn der Container neu erstellt wird
|
||||||
- Dateien können direkt auf dem Host bearbeitet werden
|
- Dateien können direkt auf dem Host bearbeitet werden
|
||||||
|
|
||||||
### Volume-Pfad
|
### Volume-Pfade
|
||||||
|
|
||||||
| Host-Pfad | Container-Pfad | Beschreibung |
|
| Host-Pfad | Container-Pfad | Beschreibung |
|
||||||
|-----------|----------------|-------------|
|
|-----------|----------------|-------------|
|
||||||
| `./data/GameData` | `/opt/tmserver/GameData` | Gesamtes GameData-Verzeichnis |
|
| `./data/GameData` | `/opt/tmserver/GameData` | Gesamtes GameData-Verzeichnis |
|
||||||
|
| `./data/AdminServ` | `/var/www/html` | AdminServ-Daten (Passwort, Server-Einträge, Logs) |
|
||||||
|
|
||||||
### Enthaltene Unterordner
|
### Enthaltene Unterordner
|
||||||
|
|
||||||
|
|||||||
+10
-3
@@ -45,8 +45,7 @@ docker run -d \
|
|||||||
-p 2350:2350/udp \
|
-p 2350:2350/udp \
|
||||||
-p 3450:3450/tcp \
|
-p 3450:3450/tcp \
|
||||||
-p 80:80/tcp \
|
-p 80:80/tcp \
|
||||||
-v ./data/GameData:/opt/tmserver/GameData \
|
-v ./data/GameData:/opt/tmserver/GameData \ -v ./data/AdminServ:/var/www/html \ --name tmserver tmserver:latest
|
||||||
--name tmserver tmserver:latest
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### LAN-Modus (docker run)
|
### LAN-Modus (docker run)
|
||||||
@@ -62,6 +61,7 @@ docker run -d \
|
|||||||
-p 3450:3450/tcp \
|
-p 3450:3450/tcp \
|
||||||
-p 80:80/tcp \
|
-p 80:80/tcp \
|
||||||
-v ./data/GameData:/opt/tmserver/GameData \
|
-v ./data/GameData:/opt/tmserver/GameData \
|
||||||
|
-v ./data/AdminServ:/var/www/html \
|
||||||
--name tmserver tmserver:latest
|
--name tmserver tmserver:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -71,6 +71,13 @@ Die Verwaltungsoberfläche ist unter `http://<host-ip>` erreichbar. Weitere Deta
|
|||||||
|
|
||||||
## Persistente Konfiguration
|
## 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).
|
Weitere Details unter [Konfiguration](konfiguration.md).
|
||||||
|
|||||||
Reference in New Issue
Block a user