Merge pull request 'release-1.1.0' (#6) from release-1.0.1 into master

Reviewed-on: #6
This commit was merged in pull request #6.
This commit is contained in:
2026-03-22 00:56:53 +00:00
16 changed files with 307 additions and 61 deletions

View File

@@ -35,6 +35,7 @@ SERVER_PASSWORD=
SERVER_MAX_SPECTATORS=40 SERVER_MAX_SPECTATORS=40
SERVER_SPEC_PASSWORD= SERVER_SPEC_PASSWORD=
SERVER_LADDER_MODE=forced SERVER_LADDER_MODE=forced
SERVER_LADDER_LIMIT_MAX=60000
# --- Netzwerk --- # --- Netzwerk ---
# Bitte ändere die Ports, wenn sie in deinem Netzwerk bereits verwendet werden. # Bitte ändere die Ports, wenn sie in deinem Netzwerk bereits verwendet werden.

View File

@@ -41,7 +41,7 @@ RUN mkdir -p /opt/tmserver/GameData/Config/AdminServ/ServerOptions \
&& chown -R www-data:www-data /opt/tmserver/GameData/Config/AdminServ && 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 -a /opt/tmserver/GameData /opt/tmserver/default-gamedata
COPY assets/bin/RunTrackmaniaServer.sh /opt/tmserver/ COPY assets/bin/RunTrackmaniaServer.sh /opt/tmserver/
RUN sed -i 's/\r$//' /opt/tmserver/RunTrackmaniaServer.sh \ RUN sed -i 's/\r$//' /opt/tmserver/RunTrackmaniaServer.sh \
@@ -70,8 +70,14 @@ RUN unzip /var/www/html/remoteCP_v4.0.3.5.zip -d /var/www/html \
&& chmod -R 777 /var/www/html/remotecp/xml/settings \ && chmod -R 777 /var/www/html/remotecp/xml/settings \
&& chown -R www-data:www-data /var/www/html/remotecp/ && chown -R www-data:www-data /var/www/html/remotecp/
# Fix PHP-Warnungen in RemoteCP CustomPoints-Plugin (undefined constants)
# RemoteCP nutzt bare constants (pt_custom, pt_points, ...), die in PHP 7.2+
# Warnungen ausloesen. Das gepatchte Plugin nutzt stattdessen defined()-Pruefungen.
COPY assets/config/remotecp/plugins/CustomPoints/index.php /var/www/html/remotecp/plugins/CustomPoints/index.php
RUN chown www-data:www-data /var/www/html/remotecp/plugins/CustomPoints/index.php
# AdminServ- und RemoteCP-Dateien als Default-Template sichern (wird beim ersten Start ins Volume kopiert) # AdminServ- und RemoteCP-Dateien als Default-Template sichern (wird beim ersten Start ins Volume kopiert)
RUN cp -r /var/www/html /opt/tmserver/default-controlpanel RUN cp -a /var/www/html /opt/tmserver/default-controlpanel
# XAseco installieren # XAseco installieren
COPY assets/bin/xaseco_v1.16.zip /opt/tmserver/ COPY assets/bin/xaseco_v1.16.zip /opt/tmserver/
@@ -108,7 +114,7 @@ RUN sed -i '/<plugin>plugin\.freezone\.php<\/plugin>/d' /opt/tmserver/xaseco/plu
&& sed -i 's/<plugin>plugin\.teamspeak3\.php<\/plugin>/<!-- <plugin>plugin.teamspeak3.php<\/plugin> -->/' /opt/tmserver/xaseco/plugins.xml && sed -i 's/<plugin>plugin\.teamspeak3\.php<\/plugin>/<!-- <plugin>plugin.teamspeak3.php<\/plugin> -->/' /opt/tmserver/xaseco/plugins.xml
# XAseco als Default-Template sichern (wird beim ersten Start ins Volume kopiert) # XAseco als Default-Template sichern (wird beim ersten Start ins Volume kopiert)
RUN cp -r /opt/tmserver/xaseco /opt/tmserver/default-xaseco RUN cp -a /opt/tmserver/xaseco /opt/tmserver/default-xaseco
# 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)
@@ -136,6 +142,9 @@ ENV SERVER_DOWNLOAD_RATE=8192
ENV SERVER_MODE=internet ENV SERVER_MODE=internet
ENV FORCE_CONFIG_UPDATE=false ENV FORCE_CONFIG_UPDATE=false
# Spieleinstellungen (MatchSettings)
ENV ALLWARMUPDURATION=0
# RemoteCP # RemoteCP
ENV REMOTECP_DB_HOST=mariadb ENV REMOTECP_DB_HOST=mariadb
ENV REMOTECP_DB_NAME=remotecp ENV REMOTECP_DB_NAME=remotecp

View File

@@ -23,11 +23,9 @@ unterzulizenzieren und/oder Kopien der Software zu verkaufen, und Personen,
denen die Software zur Verfügung gestellt wird, dies unter den folgenden denen die Software zur Verfügung gestellt wird, dies unter den folgenden
Bedingungen zu gestatten: Bedingungen zu gestatten:
Der obige Urheberrechtshinweis und dieser Genehmigungshinweis müssen in allen Der obige Urheberrechtshinweis einschließlich der Angaben zum Lizenzinhaber
Kopien oder wesentlichen Teilen der Software enthalten sein. Bei jeglicher sowie dieser Genehmigungshinweis müssen in allen Kopien oder wesentlichen
Weiterverarbeitung, Veröffentlichung oder Verbreitung der Software müssen der Teilen der Software enthalten sein.
Name „Patrick Asmus" und die E-Mail-Adresse „support@techniverse.net" des
Urhebers genannt werden.
DIE SOFTWARE WIRD „WIE BESEHEN" OHNE JEGLICHE AUSDRÜCKLICHE ODER DIE SOFTWARE WIRD „WIE BESEHEN" OHNE JEGLICHE AUSDRÜCKLICHE ODER
STILLSCHWEIGENDE GEWÄHRLEISTUNG ZUR VERFÜGUNG GESTELLT, EINSCHLIESSLICH, STILLSCHWEIGENDE GEWÄHRLEISTUNG ZUR VERFÜGUNG GESTELLT, EINSCHLIESSLICH,

View File

@@ -1,6 +1,13 @@
# tmserver-docker # tmserver-docker
Trackmania Nations Forever Docker Server Ein vollständiges Docker-Setup für einen **TrackMania Nations Forever**-Server inklusive Web-Verwaltung und Server-Controller:
- **TrackMania Dedicated Server** der eigentliche Spielserver für Internet- oder LAN-Betrieb
- **[XAseco](docs/xaseco.md)** Server-Controller, der lokale Rekorde, Dedimania-Weltrekorde, Karma/Votes und eine Track-Jukebox direkt im Spielchat verwaltet
- **[AdminServ](docs/adminserv.md)** Web-Oberfläche zur komfortablen Verwaltung und Konfiguration des Servers
- **[RemoteCP](docs/remotecp.md)** alternative Web-Verwaltungsoberfläche mit eigenem Login- und Benutzersystem
Alle Komponenten laufen in einem einzigen Container und werden über Umgebungsvariablen konfiguriert.
> **Hinweis:** Dieses Projekt ist ein Fork von [lduriez/tmserver-docker](https://github.com/lduriez/tmserver-docker?tab=readme-ov-file). > **Hinweis:** Dieses Projekt ist ein Fork von [lduriez/tmserver-docker](https://github.com/lduriez/tmserver-docker?tab=readme-ov-file).
@@ -20,10 +27,20 @@ Passe die Werte in der `.env`-Datei an deine Umgebung an (Passwörter, Masterser
### 2. Server starten ### 2. Server starten
Das fertige Docker Image kann direkt verwendet werden kein eigener Build nötig:
```bash ```bash
docker compose up -d --build docker compose up -d
``` ```
Das Image wird automatisch aus der Container-Registry geladen:
```
git.techniverse.net/scriptos/trackmania-server:latest
```
> **Tipp:** Alle verfügbaren Tags findest du in der [Container-Registry](https://git.techniverse.net/scriptos/-/packages/container/trackmania-server/). Wenn du das Image lieber selbst bauen möchtest, findest du die Anleitung unter [Schnellstart Selbst bauen](docs/schnellstart.md#docker-image-selbst-bauen).
### 3. Verwaltungsoberflächen öffnen ### 3. Verwaltungsoberflächen öffnen
- **AdminServ:** `http://<host-ip>/` - **AdminServ:** `http://<host-ip>/`
@@ -31,33 +48,6 @@ docker compose up -d --build
> **Hinweis:** Für den Internet-Modus müssen `SERVER_LOGIN` und `SERVER_VALIDATION_KEY` in der `.env`-Datei gesetzt sein. Einen Server-Account kannst du auf [players.trackmaniaforever.com](https://players.trackmaniaforever.com) erstellen. Für den LAN-Modus setze `SERVER_MODE=lan`. > **Hinweis:** Für den Internet-Modus müssen `SERVER_LOGIN` und `SERVER_VALIDATION_KEY` in der `.env`-Datei gesetzt sein. Einen Server-Account kannst du auf [players.trackmaniaforever.com](https://players.trackmaniaforever.com) erstellen. Für den LAN-Modus setze `SERVER_MODE=lan`.
## Projektstruktur
```
├── assets/
│ ├── bin/ # Binaries und Startscript
│ │ ├── AdminServ_v2.1.1.zip # AdminServ Web-UI
│ │ ├── remoteCP_v4.0.3.5.zip # RemoteCP Web-UI
│ │ ├── xaseco_v1.16.zip # XAseco Server-Controller
│ │ ├── RunTrackmaniaServer.sh # Container-Startscript
│ │ └── TrackmaniaServer_*.zip # Trackmania Server Binary
│ ├── config/
│ ├── custom_game_settings.txt # MatchSettings (Spielmodus, Map-Rotation)
│ └── dedicated_cfg.txt # Server-Config-Template (mit Platzhaltern)
│ └── db/
│ └── init-xaseco-db.sh # MariaDB Init-Script fuer XAseco-DB
├── docs/ # Dokumentation
├── docker-compose.yml # Docker Compose Konfiguration
├── Dockerfile # Docker Build-Definition
├── .env.example # Vorlage fuer Umgebungsvariablen
├── .env # Lokale Umgebungsvariablen (nicht im Git!)
└── data/ # Persistente Daten (zur Laufzeit)
├── gamedata/ # TM-Server-Daten
├── controlpanel/ # AdminServ + RemoteCP
├── xaseco/ # XAseco-Konfiguration und Logs
└── mariadb/ # MariaDB-Datenbankdateien
```
## Dokumentation ## Dokumentation
Die vollständige Dokumentation befindet sich im Ordner [`docs/`](docs/README.md): Die vollständige Dokumentation befindet sich im Ordner [`docs/`](docs/README.md):
@@ -71,6 +61,17 @@ Die vollständige Dokumentation befindet sich im Ordner [`docs/`](docs/README.md
- [XAseco](docs/xaseco.md) Server-Controller für Rekorde, Karma und Jukebox - [XAseco](docs/xaseco.md) Server-Controller für Rekorde, Karma und Jukebox
- [Ports](docs/ports.md) Freigegebene Ports und deren Verwendung - [Ports](docs/ports.md) Freigegebene Ports und deren Verwendung
## Danksagung
Danke an **Thomas** ([retronerd.at](https://retronerd.at)), dass er mir sein Wissen zur Verfügung gestellt hat und dass er hier im Projekt mitgewirkt hat.
## Spiegelung
Dieses Repository wird von **Gitea** auf **GitHub** gespiegelt. Das Master-Repository befindet sich auf Gitea:
- **Gitea (Master):** [git.techniverse.net/scriptos/tmserver-docker](https://git.techniverse.net/scriptos/tmserver-docker.git)
- **GitHub (Spiegel):** [github.com/pscriptos/tmserver-docker](https://github.com/pscriptos/tmserver-docker.git)
--- ---
📝 **Blog:** [www.cleveradmin.de](https://www.cleveradmin.de) 📝 **Blog:** [www.cleveradmin.de](https://www.cleveradmin.de)

View File

@@ -18,7 +18,7 @@ else
echo "==> PHP-Debug-Modus deaktiviert" echo "==> PHP-Debug-Modus deaktiviert"
cat > "$PHP_INI_DIR/99-adminserv-debug.ini" <<EOF cat > "$PHP_INI_DIR/99-adminserv-debug.ini" <<EOF
display_errors = Off display_errors = Off
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_WARNING & ~E_NOTICE
log_errors = On log_errors = On
error_log = /var/log/php_errors.log error_log = /var/log/php_errors.log
EOF EOF
@@ -38,7 +38,7 @@ DEFAULT_CONTROLPANEL="/opt/tmserver/default-controlpanel"
if [ ! -f "$ADMINSERV_DIR/index.php" ]; then if [ ! -f "$ADMINSERV_DIR/index.php" ]; then
echo "==> Erster Start erkannt: Kopiere AdminServ-Dateien ins Volume..." echo "==> Erster Start erkannt: Kopiere AdminServ-Dateien ins Volume..."
cp -r "$DEFAULT_CONTROLPANEL"/* "$ADMINSERV_DIR/" cp -a "$DEFAULT_CONTROLPANEL"/* "$ADMINSERV_DIR/"
chmod -R 777 "$ADMINSERV_DIR/logs/" chmod -R 777 "$ADMINSERV_DIR/logs/"
chmod 666 "$ADMINSERV_DIR/config/adminlevel.cfg.php" chmod 666 "$ADMINSERV_DIR/config/adminlevel.cfg.php"
chmod 666 "$ADMINSERV_DIR/config/servers.cfg.php" chmod 666 "$ADMINSERV_DIR/config/servers.cfg.php"
@@ -185,6 +185,16 @@ EORCPSERV
</admins> </admins>
EORCPADM EORCPADM
# settings.xml: Registrierung deaktivieren (SuperAdmin wird automatisch angelegt)
mkdir -p "$REMOTECP_DIR/xml/settings"
cat > "$REMOTECP_DIR/xml/settings/settings.xml" <<EORCPSET
<?xml version="1.0" encoding="utf-8"?>
<settings>
<register>false</register>
</settings>
EORCPSET
echo " settings.xml: Registrierung deaktiviert."
# ============================================================ # ============================================================
# RemoteCP: Datenbank-Initialisierung # RemoteCP: Datenbank-Initialisierung
# ============================================================ # ============================================================
@@ -247,7 +257,7 @@ XASECO_ENABLED="${XASECO_ENABLED:-true}"
if [ "$XASECO_ENABLED" = "true" ]; then if [ "$XASECO_ENABLED" = "true" ]; then
if [ ! -f "$XASECO_DIR/aseco.php" ]; then if [ ! -f "$XASECO_DIR/aseco.php" ]; then
echo "==> Erster Start erkannt: Kopiere XAseco-Dateien ins Volume..." echo "==> Erster Start erkannt: Kopiere XAseco-Dateien ins Volume..."
cp -r "$DEFAULT_XASECO"/* "$XASECO_DIR/" cp -a "$DEFAULT_XASECO"/* "$XASECO_DIR/"
XMLRPC_PORT="${SERVER_XMLRPC_PORT:-5000}" XMLRPC_PORT="${SERVER_XMLRPC_PORT:-5000}"
XASECO_ADMIN="${XASECO_MASTERADMIN_LOGIN:-}" XASECO_ADMIN="${XASECO_MASTERADMIN_LOGIN:-}"
@@ -353,10 +363,27 @@ if [ "$XASECO_ENABLED" = "true" ]; then
fi fi
fi fi
# ============================================================
# RemoteCP: PHP-Warnungen in Plugins fixen (fuer bestehende Volumes)
# ============================================================
# RemoteCP nutzt bare constants (pt_custom, pt_points, ...), die in
# PHP 7.2+ Warnungen ausloesen. Die gepatchte Datei aus dem Image
# wird in das Volume kopiert, falls die alte Version noch vorhanden ist.
# ============================================================
CUSTOMPOINTS_FILE="/var/www/html/remotecp/plugins/CustomPoints/index.php"
CUSTOMPOINTS_DEFAULT="/opt/tmserver/default-controlpanel/remotecp/plugins/CustomPoints/index.php"
if [ -f "$CUSTOMPOINTS_FILE" ] && ! grep -q 'defined.*pt_custom' "$CUSTOMPOINTS_FILE"; then
echo "==> Patche CustomPoints-Plugin (PHP-Warnungen beheben)..."
cp "$CUSTOMPOINTS_DEFAULT" "$CUSTOMPOINTS_FILE"
chown www-data:www-data "$CUSTOMPOINTS_FILE"
echo " CustomPoints-Plugin erfolgreich gepatcht."
fi
echo "Starting apache server" echo "Starting apache server"
service apache2 start service apache2 start
CONFIG="/opt/tmserver/GameData/Config/dedicated_cfg.txt" CONFIG="/opt/tmserver/GameData/Config/dedicated_cfg.txt"
GAME_SETTINGS="/opt/tmserver/GameData/Tracks/MatchSettings/custom_game_settings.txt"
GAMEDATA_DIR="/opt/tmserver/GameData" GAMEDATA_DIR="/opt/tmserver/GameData"
DEFAULT_GAMEDATA="/opt/tmserver/default-gamedata" DEFAULT_GAMEDATA="/opt/tmserver/default-gamedata"
@@ -375,16 +402,20 @@ 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 -a "$DEFAULT_GAMEDATA"/* "$GAMEDATA_DIR/"
chmod -R 777 "$GAMEDATA_DIR/Config/" chmod -R 777 "$GAMEDATA_DIR/Config/"
mkdir -p "$GAMEDATA_DIR/Config/AdminServ/ServerOptions" mkdir -p "$GAMEDATA_DIR/Config/AdminServ/ServerOptions"
chown -R www-data:www-data "$GAMEDATA_DIR/Config/AdminServ" chown -R www-data:www-data "$GAMEDATA_DIR/Config/AdminServ"
# Tracks-Verzeichnis fuer AdminServ beschreibbar machen (Maps-Upload/Download)
chown -R www-data:www-data "$GAMEDATA_DIR/Tracks/"
chmod -R 755 "$GAMEDATA_DIR/Tracks/"
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..."
echo " ACHTUNG: Manuelle Aenderungen an den betroffenen Feldern werden ueberschrieben!" echo " ACHTUNG: Manuelle Aenderungen an den betroffenen Feldern werden ueberschrieben!"
# Template neu kopieren, damit alle Platzhalter vorhanden sind # Template neu kopieren, damit alle Platzhalter vorhanden sind
cp "$DEFAULT_GAMEDATA/Config/dedicated_cfg.txt" "$CONFIG" cp "$DEFAULT_GAMEDATA/Config/dedicated_cfg.txt" "$CONFIG"
cp "$DEFAULT_GAMEDATA/Tracks/MatchSettings/custom_game_settings.txt" "$GAME_SETTINGS"
APPLY_ENV=true APPLY_ENV=true
else else
echo "==> Vorhandene Konfiguration gefunden. Umgebungsvariablen werden NICHT angewendet." echo "==> Vorhandene Konfiguration gefunden. Umgebungsvariablen werden NICHT angewendet."
@@ -417,6 +448,7 @@ if [ "$APPLY_ENV" = "true" ]; then
sed -i "s|%%SERVER_MAX_SPECTATORS%%|${SERVER_MAX_SPECTATORS}|g" "$CONFIG" sed -i "s|%%SERVER_MAX_SPECTATORS%%|${SERVER_MAX_SPECTATORS}|g" "$CONFIG"
sed -i "s|%%SERVER_SPEC_PASSWORD%%|${SERVER_SPEC_PASSWORD}|g" "$CONFIG" sed -i "s|%%SERVER_SPEC_PASSWORD%%|${SERVER_SPEC_PASSWORD}|g" "$CONFIG"
sed -i "s|%%SERVER_LADDER_MODE%%|${SERVER_LADDER_MODE}|g" "$CONFIG" sed -i "s|%%SERVER_LADDER_MODE%%|${SERVER_LADDER_MODE}|g" "$CONFIG"
sed -i "s|%%SERVER_LADDER_LIMIT_MAX%%|${SERVER_LADDER_LIMIT_MAX:-60000}|g" "$CONFIG"
# Netzwerk # Netzwerk
sed -i "s|%%SERVER_PORT%%|${SERVER_PORT}|g" "$CONFIG" sed -i "s|%%SERVER_PORT%%|${SERVER_PORT}|g" "$CONFIG"
@@ -425,6 +457,9 @@ if [ "$APPLY_ENV" = "true" ]; then
sed -i "s|%%SERVER_UPLOAD_RATE%%|${SERVER_UPLOAD_RATE}|g" "$CONFIG" sed -i "s|%%SERVER_UPLOAD_RATE%%|${SERVER_UPLOAD_RATE}|g" "$CONFIG"
sed -i "s|%%SERVER_DOWNLOAD_RATE%%|${SERVER_DOWNLOAD_RATE}|g" "$CONFIG" sed -i "s|%%SERVER_DOWNLOAD_RATE%%|${SERVER_DOWNLOAD_RATE}|g" "$CONFIG"
# Spieleinstellungen (MatchSettings)
sed -i "s|<allwarmupduration>[^<]*</allwarmupduration>|<allwarmupduration>${ALLWARMUPDURATION:-0}</allwarmupduration>|" "$GAME_SETTINGS"
echo "Platzhalter erfolgreich ersetzt." echo "Platzhalter erfolgreich ersetzt."
fi fi

View File

@@ -4,7 +4,7 @@
<game_mode>1</game_mode> <game_mode>1</game_mode>
<chat_time>10000</chat_time> <chat_time>10000</chat_time>
<finishtimeout>1</finishtimeout> <finishtimeout>1</finishtimeout>
<allwarmupduration>1</allwarmupduration> <allwarmupduration>0</allwarmupduration>
<disablerespawn>0</disablerespawn> <disablerespawn>0</disablerespawn>
<forceshowallopponents>0</forceshowallopponents> <forceshowallopponents>0</forceshowallopponents>
<rounds_pointslimit>30</rounds_pointslimit> <rounds_pointslimit>30</rounds_pointslimit>

View File

@@ -35,7 +35,7 @@
<ladder_mode>%%SERVER_LADDER_MODE%%</ladder_mode> <!-- value between 'inactive', 'forced' (or '0', '1') --> <ladder_mode>%%SERVER_LADDER_MODE%%</ladder_mode> <!-- value between 'inactive', 'forced' (or '0', '1') -->
<ladder_serverlimit_min>0</ladder_serverlimit_min> <!-- Those values will be clamped to the limits authorized on http://official.trackmania.com/tmf-ladderserver/ --> <ladder_serverlimit_min>0</ladder_serverlimit_min> <!-- Those values will be clamped to the limits authorized on http://official.trackmania.com/tmf-ladderserver/ -->
<ladder_serverlimit_max>50000</ladder_serverlimit_max> <ladder_serverlimit_max>%%SERVER_LADDER_LIMIT_MAX%%</ladder_serverlimit_max>
<enable_p2p_upload>True</enable_p2p_upload> <enable_p2p_upload>True</enable_p2p_upload>
<enable_p2p_download>True</enable_p2p_download> <enable_p2p_download>True</enable_p2p_download>

View File

@@ -0,0 +1,135 @@
<?php
/**
* remoteCP 4
* ütf-8 release
*
* @package remoteCP
* @author hal.sascha
* @copyright (c) 2006-2009
* @version 4.0.3.5
*
* Patched by tmserver-docker:
* - Bare-constant-Zugriffe (pt_custom, pt_points, ...) durch
* defined()-Pruefungen ersetzt, um PHP 7.2+ Warnungen zu vermeiden.
*/
class CustomPoints extends rcp_plugin
{
public $display = 'side';
public $title = 'Points';
public $author = 'hal.ko.sascha';
public $version = '4.0.3.5';
public $nservstatus = array(2,3,4,5);
public $vpermissions = array('editgamesettings');
public $apermissions = array(
'setPoints' => 'editgamesettings',
'setPointsPreset' => 'editgamesettings'
);
public $presets;
public function onLoad()
{
$this->presets = Core::getObject('session')->loadXML(
Core::getSetting('pluginpath') . $this->id . '/presets.xml'
);
}
public function onOutput()
{
$CustomPoints = array();
if (Core::getObject('gbx')->query('GetRoundCustomPoints')) {
$CustomPoints = Core::getObject('gbx')->getResponse();
}
if (!is_array($CustomPoints)) {
$CustomPoints = array();
}
if (!Core::getObject('session')->checkPerm('editgamesettings')) {
return;
}
echo "<form action='ajax.php' method='post' id='custompoints' name='custompoints' class='postcmd' rel='{$this->display}area'>";
echo "<fieldset>";
echo "<div class='legend'>" . (defined('pt_custom') ? pt_custom : 'Custom Points') . "</div>";
echo "<div class='f-row'>
<label for='points'>" . (defined('pt_points') ? pt_points : 'Points') . "</label>
<div class='f-field'>
<input type='text' name='points' id='points' value='" . implode(',', $CustomPoints) . "' />
<div class='small'>" . (defined('pt_commasep') ? pt_commasep : 'Comma separated') . "</div>
</div>";
echo "</div>";
echo "</fieldset>";
echo "<input type='hidden' name='plugin' value='{$this->id}' />";
echo "<input type='hidden' name='action' value='setPoints' />";
echo "<button type='submit' title='" . (defined('ct_submit') ? ct_submit : 'Submit') . "' class='wide'>" . (defined('ct_submit') ? ct_submit : 'Submit') . "</button>";
echo "</form>";
echo "<form action='ajax.php' method='post' id='custompointspreset' name='custompointspreset' class='postcmd' rel='{$this->display}area'>";
echo "<fieldset>";
echo "<div class='legend'>" . (defined('pt_presets') ? pt_presets : 'Presets') . "</div>";
if ($this->presets && is_object($this->presets)) {
foreach ($this->presets->children() as $preset) {
$name = isset($preset['name']) ? $preset['name'] : 'Preset';
$points = isset($preset['points']) ? (string)$preset['points'] : '';
echo "<div class='f-row'>
<label>{$name}</label>
<div class='f-field'>";
echo "<input style='width:25px;' type='radio' name='preset' value='{$points}' /> ";
if (strlen($points) > 25) {
echo substr($points, 0, 25) . "...";
} else {
echo $points;
}
echo "</div>";
echo "</div>";
}
}
echo "</fieldset>";
echo "<input type='hidden' name='plugin' value='{$this->id}' />";
echo "<input type='hidden' name='action' value='setPointsPreset' />";
echo "<button type='submit' title='" . (defined('ct_submit') ? ct_submit : 'Submit') . "' class='wide'>" . (defined('ct_submit') ? ct_submit : 'Submit') . "</button>";
echo "</form>";
}
public function setPoints()
{
if (!array_key_exists('points', $_REQUEST)) return;
$str = preg_replace("/[^0-9,]/", "", $_REQUEST['points']);
$array = $this->makeIntArray(explode(',', $str));
Core::getObject('actions')->add('SetRoundCustomPoints', $array, true);
}
public function setPointsPreset()
{
if (!array_key_exists('preset', $_REQUEST)) return;
$str = preg_replace("/[^0-9,]/", "", $_REQUEST['preset']);
$array = $this->makeIntArray(explode(',', $str));
Core::getObject('actions')->add('SetRoundCustomPoints', $array, true);
}
private function makeIntArray($array)
{
foreach ($array as $key => $value) {
$array[$key] = (int)$value;
}
return $array;
}
}

View File

@@ -1,6 +1,6 @@
services: services:
tmserver: tmserver:
image: git.techniverse.net/scriptos/trackmania-server:1.0.0 image: git.techniverse.net/scriptos/trackmania-server:1.1.0
build: build:
context: . context: .
container_name: tmserver container_name: tmserver
@@ -32,9 +32,14 @@ services:
- .env - .env
environment: environment:
MYSQL_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD} MYSQL_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD}
# RemoteCP-Datenbank (via MariaDB-Init)
MYSQL_DATABASE: ${REMOTECP_DB_NAME:-remotecp} MYSQL_DATABASE: ${REMOTECP_DB_NAME:-remotecp}
MYSQL_USER: ${REMOTECP_DB_USER:-remotecp} MYSQL_USER: ${REMOTECP_DB_USER:-remotecp}
MYSQL_PASSWORD: ${REMOTECP_DB_PASSWORD} MYSQL_PASSWORD: ${REMOTECP_DB_PASSWORD}
# XAseco-Datenbank (via Init-Script init-xaseco-db.sh)
XASECO_DB_NAME: ${XASECO_DB_NAME:-xaseco}
XASECO_DB_USER: ${XASECO_DB_USER:-xaseco}
XASECO_DB_PASSWORD: ${XASECO_DB_PASSWORD}
volumes: volumes:
- ./data/mariadb:/var/lib/mysql - ./data/mariadb:/var/lib/mysql
- ./assets/db/init-xaseco-db.sh:/docker-entrypoint-initdb.d/20-init-xaseco-db.sh:ro - ./assets/db/init-xaseco-db.sh:/docker-entrypoint-initdb.d/20-init-xaseco-db.sh:ro

View File

@@ -16,3 +16,36 @@
| [RemoteCP](remotecp.md) | Alternative Server-Verwaltungsoberfläche | | [RemoteCP](remotecp.md) | Alternative Server-Verwaltungsoberfläche |
| [XAseco](xaseco.md) | Server-Controller für Rekorde, Karma und Jukebox | | [XAseco](xaseco.md) | Server-Controller für Rekorde, Karma und Jukebox |
| [Ports](ports.md) | Freigegebene Ports und deren Verwendung | | [Ports](ports.md) | Freigegebene Ports und deren Verwendung |
## Projektstruktur
```
├── assets/
│ ├── bin/ # Binaries und Startscript
│ │ ├── AdminServ_v2.1.1.zip # AdminServ Web-UI
│ │ ├── remoteCP_v4.0.3.5.zip # RemoteCP Web-UI
│ │ ├── xaseco_v1.16.zip # XAseco Server-Controller
│ │ ├── RunTrackmaniaServer.sh # Container-Startscript
│ │ └── TrackmaniaServer_*.zip # Trackmania Server Binary
│ ├── config/
│ │ ├── custom_game_settings.txt # MatchSettings (Spielmodus, Map-Rotation)
│ │ ├── dedicated_cfg.txt # Server-Config-Template (mit Platzhaltern)
│ │ └── remotecp/
│ │ └── plugins/
│ │ └── CustomPoints/
│ │ └── index.php # CustomPoints-Plugin fuer RemoteCP
│ └── db/
│ └── init-xaseco-db.sh # MariaDB Init-Script fuer XAseco-DB
├── docs/ # Dokumentation
├── docker-compose.yml # Docker Compose Konfiguration
├── Dockerfile # Docker Build-Definition
├── .env.example # Vorlage fuer Umgebungsvariablen
├── .env # Lokale Umgebungsvariablen (nicht im Git!)
├── LICENSE # Lizenz
├── README.md # Projektbeschreibung
└── data/ # Persistente Daten (zur Laufzeit)
├── gamedata/ # TM-Server-Daten
├── controlpanel/ # AdminServ + RemoteCP
├── xaseco/ # XAseco-Konfiguration und Logs
└── mariadb/ # MariaDB-Datenbankdateien
```

View File

@@ -88,7 +88,7 @@ docker run -d \
-v ./data/gamedata:/opt/tmserver/GameData \ -v ./data/gamedata:/opt/tmserver/GameData \
-v ./data/controlpanel:/var/www/html \ -v ./data/controlpanel:/var/www/html \
-v ./data/xaseco:/opt/tmserver/xaseco \ -v ./data/xaseco:/opt/tmserver/xaseco \
--name tmserver tmserver:latest --name tmserver git.techniverse.net/scriptos/trackmania-server:latest
``` ```
> **Achtung:** Bei `FORCE_CONFIG_UPDATE=true` wird die `dedicated_cfg.txt` komplett aus dem Template neu erzeugt und alle Platzhalter mit den aktuellen Umgebungsvariablen ersetzt. **Manuelle Änderungen an der Config gehen dabei verloren!** Andere Dateien im GameData-Volume (Tracks, Skins, Scores, etc.) bleiben erhalten. Nach dem Update sollte `FORCE_CONFIG_UPDATE` wieder auf `false` gesetzt werden. > **Achtung:** Bei `FORCE_CONFIG_UPDATE=true` wird die `dedicated_cfg.txt` komplett aus dem Template neu erzeugt und alle Platzhalter mit den aktuellen Umgebungsvariablen ersetzt. **Manuelle Änderungen an der Config gehen dabei verloren!** Andere Dateien im GameData-Volume (Tracks, Skins, Scores, etc.) bleiben erhalten. Nach dem Update sollte `FORCE_CONFIG_UPDATE` wieder auf `false` gesetzt werden.

View File

@@ -20,7 +20,7 @@ docker run -d \
-p 3450:3450/tcp \ -p 3450:3450/tcp \
-v ./data/gamedata:/opt/tmserver/GameData \ -v ./data/gamedata:/opt/tmserver/GameData \
-v ./data/xaseco:/opt/tmserver/xaseco \ -v ./data/xaseco:/opt/tmserver/xaseco \
--name tmserver tmserver:latest --name tmserver git.techniverse.net/scriptos/trackmania-server:latest
``` ```
> **Hinweis:** Port 5000 (XML-RPC) wird intern von AdminServ verwendet und muss in der Regel nicht nach außen freigegeben werden. > **Hinweis:** Port 5000 (XML-RPC) wird intern von AdminServ verwendet und muss in der Regel nicht nach außen freigegeben werden.

View File

@@ -112,4 +112,4 @@ Falls RemoteCP nicht erreichbar ist oder Fehler anzeigt:
- RemoteCP ist ein älteres Tool (Version 4.0.3.5) und wurde für PHP 5.x entwickelt, läuft aber mit PHP 7.4 - RemoteCP ist ein älteres Tool (Version 4.0.3.5) und wurde für PHP 5.x entwickelt, läuft aber mit PHP 7.4
- Die Live-Funktionen (`remoteCP[Live]`) benötigen eine laufende Serververbindung - Die Live-Funktionen (`remoteCP[Live]`) benötigen eine laufende Serververbindung
- Die Registrierung neuer Benutzer ist standardmäßig aktiviert und kann in `xml/settings/settings.xml` über `<register>false</register>` deaktiviert werden - Die Registrierung neuer Benutzer wird beim ersten Start automatisch deaktiviert (`xml/settings/settings.xml` `<register>false</register>`). Der SuperAdmin-Account wird automatisch aus `SERVER_SA_PASSWORD` angelegt

View File

@@ -18,7 +18,29 @@ Bearbeite die `.env`-Datei und setze mindestens die gewünschten Passwörter. F
> **Wichtig:** Die `.env`-Datei enthält sensible Daten (Passwörter, Keys) und wird über die `.gitignore` vom Einchecken ausgeschlossen. > **Wichtig:** Die `.env`-Datei enthält sensible Daten (Passwörter, Keys) und wird über die `.gitignore` vom Einchecken ausgeschlossen.
## 2. Docker Image bauen ## 2. Server starten
### Fertiges Docker Image verwenden (empfohlen)
Es steht ein fertiges Docker Image in der Container-Registry bereit kein eigener Build nötig:
```
git.techniverse.net/scriptos/trackmania-server:latest
```
> **Tipp:** Alle verfügbaren Tags findest du in der [Container-Registry](https://git.techniverse.net/scriptos/-/packages/container/trackmania-server/).
#### Mit Docker Compose
```bash
docker compose up -d
```
Die Konfiguration erfolgt über die `.env`-Datei, die automatisch eingelesen wird. Das Image wird automatisch aus der Registry geladen.
### Docker Image selbst bauen
Alternativ kannst du das Image auch selbst bauen:
```bash ```bash
docker build -t tmserver:latest -t tmserver:1.0.0 . docker build -t tmserver:latest -t tmserver:1.0.0 .
@@ -26,16 +48,12 @@ docker build -t tmserver:latest -t tmserver:1.0.0 .
Damit wird das Image mit zwei Tags erstellt: `tmserver:latest` und `tmserver:1.0.0`. Damit wird das Image mit zwei Tags erstellt: `tmserver:latest` und `tmserver:1.0.0`.
## 3. Server starten Anschließend den Server starten:
### Mit Docker Compose (empfohlen)
```bash ```bash
docker compose up -d --build docker compose up -d --build
``` ```
Die Konfiguration erfolgt über die `.env`-Datei, die automatisch eingelesen wird.
### Internet-Modus (docker run) ### Internet-Modus (docker run)
Für den Internet-Modus wird ein Server-Account benötigt. Dieser kann auf der [Trackmania Players-Seite](https://players.trackmaniaforever.com) erstellt werden. Für den Internet-Modus wird ein Server-Account benötigt. Dieser kann auf der [Trackmania Players-Seite](https://players.trackmaniaforever.com) erstellt werden.
@@ -50,7 +68,7 @@ docker run -d \
-v ./data/gamedata:/opt/tmserver/GameData \ -v ./data/gamedata:/opt/tmserver/GameData \
-v ./data/controlpanel:/var/www/html \ -v ./data/controlpanel:/var/www/html \
-v ./data/xaseco:/opt/tmserver/xaseco \ -v ./data/xaseco:/opt/tmserver/xaseco \
--name tmserver tmserver:latest --name tmserver git.techniverse.net/scriptos/trackmania-server:latest
``` ```
### LAN-Modus (docker run) ### LAN-Modus (docker run)
@@ -68,10 +86,10 @@ docker run -d \
-v ./data/gamedata:/opt/tmserver/GameData \ -v ./data/gamedata:/opt/tmserver/GameData \
-v ./data/controlpanel:/var/www/html \ -v ./data/controlpanel:/var/www/html \
-v ./data/xaseco:/opt/tmserver/xaseco \ -v ./data/xaseco:/opt/tmserver/xaseco \
--name tmserver tmserver:latest --name tmserver git.techniverse.net/scriptos/trackmania-server:latest
``` ```
## 4. Verwaltungsoberflächen öffnen ## 3. Verwaltungsoberflächen öffnen
| Tool | URL | Beschreibung | | Tool | URL | Beschreibung |
|------|-----|-------------| |------|-----|-------------|

View File

@@ -56,5 +56,5 @@ docker run -d \
-v ./data/gamedata:/opt/tmserver/GameData \ -v ./data/gamedata:/opt/tmserver/GameData \
-v ./data/controlpanel:/var/www/html \ -v ./data/controlpanel:/var/www/html \
-v ./data/xaseco:/opt/tmserver/xaseco \ -v ./data/xaseco:/opt/tmserver/xaseco \
--name tmserver tmserver:latest --name tmserver git.techniverse.net/scriptos/trackmania-server:latest
``` ```

View File

@@ -48,6 +48,7 @@ nano .env
| `SERVER_MAX_SPECTATORS` | Maximale Zuschaueranzahl | `32` | | `SERVER_MAX_SPECTATORS` | Maximale Zuschaueranzahl | `32` |
| `SERVER_SPEC_PASSWORD` | Zuschauer-Passwort (leer = offen) | *(leer)* | | `SERVER_SPEC_PASSWORD` | Zuschauer-Passwort (leer = offen) | *(leer)* |
| `SERVER_LADDER_MODE` | Ladder-Modus (`inactive` oder `forced`) | `forced` | | `SERVER_LADDER_MODE` | Ladder-Modus (`inactive` oder `forced`) | `forced` |
| `SERVER_LADDER_LIMIT_MAX` | Oberes Ladder-Serverlimit (Punktegrenze) | `60000` |
## Netzwerk ## Netzwerk
@@ -66,6 +67,12 @@ nano .env
| `SERVER_MODE` | Server-Modus (`internet` oder `lan`) | `internet` | | `SERVER_MODE` | Server-Modus (`internet` oder `lan`) | `internet` |
| `FORCE_CONFIG_UPDATE` | Erzwingt erneutes Anwenden aller Umgebungsvariablen auf die Config | `false` | | `FORCE_CONFIG_UPDATE` | Erzwingt erneutes Anwenden aller Umgebungsvariablen auf die Config | `false` |
## Spieleinstellungen (MatchSettings)
| Variable | Beschreibung | Standard |
|----------|-------------|----------|
| `ALLWARMUPDURATION` | Warmup-Dauer für alle Runden (`0` = deaktiviert, `1` = eine Runde Warmup) | `0` |
## RemoteCP ## RemoteCP
RemoteCP verwendet die SuperAdmin-Zugangsdaten (`SERVER_SA_PASSWORD`) des TM-Servers für den Web-Login. Es werden keine separaten Login-Variablen benötigt. RemoteCP verwendet die SuperAdmin-Zugangsdaten (`SERVER_SA_PASSWORD`) des TM-Servers für den Web-Login. Es werden keine separaten Login-Variablen benötigt.
@@ -109,9 +116,11 @@ XAseco ist ein Server-Controller für Rekorde, Karma, Jukebox und mehr. Siehe [X
| Variable | Beschreibung | Standard | | Variable | Beschreibung | Standard |
|----------|-------------|----------| |----------|-------------|----------|
| `PHP_DISPLAY_ERRORS` | Zeigt PHP-Fehlermeldungen im Browser an (nur zur Fehlersuche!) | `false` | | `PHP_DISPLAY_ERRORS` | Aktiviert den PHP-Debug-Modus: Fehlermeldungen im Browser + vollständige Warnungen im Log (nur zur Fehlersuche!) | `false` |
> **Hinweis:** Der Debug-Modus erfordert **keinen** Rebuild des Images. Es genügt, die Variable in der `.env`-Datei zu ändern und den Container neu zu starten (`docker compose restart`). Im Produktivbetrieb sollte `PHP_DISPLAY_ERRORS` immer auf `false` stehen. > **Hinweis:** Der Debug-Modus erfordert **keinen** Rebuild des Images. Es genügt, die Variable in der `.env`-Datei zu ändern und den Container neu zu starten (`docker compose restart`). Im Produktivbetrieb sollte `PHP_DISPLAY_ERRORS` immer auf `false` stehen.
>
> Bei `false` werden nur schwerwiegende Fehler geloggt (keine Warnungen/Notices). Bei `true` werden zusätzlich alle Warnungen und Hinweise angezeigt und geloggt nützlich zur Fehlersuche bei Problemen mit RemoteCP oder AdminServ.
> **Hinweis:** Bei `FORCE_CONFIG_UPDATE=true` wird die `dedicated_cfg.txt` aus dem Template neu erzeugt und alle Platzhalter mit den aktuellen Umgebungsvariablen ersetzt. Manuelle Änderungen gehen dabei verloren! Nach dem Update sollte `FORCE_CONFIG_UPDATE` wieder auf `false` gesetzt werden. > **Hinweis:** Bei `FORCE_CONFIG_UPDATE=true` wird die `dedicated_cfg.txt` aus dem Template neu erzeugt und alle Platzhalter mit den aktuellen Umgebungsvariablen ersetzt. Manuelle Änderungen gehen dabei verloren! Nach dem Update sollte `FORCE_CONFIG_UPDATE` wieder auf `false` gesetzt werden.
@@ -122,9 +131,11 @@ XAseco ist ein Server-Controller für Rekorde, Karma, Jukebox und mehr. Siehe [X
Passe die Werte in der `.env`-Datei an und starte mit: Passe die Werte in der `.env`-Datei an und starte mit:
```bash ```bash
docker compose up -d --build docker compose up -d
``` ```
> **Tipp:** Das fertige Docker Image wird automatisch aus der [Container-Registry](https://git.techniverse.net/scriptos/-/packages/container/trackmania-server/) geladen. Wenn du das Image selbst bauen möchtest, verwende stattdessen `docker compose up -d --build`.
### docker run ### docker run
```bash ```bash
@@ -137,7 +148,7 @@ docker run -d \
-v ./data/gamedata:/opt/tmserver/GameData \ -v ./data/gamedata:/opt/tmserver/GameData \
-v ./data/controlpanel:/var/www/html \ -v ./data/controlpanel:/var/www/html \
-v ./data/xaseco:/opt/tmserver/xaseco \ -v ./data/xaseco:/opt/tmserver/xaseco \
--name tmserver tmserver:latest --name tmserver git.techniverse.net/scriptos/trackmania-server:latest
``` ```
Einzelne Werte können zusätzlich überschrieben werden: Einzelne Werte können zusätzlich überschrieben werden:
@@ -154,5 +165,5 @@ docker run -d \
-v ./data/gamedata:/opt/tmserver/GameData \ -v ./data/gamedata:/opt/tmserver/GameData \
-v ./data/controlpanel:/var/www/html \ -v ./data/controlpanel:/var/www/html \
-v ./data/xaseco:/opt/tmserver/xaseco \ -v ./data/xaseco:/opt/tmserver/xaseco \
--name tmserver tmserver:latest --name tmserver git.techniverse.net/scriptos/trackmania-server:latest
``` ```