Merge pull request 'release-1.0.0' (#1) from release-1.0.0 into master

Reviewed-on: https://git.techniverse.net/scriptos/tmserver-docker/pulls/1
This commit is contained in:
Patrick Asmus
2026-03-20 22:12:00 +00:00
26 changed files with 1871 additions and 88 deletions
+18
View File
@@ -0,0 +1,18 @@
# Git
.git
.gitignore
.gitattributes
# IDE
.vscode
# Docs
README.md
docs
# Umgebungsvariablen (Secrets!)
.env
.env.example
# Persistente Daten
data
+90
View File
@@ -0,0 +1,90 @@
# ============================================================
# tmserver-docker Umgebungsvariablen
# ============================================================
# Diese Datei wird von docker-compose.yml eingelesen.
# Kopiere diese Vorlage nach .env und passe die Werte an:
# cp .env.example .env
#
# ⚠ SICHERHEITSHINWEIS:
# Die unten stehenden Passwörter sind vorgenerierte Beispielwerte
# und öffentlich einsehbar! Ändere ALLE Passwörter, bevor du
# den Server produktiv einsetzt.
# ============================================================
# --- Authentifizierung ---
# User: SuperAdmin, Admin, User
SERVER_SA_PASSWORD="3HbQc2EVarykEPX"
SERVER_ADM_PASSWORD="YhNDuChmzoaHP72"
SERVER_USER_PASSWORD="8e9J8AKwS6YDXmT"
# --- Masterserver-Account ---
# Wenn du deinen Server im Internet-Modus betreiben möchtest, musst du hier die Zugangsdaten für deinen Masterserver-Account eingeben.
# Diese Informationen erhältst du, wenn du deinen Server auf der Trackmania-Webseite registrierst.
SERVER_LOGIN=
SERVER_LOGIN_PASSWORD=
SERVER_VALIDATION_KEY=
# --- Server-Optionen ---
# Bitte ändere den Server-Namen und die Beschreibung, um deinen Server von anderen zu unterscheiden.
# Du kannst auch die Anzahl der Spieler und Zuschauer anpassen, sowie ein Passwort setzen, um den Zugang zu beschränken.
SERVER_NAME='Trackmania Server'
SERVER_DESC="Powered by tmserver-docker"
SERVER_HIDE=0
SERVER_MAX_PLAYERS=40
SERVER_PASSWORD=
SERVER_MAX_SPECTATORS=40
SERVER_SPEC_PASSWORD=
SERVER_LADDER_MODE=forced
# --- Netzwerk ---
# Bitte ändere die Ports, wenn sie in deinem Netzwerk bereits verwendet werden.
SERVER_PORT=2350
SERVER_P2P_PORT=3450
SERVER_XMLRPC_PORT=5000
SERVER_UPLOAD_RATE=512
SERVER_DOWNLOAD_RATE=8192
# --- Server-Modus und Config-Steuerung ---
# Der Server-Modus kann auf "internet" oder "lan" gesetzt werden. Im Internet-Modus wird eine Verbindung zum Masterserver hergestellt, um den Server öffentlich sichtbar zu machen.
# Im LAN-Modus wird keine Verbindung zum Masterserver hergestellt, und der Server ist nur im lokalen Netzwerk sichtbar.
SERVER_MODE=internet
# Wenn FORCE_CONFIG_UPDATE auf true gesetzt ist, wird die Server-Konfiguration bei jedem Start des Containers überschrieben.
# Dies kann nützlich sein, wenn du Änderungen an der .env-Datei vornimmst und sicherstellen möchtest, dass diese Änderungen angewendet werden.
# In einer Produktionsumgebung sollte dieser Wert jedoch auf false belassen werden, um zu verhindern, dass die Konfiguration versehentlich überschrieben wird.
FORCE_CONFIG_UPDATE=false
# --- Debugging ---
# Setze diesen Wert auf true, um PHP-Fehlermeldungen anzuzeigen. Dies kann bei der Fehlersuche hilfreich sein, sollte aber in einer Produktionsumgebung auf false belassen werden.
PHP_DISPLAY_ERRORS=false
# --- RemoteCP-Datenbank ---
# --- MariaDB ---
# Bitte ändere das Root-Passwort für MariaDB, um die Sicherheit deiner Datenbank zu gewährleisten.
MARIADB_ROOT_PASSWORD="RAPjY2FLtLoLDYU"
# --- RemoteCP-Datenbankzugang ---
# Diese Zugangsdaten werden von RemoteCP verwendet, um sich mit der Datenbank zu verbinden. Ändere diese Werte, um die Sicherheit deiner Datenbank zu gewährleisten.
REMOTECP_DB_HOST=mariadb
REMOTECP_DB_NAME=remotecp
REMOTECP_DB_USER=remotecp
REMOTECP_DB_PASSWORD="6MP2mBdF9TBtdmN"
# --- XAseco ---
# XAseco ist ein Server-Controller, der Rekorde, Karma, Jukebox und vieles mehr verwaltet.
# Setze XASECO_ENABLED auf false, um XAseco zu deaktivieren.
XASECO_ENABLED=true
# Dein Spieler-Login (wird als MasterAdmin und Admin in XAseco eingetragen)
XASECO_MASTERADMIN_LOGIN=
# XAseco-Datenbankzugang
# Bitte ändere die Zugangsdaten für die XAseco-Datenbank, um die Sicherheit deiner Datenbank zu gewährleisten.
XASECO_DB_HOST=mariadb
XASECO_DB_NAME=xaseco
XASECO_DB_USER=xaseco
XASECO_DB_PASSWORD="4KpL8mWnR3xYvBq"
# Dedimania-Nation (3-Zeichen IOC-Code, z.B. DEU, AUT, CHE)
# Server-Login und -Passwort werden automatisch aus SERVER_LOGIN / SERVER_LOGIN_PASSWORD übernommen.
XASECO_DEDIMANIA_NATION=DEU
+1
View File
@@ -0,0 +1 @@
*.sh text eol=lf
+5
View File
@@ -0,0 +1,5 @@
# Umgebungsvariablen (enthaelt Passwoerter!)
.env
# Persistente Server-Daten
data/
+151 -19
View File
@@ -1,29 +1,161 @@
FROM debian:stretch-slim FROM debian:bullseye-slim
RUN mkdir /opt/tmserver RUN mkdir /opt/tmserver
WORKDIR /opt/tmserver WORKDIR /opt/tmserver
COPY TrackmaniaServer_2011-02-21.zip /opt/tmserver # Alle benoetigten Pakete in einem Layer installieren und Cache aufraeumen
RUN apt-get update && apt-get install -y unzip RUN apt-get update && apt-get install -y --no-install-recommends \
RUN unzip /opt/tmserver/TrackmaniaServer_2011-02-21.zip -d /opt/tmserver unzip \
COPY custom_game_settings.txt /opt/tmserver/GameData/Tracks/MatchSettings/ apache2 \
COPY RunTrackmaniaServer.sh /opt/tmserver/ php \
php-zip \
php-xml \
php-mbstring \
php-mysql \
php-curl \
default-mysql-client \
&& rm -rf /var/lib/apt/lists/*
RUN apt-get -y install apache2 php php-zip php-xml # Apache mod_rewrite aktivieren und AllowOverride fuer .htaccess (RemoteCP-Sicherheit)
COPY AdminServ_v2.1.1.zip /var/www/html RUN a2enmod rewrite \
RUN unzip /var/www/html/AdminServ_v2.1.1.zip -d /var/www/html && sed -i '/<Directory \/var\/www\/>/,/<\/Directory>/ s/AllowOverride None/AllowOverride All/' /etc/apache2/apache2.conf
RUN chmod -R 777 /var/www/html/
RUN rm -f /var/www/html/index.html
ARG SERVER_NAME='Trackmania Server' COPY assets/bin/TrackmaniaServer_2011-02-21.zip /opt/tmserver
ARG SERVER_DESC='This is a Trackmania Server' RUN unzip /opt/tmserver/TrackmaniaServer_2011-02-21.zip -d /opt/tmserver \
ARG SERVER_SA_PASSWORD='SuperAdmin' && rm -f /opt/tmserver/TrackmaniaServer_2011-02-21.zip
ARG SERVER_ADM_PASSWORD='Admin'
ENV SERVER_NAME $SERVER_NAME # Custom-Konfiguration ueber die Standard-Config aus dem ZIP kopieren
ENV SERVER_DESC $SERVER_DESC COPY assets/config/dedicated_cfg.txt /opt/tmserver/GameData/Config/dedicated_cfg.txt
ENV SERVER_SA_PASSWORD $SERVER_SA_PASSWORD COPY assets/config/custom_game_settings.txt /opt/tmserver/GameData/Tracks/MatchSettings/
ENV SERVER_ADM_PASSWORD $SERVER_ADM_PASSWORD
# 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
COPY assets/bin/RunTrackmaniaServer.sh /opt/tmserver/
RUN sed -i 's/\r$//' /opt/tmserver/RunTrackmaniaServer.sh \
&& chmod +x /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 \
&& rm -f /var/www/html/index.html \
&& mkdir -p /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/
# RemoteCP installieren (als Subpath /remotecp/)
COPY assets/bin/remoteCP_v4.0.3.5.zip /var/www/html
RUN unzip /var/www/html/remoteCP_v4.0.3.5.zip -d /var/www/html \
&& mv /var/www/html/remoteCP_4.0.3.5-1 /var/www/html/remotecp \
&& rm -f /var/www/html/remoteCP_v4.0.3.5.zip \
&& mkdir -p /var/www/html/remotecp/cache \
&& chmod -R 777 /var/www/html/remotecp/cache \
&& chmod -R 666 /var/www/html/remotecp/xml/*.xml \
&& chmod -R 777 /var/www/html/remotecp/xml \
&& chmod -R 777 /var/www/html/remotecp/xml/settings \
&& chown -R www-data:www-data /var/www/html/remotecp/
# 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
# XAseco installieren
COPY assets/bin/xaseco_v1.16.zip /opt/tmserver/
RUN unzip /opt/tmserver/xaseco_v1.16.zip -d /opt/tmserver/ \
&& rm -f /opt/tmserver/xaseco_v1.16.zip \
# newinstall-Dateien in den Hauptordner verschieben
&& cp /opt/tmserver/xaseco/newinstall/access.xml /opt/tmserver/xaseco/ \
&& cp /opt/tmserver/xaseco/newinstall/adminops.xml /opt/tmserver/xaseco/ \
&& cp /opt/tmserver/xaseco/newinstall/Aseco.sh /opt/tmserver/xaseco/ \
&& cp /opt/tmserver/xaseco/newinstall/AsecoF.sh /opt/tmserver/xaseco/ \
&& cp /opt/tmserver/xaseco/newinstall/autotime.xml /opt/tmserver/xaseco/ \
&& cp /opt/tmserver/xaseco/newinstall/bannedips.xml /opt/tmserver/xaseco/ \
&& cp /opt/tmserver/xaseco/newinstall/config.xml /opt/tmserver/xaseco/ \
&& cp /opt/tmserver/xaseco/newinstall/dedimania.xml /opt/tmserver/xaseco/ \
&& cp /opt/tmserver/xaseco/newinstall/html.tpl /opt/tmserver/xaseco/ \
&& cp /opt/tmserver/xaseco/newinstall/localdatabase.xml /opt/tmserver/xaseco/ \
&& cp /opt/tmserver/xaseco/newinstall/matchsave.xml /opt/tmserver/xaseco/ \
&& cp /opt/tmserver/xaseco/newinstall/musicserver.xml /opt/tmserver/xaseco/ \
&& cp /opt/tmserver/xaseco/newinstall/plugins.xml /opt/tmserver/xaseco/ \
&& cp /opt/tmserver/xaseco/newinstall/rasp.xml /opt/tmserver/xaseco/ \
&& cp /opt/tmserver/xaseco/newinstall/text.tpl /opt/tmserver/xaseco/ \
# Die drei PHP-Dateien nach includes/
&& cp /opt/tmserver/xaseco/newinstall/jfreu.config.php /opt/tmserver/xaseco/includes/ \
&& cp /opt/tmserver/xaseco/newinstall/rasp.settings.php /opt/tmserver/xaseco/includes/ \
&& cp /opt/tmserver/xaseco/newinstall/votes.config.php /opt/tmserver/xaseco/includes/ \
# Start-Scripte ausfuehrbar machen
&& chmod +x /opt/tmserver/xaseco/Aseco.sh \
&& chmod +x /opt/tmserver/xaseco/AsecoF.sh \
# newinstall-Ordner aufraeumen
&& rm -rf /opt/tmserver/xaseco/newinstall
# Nicht mehr verfuegbare Plugins deaktivieren (freezone entfernen, teamspeak3 auskommentieren)
RUN sed -i '/<plugin>plugin\.freezone\.php<\/plugin>/d' /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)
RUN cp -r /opt/tmserver/xaseco /opt/tmserver/default-xaseco
# PHP-Debug-Konfiguration: wird zur Laufzeit vom Startup-Script gesetzt
# (kein Rebuild noetig nur Container neustarten)
# --- Umgebungsvariablen ---
# Sensible Werte (Passwoerter, Keys) werden NICHT im Image hinterlegt,
# sondern muessen zur Laufzeit uebergeben werden (z.B. via .env-Datei).
# Server-Optionen (nicht-sensible Standardwerte)
ENV SERVER_NAME="Trackmania Server"
ENV SERVER_DESC="Powered by tmserver-docker"
ENV SERVER_HIDE=0
ENV SERVER_MAX_PLAYERS=32
ENV SERVER_MAX_SPECTATORS=32
ENV SERVER_LADDER_MODE=forced
# Netzwerk
ENV SERVER_PORT=2350
ENV SERVER_P2P_PORT=3450
ENV SERVER_XMLRPC_PORT=5000
ENV SERVER_UPLOAD_RATE=512
ENV SERVER_DOWNLOAD_RATE=8192
# Server-Modus und Config-Steuerung
ENV SERVER_MODE=internet
ENV FORCE_CONFIG_UPDATE=false
# RemoteCP
ENV REMOTECP_DB_HOST=mariadb
ENV REMOTECP_DB_NAME=remotecp
ENV REMOTECP_DB_USER=remotecp
# XAseco
ENV XASECO_ENABLED=true
ENV XASECO_MASTERADMIN_LOGIN=""
ENV XASECO_DB_HOST=mariadb
ENV XASECO_DB_NAME=xaseco
ENV XASECO_DB_USER=xaseco
ENV XASECO_DEDIMANIA_NATION=DEU
# Debugging
ENV PHP_DISPLAY_ERRORS=false
# Volumes fuer persistente Daten
VOLUME /opt/tmserver/GameData
VOLUME /var/www/html
VOLUME /opt/tmserver/xaseco
EXPOSE 5000/tcp EXPOSE 5000/tcp
EXPOSE 2350/tcp EXPOSE 2350/tcp
+88
View File
@@ -0,0 +1,88 @@
MIT-Lizenz
Copyright © 2019 lduriez (Original: https://github.com/lduriez/tmserver-docker)
Copyright © 2026 Patrick Asmus
---
Lizenzinhaber
Name: Patrick Asmus (scriptos)
Email: support@techniverse.net
Website: https://www.patrick-asmus.de
Blog: https://www.cleveradmin.de
---
Hiermit wird jeder Person, die eine Kopie dieser Software und der zugehörigen
Dokumentationsdateien (die „Software") erhält, kostenlos die Erlaubnis erteilt,
uneingeschränkt mit der Software zu handeln, einschließlich und ohne
Einschränkung der Rechte, die Software zu verwenden, zu kopieren, zu
verändern, zusammenzuführen, zu veröffentlichen, zu verbreiten,
unterzulizenzieren und/oder Kopien der Software zu verkaufen, und Personen,
denen die Software zur Verfügung gestellt wird, dies unter den folgenden
Bedingungen zu gestatten:
Der obige Urheberrechtshinweis und dieser Genehmigungshinweis müssen in allen
Kopien oder wesentlichen Teilen der Software enthalten sein. Bei jeglicher
Weiterverarbeitung, Veröffentlichung oder Verbreitung der Software müssen der
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
STILLSCHWEIGENDE GEWÄHRLEISTUNG ZUR VERFÜGUNG GESTELLT, EINSCHLIESSLICH,
ABER NICHT BESCHRÄNKT AUF DIE GEWÄHRLEISTUNG DER MARKTGÄNGIGKEIT, DER
EIGNUNG FÜR EINEN BESTIMMTEN ZWECK UND DER NICHTVERLETZUNG VON RECHTEN
DRITTER. IN KEINEM FALL HAFTEN DIE AUTOREN ODER URHEBERRECHTSINHABER FÜR
JEGLICHE ANSPRÜCHE, SCHÄDEN ODER SONSTIGE HAFTUNG, OB AUS VERTRAG,
UNERLAUBTER HANDLUNG ODER ANDERWEITIG, DIE SICH AUS ODER IN VERBINDUNG MIT
DER SOFTWARE ODER DER NUTZUNG ODER ANDEREN GESCHÄFTEN MIT DER SOFTWARE
ERGEBEN.
===============================================================================
Hinweise zu enthaltenen Drittanbieter-Tools
===============================================================================
Die oben genannte MIT-Lizenz gilt ausschließlich für den Code, die
Konfiguration und die Container-Arbeit dieses Repositories (tmserver-docker)
von Patrick Asmus. Die folgenden Drittanbieter-Tools werden in diesem Projekt
eingebunden und unterliegen jeweils ihren eigenen Lizenzbedingungen. Alle
Rechte an diesen Tools verbleiben bei den jeweiligen Entwicklern bzw.
Rechteinhabern.
-------------------------------------------------------------------------------
1. AdminServ
-------------------------------------------------------------------------------
Beschreibung: Web-Interface zur Verwaltung von TrackMania Forever und
ManiaPlanet Dedicated Servern.
Ursprünglicher Entwickler: Kev717
Weiterentwicklung: Chris92de
Repository: https://github.com/Chris92de/AdminServ
Lizenz: Keine Lizenzdatei im Repository vorhanden.
Alle Rechte verbleiben bei den jeweiligen Entwicklern
(Kev717, Chris92de und weitere Mitwirkende).
-------------------------------------------------------------------------------
2. remoteCP
-------------------------------------------------------------------------------
Beschreibung: Remote-Control-Panel für TrackMania Server.
Entwickler: hal.sascha
Lizenz: GNU Lesser General Public License (LGPL)
https://www.gnu.org/licenses/lgpl-3.0.html
Hinweis: Alle Rechte verbleiben beim Entwickler hal.sascha.
-------------------------------------------------------------------------------
3. XASECO
-------------------------------------------------------------------------------
Beschreibung: Server-Controller für TrackMania (Nations/Forever).
Basiert auf ASECO von Florian Schnell und RASP von
Eyez (Iain Surgey) & Assembler Maniac (Brad Mettee).
Entwickler: Xymph (Frans P. de Vries)
Copyright: © 2007-2026 Frans P. de Vries
Website: https://www.xaseco.org
Kontakt: tm@gamers.org
Lizenz: Keine explizite Open-Source-Lizenz im Projekt angegeben.
Alle Rechte verbleiben bei Frans P. de Vries (Xymph)
und den ursprünglichen Autoren von ASECO und RASP.
===============================================================================
+61 -52
View File
@@ -1,77 +1,86 @@
# tmserver-docker # tmserver-docker
Trackmania Nation Forever Docker Server Trackmania Nations Forever Docker Server
You can find it on Docker Hub [lduriez/tmserver](https://hub.docker.com/r/lduriez/tmserver) > **Hinweis:** Dieses Projekt ist ein Fork von [lduriez/tmserver-docker](https://github.com/lduriez/tmserver-docker?tab=readme-ov-file).
Only lan dedicated is enable (internet dedicated will be added in future version) Der Server unterstützt sowohl den **Internet-Dedicated-Modus** (Standard) als auch den **LAN-Dedicated-Modus**.
Server management webui provided base on [AdminServ](https://github.com/Chris92de/AdminServ) ## Schnellstart
## Running ### 1. Umgebungsvariablen einrichten
On a docker environment simply do the following
```bash ```bash
docker run -d -p 2350:2350 -p 3450:3450 -p 80:80 --name tm-server lduriez/tmserver cp .env.example .env
``` ```
You can add environment variable to modify default values : [#Environment variables](#environment-variables) Passe die Werte in der `.env`-Datei an deine Umgebung an (Passwörter, Masterserver-Account, etc.).
### Configure Server Management Webui > **⚠ Sicherheitshinweis:** Die `.env.example` enthält **vorgenerierte Beispiel-Passwörter**. Diese dienen nur als Platzhalter und sind öffentlich einsehbar! **Ändere unbedingt alle Passwörter**, bevor du den Server produktiv einsetzt.
Visit `http:<host-server-of-the-conntainer>` and start configuration by setting the password of your choice. ### 2. Server starten
This password will be the AdminServ password for configurations (add TM server)
Then add TM server information (you can let all by default). Be sure that `Address` is set to `localhost` in order to manage our embed server. ```bash
docker compose up -d --build
```
Once you saved, you can go to Servers list by pushing "Servers" button and then go to management server list with button "Back". ### 3. Verwaltungsoberflächen öffnen
You should see the server you added, in the to banner you ca go to the management environment. - **AdminServ:** `http://<host-ip>/`
Select the server you want to manage, the admin level you want to go in, and tape the password of this admion level. - **RemoteCP:** `http://<host-ip>/remotecp/`
By default `SuperAdmin` password is `SuperAdmin`, `Admin` password is `Admin`, `User` password is `User`. (You can modify the admin level in configuration settings `http:<host-server-of-the-conntainer>/config`) > **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`.
Congratulation you can now manage your TM server. ## Projektstruktur
Enjoy your game. ```
├── 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
```
## Exposed ports ## Dokumentation
* 2350/tcp game server port Die vollständige Dokumentation befindet sich im Ordner [`docs/`](docs/README.md):
* 2350/udp game server port
* 3450/tcp p2p game server port
* 80/tcp server management webui port
## Environment variables - [Schnellstart](docs/schnellstart.md) Erste Schritte und minimale Konfiguration
- [Konfiguration](docs/konfiguration.md) Persistente Serverkonfiguration (dedicated_cfg.txt)
- [Umgebungsvariablen](docs/umgebungsvariablen.md) Alle verfügbaren Umgebungsvariablen
- [Server-Modi](docs/server-modi.md) LAN- und Internet-Dedicated-Modus
- [AdminServ](docs/adminserv.md) Einrichtung der Server-Verwaltungsoberfläche
- [RemoteCP](docs/remotecp.md) Alternative Server-Verwaltungsoberfläche
- [XAseco](docs/xaseco.md) Server-Controller für Rekorde, Karma und Jukebox
- [Ports](docs/ports.md) Freigegebene Ports und deren Verwendung
* SERVER_NAME name of your server (default is 'Trackmania Server') ---
* SERVER_DESC description of your server (default is 'This is a Trackmania Server')
* SERVER_SA_PASSWORD superadmin management password (default is 'SuperAdmin')
* SERVER_ADM_PASSWORD admin management password (default is 'Admin')
## Commit convention 📝 **Blog:** [www.cleveradmin.de](https://www.cleveradmin.de)
🌐 **Webseite:** [www.patrick-asmus.de](https://www.patrick-asmus.de)
📧 **E-Mail:** [support@techniverse.net](mailto:support@techniverse.net)
Format : `<type>(<portée>): <sujet>` <p align="center">
<img src="https://assets.techniverse.net/f1/git/graphics/gray0-catonline.svg" alt="">
</p>
### type <p align="center">
<img src="https://assets.techniverse.net/f1/logos/small/license.png" alt="License" width="15" height="15"> <a href="./LICENSE">License</a> | <img src="https://assets.techniverse.net/f1/logos/small/matrix2.svg" alt="Matrix" width="15" height="15"> <a href="https://matrix.to/#/#community:techniverse.net">Matrix</a> | <img src="https://assets.techniverse.net/f1/logos/small/mastodon2.svg" alt="Mastodon" width="15" height="15"> <a href="https://social.techniverse.net/@donnerwolke">Mastodon</a>
* `build` : changements qui affectent le système de build ou des dépendances externes (npm, make…) </p>
* `ci` : changements concernant les fichiers et scripts dintégration ou de configuration (Travis, Ansible, BrowserStack…)
* `feat` : ajout dune nouvelle fonctionnalité
* `fix` : correction dun bug
* `perf` : amélioration des performances
* `refactor` : modification qui napporte ni nouvelle fonctionnalité ni damélioration de performances
* `style` : changement qui napporte aucune altération fonctionnelle ou sémantique (indentation, mise en forme, ajout despace, renommante dune variable…)
* `docs` : rédaction ou mise à jour de documentation
* `test` : ajout ou modification de tests
* `revert` : annuler un précédent commit, forme `revert sujet du commit annulé hash du commit annulé`
### sujet
* `add`
* `change`
* `update`
* `remove`
[source](https://buzut.net/git-bien-nommer-ses-commits/)
-17
View File
@@ -1,17 +0,0 @@
#!/bin/sh
echo "Starting apache server"
service apache2 start
echo "Setting ENV/ARG variables"
sed -i "s/<password>SuperAdmin/<password>${SERVER_SA_PASSWORD}/" /opt/tmserver/GameData/Config/dedicated_cfg.txt
sed -i "s/<password>Admin/<password>${SERVER_ADM_PASSWORD}/" /opt/tmserver/GameData/Config/dedicated_cfg.txt
sed -i "s/<name></<name>${SERVER_NAME}</" /opt/tmserver/GameData/Config/dedicated_cfg.txt
sed -i "s/<comment></<comment>${SERVER_DESC}</" /opt/tmserver/GameData/Config/dedicated_cfg.txt
sed -i "s/<xmlrpc_allowremote>False/<xmlrpc_allowremote>True/" /opt/tmserver/GameData/Config/dedicated_cfg.txt
echo "Server config dedicated_cfg.txt is"
cat /opt/tmserver/GameData/Config/dedicated_cfg.txt
echo "Launching Server"
exec ./TrackmaniaServer /dedicated_cfg=dedicated_cfg.txt /game_settings=MatchSettings/custom_game_settings.txt /nodaemon /lan
View File
+488
View File
@@ -0,0 +1,488 @@
#!/bin/sh
# ============================================================
# PHP-Debug-Modus konfigurieren (per Umgebungsvariable)
# ============================================================
PHP_DISPLAY_ERRORS="${PHP_DISPLAY_ERRORS:-false}"
PHP_INI_DIR=$(find /etc/php -type d -name "conf.d" -path "*/apache2/*" | head -1)
if [ "$PHP_DISPLAY_ERRORS" = "true" ]; then
echo "==> PHP-Debug-Modus AKTIVIERT (PHP_DISPLAY_ERRORS=true)"
cat > "$PHP_INI_DIR/99-adminserv-debug.ini" <<EOF
display_errors = On
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
log_errors = On
error_log = /var/log/php_errors.log
EOF
else
echo "==> PHP-Debug-Modus deaktiviert"
cat > "$PHP_INI_DIR/99-adminserv-debug.ini" <<EOF
display_errors = Off
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
log_errors = On
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_CONTROLPANEL="/opt/tmserver/default-controlpanel"
if [ ! -f "$ADMINSERV_DIR/index.php" ]; then
echo "==> Erster Start erkannt: Kopiere AdminServ-Dateien ins Volume..."
cp -r "$DEFAULT_CONTROLPANEL"/* "$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."
# ============================================================
# RemoteCP: Automatische Konfiguration
# ============================================================
REMOTECP_DIR="$ADMINSERV_DIR/remotecp"
if [ -d "$REMOTECP_DIR" ]; then
echo "==> Konfiguriere RemoteCP..."
# DB-Konfiguration aus Umgebungsvariablen
REMOTECP_DB_HOST="${REMOTECP_DB_HOST:-}"
REMOTECP_DB_NAME="${REMOTECP_DB_NAME:-remotecp}"
REMOTECP_DB_USER="${REMOTECP_DB_USER:-remotecp}"
REMOTECP_DB_PASSWORD="${REMOTECP_DB_PASSWORD:-}"
if [ -n "$REMOTECP_DB_HOST" ] && [ -n "$REMOTECP_DB_PASSWORD" ]; then
DB_ENABLED="true"
DB_DSN="mysql:dbname=${REMOTECP_DB_NAME};host=${REMOTECP_DB_HOST}"
else
DB_ENABLED="false"
DB_DSN="mysql:dbname=remotecp;host=localhost"
echo " HINWEIS: Keine DB-Zugangsdaten gesetzt (REMOTECP_DB_HOST/REMOTECP_DB_PASSWORD)."
echo " RemoteCP wird ohne Datenbank konfiguriert. Manuelle Einrichtung moeglich."
fi
# servers.xml: Serververbindung und Datenbank automatisch konfigurieren
SA_PW=$(printf '%s' "${SERVER_SA_PASSWORD:-SuperAdmin}" | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')
SAFE_RCP_NAME=$(printf '%s' "${SERVER_NAME:-Trackmania Server}" | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')
SAFE_DB_DSN=$(printf '%s' "$DB_DSN" | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')
SAFE_DB_USER=$(printf '%s' "$REMOTECP_DB_USER" | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')
SAFE_DB_PW=$(printf '%s' "$REMOTECP_DB_PASSWORD" | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')
cat > "$REMOTECP_DIR/xml/servers.xml" <<EORCPSERV
<?xml version="1.0" encoding="utf-8"?>
<servers>
<server>
<id>1</id>
<login></login>
<name>${SAFE_RCP_NAME}</name>
<settingset></settingset>
<filepath></filepath>
<connection>
<host>127.0.0.1</host>
<port>${XMLRPC_PORT}</port>
<password>${SA_PW}</password>
<communitycode>000000</communitycode>
</connection>
<ftp enabled='false'>
<host>localhost</host>
<port></port>
<username>username</username>
<password>password</password>
<path>/GameData/Tracks/</path>
</ftp>
<sql enabled='${DB_ENABLED}'>
<dsn>${SAFE_DB_DSN}</dsn>
<username>${SAFE_DB_USER}</username>
<password>${SAFE_DB_PW}</password>
</sql>
<lists>
<guestlist>guestlist.txt</guestlist>
<blacklist>blacklist.txt</blacklist>
</lists>
</server>
</servers>
EORCPSERV
# admins.xml: Admin-Zugang aus SuperAdmin-Passwort konfigurieren
RCP_PW="${SERVER_SA_PASSWORD:-SuperAdmin}"
RCP_PW_MD5=$(printf '%s' "$RCP_PW" | md5sum | cut -d' ' -f1)
cat > "$REMOTECP_DIR/xml/admins.xml" <<EORCPADM
<?xml version="1.0"?>
<admins>
<admin>
<id>L1</id>
<active>true</active>
<servers>
<server id='1' group='1' />
</servers>
<username>rcplive</username>
<password>5b8e508f6f4a95bc581a37243d88f07e</password>
<nocode>false</nocode>
<tmaccount>false</tmaccount>
<language>en</language>
<style>default</style>
</admin>
<admin>
<id>G1</id>
<active>true</active>
<servers>
<server id='1' group='G1' />
</servers>
<username>Guest</username>
<password>adb831a7fdd83dd1e2a309ce7591dff8</password>
<nocode>false</nocode>
<tmaccount>false</tmaccount>
<language>en</language>
<style>default</style>
</admin>
<admin>
<id>1</id>
<active>true</active>
<servers>
<server id='1' group='1' />
</servers>
<username>SuperAdmin</username>
<password>${RCP_PW_MD5}</password>
<nocode>false</nocode>
<tmaccount>false</tmaccount>
<language>de</language>
<style>default</style>
</admin>
</admins>
EORCPADM
# ============================================================
# RemoteCP: Datenbank-Initialisierung
# ============================================================
if [ "$DB_ENABLED" = "true" ]; then
echo " Warte auf MariaDB (${REMOTECP_DB_HOST})..."
DB_READY=false
for i in $(seq 1 30); do
if mysql -h "$REMOTECP_DB_HOST" -u "$REMOTECP_DB_USER" -p"$REMOTECP_DB_PASSWORD" "$REMOTECP_DB_NAME" -e "SELECT 1" > /dev/null 2>&1; then
echo " MariaDB erreichbar."
DB_READY=true
break
fi
echo " Versuch $i/30 - MariaDB noch nicht bereit, warte 3s..."
sleep 3
done
if [ "$DB_READY" = "true" ]; then
echo " Importiere RemoteCP-Datenbankschema..."
for sqlfile in "$REMOTECP_DIR"/plugins/*/mysql_*.sql "$REMOTECP_DIR"/live/*/mysql_*.sql; do
if [ -f "$sqlfile" ]; then
echo " -> $(basename "$sqlfile")"
mysql -h "$REMOTECP_DB_HOST" -u "$REMOTECP_DB_USER" -p"$REMOTECP_DB_PASSWORD" "$REMOTECP_DB_NAME" < "$sqlfile"
fi
done
# Installer-Markierung setzen (ueberspringt den Web-Installer)
echo "installed" > "$REMOTECP_DIR/cache/installed"
chown www-data:www-data "$REMOTECP_DIR/cache/installed"
echo " RemoteCP-Datenbank erfolgreich initialisiert."
else
echo " WARNUNG: MariaDB nicht erreichbar nach 90s!"
echo " RemoteCP-Datenbank muss manuell eingerichtet werden."
echo " Installer: http://<host-ip>/remotecp/index.php?page=install"
fi
fi
# Berechtigungen fuer RemoteCP setzen
chmod -R 777 "$REMOTECP_DIR/cache"
chmod -R 777 "$REMOTECP_DIR/xml"
chown -R www-data:www-data "$REMOTECP_DIR/"
echo " RemoteCP-Konfiguration abgeschlossen (Port: ${XMLRPC_PORT}, User: SuperAdmin)."
fi
else
echo "==> Vorhandene AdminServ-Daten gefunden. Keine Aenderungen."
fi
# ============================================================
# XAseco: First-Run-Logik
# ============================================================
# Beim ersten Start (leeres Volume) werden die XAseco-Dateien
# aus dem Default-Template ins Volume kopiert und die
# Konfiguration aus den Umgebungsvariablen angewendet.
# ============================================================
XASECO_DIR="/opt/tmserver/xaseco"
DEFAULT_XASECO="/opt/tmserver/default-xaseco"
XASECO_ENABLED="${XASECO_ENABLED:-true}"
if [ "$XASECO_ENABLED" = "true" ]; then
if [ ! -f "$XASECO_DIR/aseco.php" ]; then
echo "==> Erster Start erkannt: Kopiere XAseco-Dateien ins Volume..."
cp -r "$DEFAULT_XASECO"/* "$XASECO_DIR/"
XMLRPC_PORT="${SERVER_XMLRPC_PORT:-5000}"
XASECO_ADMIN="${XASECO_MASTERADMIN_LOGIN:-}"
SA_PW_XASECO=$(printf '%s' "${SERVER_SA_PASSWORD:-SuperAdmin}" | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')
# --- config.xml: MasterAdmin und TMServer-Verbindung konfigurieren ---
if [ -n "$XASECO_ADMIN" ]; then
SAFE_ADMIN=$(printf '%s' "$XASECO_ADMIN" | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')
# MasterAdmin in die masteradmins-Liste einfuegen (nach <masteradmins>-Tag)
sed -i "/<masteradmins>/a\\
<tmlogin>${SAFE_ADMIN}</tmlogin> <ipaddress></ipaddress>" "$XASECO_DIR/config.xml"
echo " config.xml: MasterAdmin '${XASECO_ADMIN}' gesetzt."
else
echo " HINWEIS: XASECO_MASTERADMIN_LOGIN nicht gesetzt."
echo " Bitte manuell in xaseco/config.xml eintragen!"
fi
sed -i "s|<password>YOUR_SUPERADMIN_PASSWORD</password>|<password>${SA_PW_XASECO}</password>|" "$XASECO_DIR/config.xml"
sed -i "s|<port>5000</port>|<port>${XMLRPC_PORT}</port>|" "$XASECO_DIR/config.xml"
echo " config.xml: TMServer-Verbindung konfiguriert (Port: ${XMLRPC_PORT})."
# --- adminops.xml: Admin-Login eintragen ---
if [ -n "$XASECO_ADMIN" ]; then
SAFE_ADMIN=$(printf '%s' "$XASECO_ADMIN" | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')
sed -i "s|<!-- format:\n.*<tmlogin>YOUR_ADMIN_LOGIN</tmlogin>.*\n.*-->||" "$XASECO_DIR/adminops.xml"
# Admin in die admins-Liste einfuegen
sed -i "/<admins>/a\\
<tmlogin>${SAFE_ADMIN}</tmlogin> <ipaddress></ipaddress>" "$XASECO_DIR/adminops.xml"
echo " adminops.xml: Admin '${XASECO_ADMIN}' eingetragen."
fi
# --- localdatabase.xml: MySQL-Verbindung konfigurieren ---
XASECO_DB_HOST="${XASECO_DB_HOST:-mariadb}"
XASECO_DB_NAME="${XASECO_DB_NAME:-xaseco}"
XASECO_DB_USER="${XASECO_DB_USER:-xaseco}"
XASECO_DB_PASSWORD="${XASECO_DB_PASSWORD:-}"
if [ -n "$XASECO_DB_PASSWORD" ]; then
SAFE_DB_HOST=$(printf '%s' "$XASECO_DB_HOST" | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')
SAFE_DB_USER=$(printf '%s' "$XASECO_DB_USER" | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')
SAFE_DB_PW=$(printf '%s' "$XASECO_DB_PASSWORD" | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')
SAFE_DB_NAME=$(printf '%s' "$XASECO_DB_NAME" | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')
sed -i "s|<mysql_server>localhost</mysql_server>|<mysql_server>${SAFE_DB_HOST}</mysql_server>|" "$XASECO_DIR/localdatabase.xml"
sed -i "s|<mysql_login>YOUR_MYSQL_LOGIN</mysql_login>|<mysql_login>${SAFE_DB_USER}</mysql_login>|" "$XASECO_DIR/localdatabase.xml"
sed -i "s|<mysql_password>YOUR_MYSQL_PASSWORD</mysql_password>|<mysql_password>${SAFE_DB_PW}</mysql_password>|" "$XASECO_DIR/localdatabase.xml"
sed -i "s|<mysql_database>aseco</mysql_database>|<mysql_database>${SAFE_DB_NAME}</mysql_database>|" "$XASECO_DIR/localdatabase.xml"
echo " localdatabase.xml: MySQL-Verbindung konfiguriert (Host: ${XASECO_DB_HOST}, DB: ${XASECO_DB_NAME})."
else
echo " WARNUNG: XASECO_DB_PASSWORD nicht gesetzt!"
echo " XAseco-Datenbank muss manuell in xaseco/localdatabase.xml konfiguriert werden."
fi
# --- dedimania.xml: Server-Account konfigurieren ---
DEDI_LOGIN="${SERVER_LOGIN:-}"
DEDI_PASSWORD="${SERVER_LOGIN_PASSWORD:-}"
DEDI_NATION="${XASECO_DEDIMANIA_NATION:-DEU}"
if [ -n "$DEDI_LOGIN" ] && [ -n "$DEDI_PASSWORD" ]; then
SAFE_DEDI_LOGIN=$(printf '%s' "$DEDI_LOGIN" | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')
SAFE_DEDI_PW=$(printf '%s' "$DEDI_PASSWORD" | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')
SAFE_DEDI_NATION=$(printf '%s' "$DEDI_NATION" | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')
sed -i "s|<login>YOUR_SERVER_LOGIN</login>|<login>${SAFE_DEDI_LOGIN}</login>|" "$XASECO_DIR/dedimania.xml"
sed -i "s|<password>YOUR_SERVER_PASSWORD</password>|<password>${SAFE_DEDI_PW}</password>|" "$XASECO_DIR/dedimania.xml"
sed -i "s|<nation>YOUR_SERVER_NATION</nation>|<nation>${SAFE_DEDI_NATION}</nation>|" "$XASECO_DIR/dedimania.xml"
echo " dedimania.xml: Server-Account konfiguriert (Nation: ${DEDI_NATION})."
else
echo " HINWEIS: SERVER_LOGIN/SERVER_LOGIN_PASSWORD nicht gesetzt."
echo " Dedimania wird ohne Account konfiguriert."
fi
# --- XAseco-Datenbank: Schema importieren ---
if [ -n "$XASECO_DB_PASSWORD" ]; then
echo " Warte auf MariaDB (${XASECO_DB_HOST}) fuer XAseco-DB..."
DB_READY=false
for i in $(seq 1 30); do
if mysql -h "$XASECO_DB_HOST" -u "$XASECO_DB_USER" -p"$XASECO_DB_PASSWORD" "$XASECO_DB_NAME" -e "SELECT 1" > /dev/null 2>&1; then
echo " MariaDB erreichbar."
DB_READY=true
break
fi
echo " Versuch $i/30 - MariaDB noch nicht bereit, warte 3s..."
sleep 3
done
if [ "$DB_READY" = "true" ]; then
echo " Importiere XAseco-Datenbankschema..."
for sqlfile in "$XASECO_DIR"/localdb/*.sql; do
if [ -f "$sqlfile" ]; then
echo " -> $(basename "$sqlfile")"
mysql -h "$XASECO_DB_HOST" -u "$XASECO_DB_USER" -p"$XASECO_DB_PASSWORD" "$XASECO_DB_NAME" < "$sqlfile"
fi
done
echo " XAseco-Datenbank erfolgreich initialisiert."
else
echo " WARNUNG: MariaDB nicht erreichbar nach 90s!"
echo " XAseco-Datenbankschema muss manuell importiert werden."
fi
fi
echo " XAseco-Konfiguration abgeschlossen."
else
echo "==> Vorhandene XAseco-Daten gefunden. Keine Aenderungen."
fi
fi
echo "Starting apache server"
service apache2 start
CONFIG="/opt/tmserver/GameData/Config/dedicated_cfg.txt"
GAMEDATA_DIR="/opt/tmserver/GameData"
DEFAULT_GAMEDATA="/opt/tmserver/default-gamedata"
# ============================================================
# Persistente GameData: First-Run-Logik
# ============================================================
# Beim ersten Start (leeres Volume) wird das gesamte GameData-
# Verzeichnis aus dem Default-Template ins Volume kopiert und
# die Umgebungsvariablen auf die Config angewendet.
# Bei weiteren Starts wird die vorhandene Konfiguration beibehalten,
# damit manuelle Aenderungen nicht ueberschrieben werden.
# Mit FORCE_CONFIG_UPDATE=true kann ein erneutes Anwenden erzwungen werden.
# ============================================================
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..."
echo " ACHTUNG: Manuelle Aenderungen an den betroffenen Feldern werden ueberschrieben!"
# Template neu kopieren, damit alle Platzhalter vorhanden sind
cp "$DEFAULT_GAMEDATA/Config/dedicated_cfg.txt" "$CONFIG"
APPLY_ENV=true
else
echo "==> Vorhandene Konfiguration gefunden. Umgebungsvariablen werden NICHT angewendet."
echo " Zum erneuten Anwenden: FORCE_CONFIG_UPDATE=true setzen."
APPLY_ENV=false
fi
# ============================================================
# Platzhalter in dedicated_cfg.txt durch Umgebungsvariablen ersetzen
# ============================================================
if [ "$APPLY_ENV" = "true" ]; then
echo "Ersetze Platzhalter in dedicated_cfg.txt mit Umgebungsvariablen..."
# Authentifizierung
sed -i "s|%%SERVER_SA_PASSWORD%%|${SERVER_SA_PASSWORD}|g" "$CONFIG"
sed -i "s|%%SERVER_ADM_PASSWORD%%|${SERVER_ADM_PASSWORD}|g" "$CONFIG"
sed -i "s|%%SERVER_USER_PASSWORD%%|${SERVER_USER_PASSWORD}|g" "$CONFIG"
# Masterserver-Account
sed -i "s|%%SERVER_LOGIN%%|${SERVER_LOGIN}|g" "$CONFIG"
sed -i "s|%%SERVER_LOGIN_PASSWORD%%|${SERVER_LOGIN_PASSWORD}|g" "$CONFIG"
sed -i "s|%%SERVER_VALIDATION_KEY%%|${SERVER_VALIDATION_KEY}|g" "$CONFIG"
# Server-Optionen
sed -i "s|%%SERVER_NAME%%|${SERVER_NAME}|g" "$CONFIG"
sed -i "s|%%SERVER_DESC%%|${SERVER_DESC}|g" "$CONFIG"
sed -i "s|%%SERVER_HIDE%%|${SERVER_HIDE}|g" "$CONFIG"
sed -i "s|%%SERVER_MAX_PLAYERS%%|${SERVER_MAX_PLAYERS}|g" "$CONFIG"
sed -i "s|%%SERVER_PASSWORD%%|${SERVER_PASSWORD}|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_LADDER_MODE%%|${SERVER_LADDER_MODE}|g" "$CONFIG"
# Netzwerk
sed -i "s|%%SERVER_PORT%%|${SERVER_PORT}|g" "$CONFIG"
sed -i "s|%%SERVER_P2P_PORT%%|${SERVER_P2P_PORT}|g" "$CONFIG"
sed -i "s|%%SERVER_XMLRPC_PORT%%|${SERVER_XMLRPC_PORT}|g" "$CONFIG"
sed -i "s|%%SERVER_UPLOAD_RATE%%|${SERVER_UPLOAD_RATE}|g" "$CONFIG"
sed -i "s|%%SERVER_DOWNLOAD_RATE%%|${SERVER_DOWNLOAD_RATE}|g" "$CONFIG"
echo "Platzhalter erfolgreich ersetzt."
fi
# Bestimme Server-Modus (Standard: internet)
SERVER_MODE="${SERVER_MODE:-internet}"
if [ "$SERVER_MODE" = "internet" ]; then
echo "Configuring Internet-Dedicated mode"
if [ -z "$SERVER_LOGIN" ] || [ -z "$SERVER_VALIDATION_KEY" ]; then
echo "ERROR: SERVER_LOGIN and SERVER_VALIDATION_KEY are required for Internet-Dedicated mode."
echo "Set SERVER_MODE=lan to start in LAN mode, or provide the required variables."
exit 1
fi
LAUNCH_MODE="/internet"
else
echo "Configuring LAN-Dedicated mode"
LAUNCH_MODE="/lan"
fi
echo "Server config dedicated_cfg.txt is"
cat "$CONFIG"
echo "Launching Server in ${SERVER_MODE} mode"
./TrackmaniaServer /dedicated_cfg=dedicated_cfg.txt /game_settings=MatchSettings/custom_game_settings.txt /nodaemon ${LAUNCH_MODE} &
TM_PID=$!
echo "TrackmaniaServer gestartet (PID: ${TM_PID})"
# ============================================================
# XAseco starten (nach TrackmaniaServer)
# ============================================================
if [ "${XASECO_ENABLED:-true}" = "true" ] && [ -f "/opt/tmserver/xaseco/aseco.php" ]; then
echo "==> Warte auf TrackmaniaServer XMLRPC..."
XMLRPC_PORT="${SERVER_XMLRPC_PORT:-5000}"
XMLRPC_READY=false
for i in $(seq 1 30); do
if php -r "@fsockopen('127.0.0.1', ${XMLRPC_PORT}, \$e, \$m, 2) ? exit(0) : exit(1);" 2>/dev/null; then
XMLRPC_READY=true
break
fi
sleep 2
done
if [ "$XMLRPC_READY" = "true" ]; then
echo "==> Starte XAseco..."
cd /opt/tmserver/xaseco
php aseco.php TMN </dev/null >>aseco.log 2>&1 &
XASECO_PID=$!
echo " XAseco gestartet (PID: ${XASECO_PID})"
cd /opt/tmserver
else
echo " WARNUNG: XMLRPC-Port ${XMLRPC_PORT} nicht erreichbar nach 60s!"
echo " XAseco wurde NICHT gestartet. Bitte manuell starten."
fi
else
if [ "${XASECO_ENABLED:-true}" != "true" ]; then
echo "==> XAseco ist deaktiviert (XASECO_ENABLED=${XASECO_ENABLED})."
fi
fi
# Auf TrackmaniaServer warten (Hauptprozess)
wait $TM_PID
Binary file not shown.
Binary file not shown.
+92
View File
@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8" ?>
<dedicated>
<authorization_levels>
<level>
<name>SuperAdmin</name>
<password>%%SERVER_SA_PASSWORD%%</password>
</level>
<level>
<name>Admin</name>
<password>%%SERVER_ADM_PASSWORD%%</password>
</level>
<level>
<name>User</name>
<password>%%SERVER_USER_PASSWORD%%</password>
</level>
</authorization_levels>
<masterserver_account>
<login>%%SERVER_LOGIN%%</login>
<password>%%SERVER_LOGIN_PASSWORD%%</password>
<validation_key>%%SERVER_VALIDATION_KEY%%</validation_key>
</masterserver_account>
<server_options>
<name>%%SERVER_NAME%%</name>
<comment>%%SERVER_DESC%%</comment>
<hide_server>%%SERVER_HIDE%%</hide_server> <!-- value is 0 (always shown), 1 (always hidden), 2 (hidden from nations) -->
<max_players>%%SERVER_MAX_PLAYERS%%</max_players>
<password>%%SERVER_PASSWORD%%</password>
<max_spectators>%%SERVER_MAX_SPECTATORS%%</max_spectators>
<password_spectator>%%SERVER_SPEC_PASSWORD%%</password_spectator>
<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_max>50000</ladder_serverlimit_max>
<enable_p2p_upload>True</enable_p2p_upload>
<enable_p2p_download>True</enable_p2p_download>
<callvote_timeout>60000</callvote_timeout>
<callvote_ratio>0.5</callvote_ratio> <!-- default ratio. value in [0..1], or -1 to forbid. -->
<callvote_ratios>
<voteratio command="Ban" ratio="0.65"/>
<!-- commands can be "Ban", "Kick", "ChallengeRestart", "NextChallenge", ... -->
</callvote_ratios>
<allow_challenge_download>False</allow_challenge_download>
<autosave_replays>True</autosave_replays>
<autosave_validation_replays>True</autosave_validation_replays>
<referee_password></referee_password>
<referee_validation_mode>0</referee_validation_mode> <!-- value is 0 (only validate top3 players), 1 (validate all players) -->
<use_changing_validation_seed>False</use_changing_validation_seed>
</server_options>
<system_config>
<connection_uploadrate>%%SERVER_UPLOAD_RATE%%</connection_uploadrate> <!-- Kbps (kilo bits per second) -->
<connection_downloadrate>%%SERVER_DOWNLOAD_RATE%%</connection_downloadrate> <!-- Kbps -->
<force_ip_address></force_ip_address>
<server_port>%%SERVER_PORT%%</server_port>
<server_p2p_port>%%SERVER_P2P_PORT%%</server_p2p_port>
<client_port>0</client_port>
<bind_ip_address></bind_ip_address>
<use_nat_upnp></use_nat_upnp>
<p2p_cache_size>600</p2p_cache_size>
<xmlrpc_port>%%SERVER_XMLRPC_PORT%%</xmlrpc_port>
<xmlrpc_allowremote>True</xmlrpc_allowremote> <!-- If you specify an ip adress here, it'll be the only accepted adress. this will improve security. -->
<blacklist_url></blacklist_url>
<guestlist_filename></guestlist_filename>
<blacklist_filename></blacklist_filename>
<packmask>stadium</packmask>
<allow_spectator_relays>False</allow_spectator_relays>
<!-- <minimum_client_build>2009-10-01</minimum_client_build> -->
<!-- <disable_coherence_checks>laps</disable_coherence_checks> -->
<use_proxy>False</use_proxy>
<proxy_login></proxy_login>
<proxy_password></proxy_password>
</system_config>
</dedicated>
+29
View File
@@ -0,0 +1,29 @@
#!/bin/bash
# ============================================================
# MariaDB Init-Script: XAseco-Datenbank erstellen
# ============================================================
# Wird automatisch beim ersten Start des MariaDB-Containers
# ausgefuehrt (via /docker-entrypoint-initdb.d/).
# Erstellt Datenbank und Benutzer fuer XAseco, sofern die
# entsprechenden Umgebungsvariablen gesetzt sind.
# ============================================================
XASECO_DB_NAME="${XASECO_DB_NAME:-xaseco}"
XASECO_DB_USER="${XASECO_DB_USER:-xaseco}"
XASECO_DB_PASSWORD="${XASECO_DB_PASSWORD:-}"
if [ -z "$XASECO_DB_PASSWORD" ]; then
echo "HINWEIS: XASECO_DB_PASSWORD nicht gesetzt ueberspringe XAseco-DB-Erstellung."
exit 0
fi
echo "Erstelle XAseco-Datenbank '${XASECO_DB_NAME}' und Benutzer '${XASECO_DB_USER}'..."
mariadb -u root -p"${MYSQL_ROOT_PASSWORD}" <<-EOSQL
CREATE DATABASE IF NOT EXISTS \`${XASECO_DB_NAME}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS '${XASECO_DB_USER}'@'%' IDENTIFIED BY '${XASECO_DB_PASSWORD}';
GRANT ALL PRIVILEGES ON \`${XASECO_DB_NAME}\`.* TO '${XASECO_DB_USER}'@'%';
FLUSH PRIVILEGES;
EOSQL
echo "XAseco-Datenbank erfolgreich erstellt."
+58
View File
@@ -0,0 +1,58 @@
services:
tmserver:
build:
context: .
container_name: tmserver
restart: unless-stopped
depends_on:
mariadb:
condition: service_healthy
ports:
- "${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/controlpanel:/var/www/html
- ./data/xaseco:/opt/tmserver/xaseco
networks:
tmserver_net:
ipv4_address: 172.20.60.10
mariadb:
image: mariadb:11.4
container_name: tmserver-mariadb
restart: unless-stopped
env_file:
- .env
environment:
MYSQL_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD}
MYSQL_DATABASE: ${REMOTECP_DB_NAME:-remotecp}
MYSQL_USER: ${REMOTECP_DB_USER:-remotecp}
MYSQL_PASSWORD: ${REMOTECP_DB_PASSWORD}
volumes:
- ./data/mariadb:/var/lib/mysql
- ./assets/db/init-xaseco-db.sh:/docker-entrypoint-initdb.d/20-init-xaseco-db.sh:ro
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
networks:
tmserver_net:
ipv4_address: 172.20.60.11
networks:
tmserver_net:
name: tmserver.dockernetwork.local
driver: bridge
ipam:
config:
- subnet: 172.20.60.0/25
gateway: 172.20.60.1
ip_range: 172.20.60.64/26
+18
View File
@@ -0,0 +1,18 @@
# Dokumentation
Übersicht aller verfügbaren Dokumentationen für den Trackmania Nations Forever Docker Server.
> **Wichtig:** Vor dem ersten Start muss eine `.env`-Datei aus der Vorlage erstellt werden: `cp .env.example .env`
> **⚠ Sicherheitshinweis:** Die `.env.example` enthält **vorgenerierte Beispiel-Passwörter**. Diese dienen nur als Platzhalter und sind öffentlich einsehbar! **Ändere unbedingt alle Passwörter** in der `.env`-Datei, bevor du den Server produktiv einsetzt.
| Dokument | Beschreibung |
|----------|-------------|
| [Schnellstart](schnellstart.md) | Erste Schritte und minimale Konfiguration |
| [Konfiguration](konfiguration.md) | Persistente Serverkonfiguration (dedicated_cfg.txt) |
| [Umgebungsvariablen](umgebungsvariablen.md) | Alle verfügbaren Umgebungsvariablen |
| [Server-Modi](server-modi.md) | LAN- und Internet-Dedicated-Modus |
| [AdminServ](adminserv.md) | Einrichtung der Server-Verwaltungsoberfläche |
| [RemoteCP](remotecp.md) | Alternative Server-Verwaltungsoberfläche |
| [XAseco](xaseco.md) | Server-Controller für Rekorde, Karma und Jukebox |
| [Ports](ports.md) | Freigegebene Ports und deren Verwendung |
+68
View File
@@ -0,0 +1,68 @@
# AdminServ Server-Verwaltungsoberfläche
Die Server-Verwaltungsoberfläche basiert auf [AdminServ](https://github.com/Chris92de/AdminServ) und ist über Port 80 erreichbar.
## Einrichtung
1. `http://<host-server-des-containers>` im Browser aufrufen
2. Ein Passwort festlegen dieses wird als AdminServ-Passwort verwendet
3. TM-Server-Informationen eintragen (Standardwerte können beibehalten werden)
4. `Address` auf `localhost` setzen, um den eingebetteten Server zu verwalten
5. Speichern
## Verbindung zum Server
1. Über den Button „Servers" zur Serverliste navigieren
2. Den gewünschten Server auswählen
3. Admin-Stufe wählen und zugehöriges Passwort eingeben
## Standard-Passwörter
| Stufe | Standard-Passwort |
|-------|-------------------|
| SuperAdmin | `SuperAdmin` |
| Admin | `Admin` |
| User | `User` |
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/controlpanel`) persistent auf dem Host gespeichert. Beim ersten Start werden die Dateien automatisch aus dem Image ins Volume kopiert.
| Host-Pfad | Container-Pfad | Beschreibung |
|-----------|----------------|-------------|
| `./data/controlpanel` | `/var/www/html` | AdminServ- und RemoteCP-Installation |
> **Hinweis:** Im selben Volume befindet sich auch [RemoteCP](remotecp.md) unter `./data/controlpanel/remotecp/`.
## 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/controlpanel/*
# Container neu starten AdminServ wird frisch initialisiert
docker compose up -d
```
+129
View File
@@ -0,0 +1,129 @@
# Konfiguration (dedicated_cfg.txt)
Die Server-Konfiguration wird in der Datei `dedicated_cfg.txt` im Verzeichnis `GameData/Config/` gespeichert. Diese Datei enthält alle wichtigen Parameter für den Serverbetrieb.
Die Template-Konfiguration befindet sich im Repository unter `assets/config/dedicated_cfg.txt`. Sie enthält `%%PLATZHALTER%%` anstelle von echten Werten keine Passwörter oder Zugangsdaten im Repo! Die Platzhalter werden beim ersten Container-Start durch die [Umgebungsvariablen](umgebungsvariablen.md) ersetzt.
## Persistente Speicherung
Das gesamte **GameData-Verzeichnis** wird über ein Bind-Mount (`./data/gamedata`) persistent auf dem Host gespeichert. Das bedeutet:
- Alle Daten (Konfiguration, Tracks, Skins, Scores, Cache, etc.) bleiben erhalten
- Manuelle Änderungen gehen nicht verloren, auch wenn der Container neu erstellt wird
- Dateien können direkt auf dem Host bearbeitet werden
### Volume-Pfade
| Host-Pfad | Container-Pfad | Beschreibung |
|-----------|----------------|-------------|
| `./data/gamedata` | `/opt/tmserver/GameData` | Gesamtes GameData-Verzeichnis |
| `./data/controlpanel` | `/var/www/html` | AdminServ- und RemoteCP-Daten |
| `./data/mariadb` | `/var/lib/mysql` | MariaDB-Datenbankdateien |
### Enthaltene Unterordner
| Ordner | Beschreibung |
|--------|-------------|
| `Config/` | Server-Konfiguration (`dedicated_cfg.txt`, Blacklist, Guestlist) |
| `Tracks/` | Strecken und MatchSettings |
| `Skins/` | Spieler- und Fahrzeug-Skins |
| `Scores/` | Gespeicherte Punktestände |
| `Cache/` | Server-Cache |
| `Profiles/` | Spielerprofile |
| `Replays/` | Gespeicherte Replays |
## Reihenfolge beim Docker-Build
1. ZIP-Archiv wird entpackt → Standard-`dedicated_cfg.txt` aus dem ZIP landet in `GameData/Config/`
2. Template aus `assets/config/dedicated_cfg.txt` (mit `%%PLATZHALTERN%%`) wird darüber kopiert
3. Gesamtes `GameData/`-Verzeichnis wird als Default-Template gesichert
## First-Run-Verhalten
Beim **ersten Start** des Containers (leeres Volume) passiert Folgendes:
1. Das gesamte Default-GameData-Template wird aus dem Image ins Volume kopiert
2. Alle `%%PLATZHALTER%%` in der `dedicated_cfg.txt` werden durch die [Umgebungsvariablen](umgebungsvariablen.md) ersetzt
3. Der Server startet mit der so erzeugten Konfiguration
Bei **weiteren Starts** wird die vorhandene Konfiguration **nicht überschrieben**. Umgebungsvariablen haben dann keine Wirkung mehr auf die `dedicated_cfg.txt`.
## Konfiguration manuell bearbeiten
Nach dem ersten Start kann die Konfiguration direkt auf dem Host bearbeitet werden:
```bash
# Konfiguration direkt auf dem Host bearbeiten
nano ./data/gamedata/Config/dedicated_cfg.txt
# Alternativ: im Container anzeigen
docker exec tmserver cat /opt/tmserver/GameData/Config/dedicated_cfg.txt
# Server neustarten, damit die Änderungen wirksam werden
docker restart tmserver
```
> **Hinweis:** Da `GameData/` als Bind-Mount eingebunden ist, sind Dateien direkt unter `./data/gamedata/` auf dem Host verfügbar ohne `docker cp` oder `docker exec`.
## Konfiguration zurücksetzen (FORCE_CONFIG_UPDATE)
Falls die Umgebungsvariablen erneut auf die Konfiguration angewendet werden sollen (z.B. nach einer Passwortänderung), kann die Variable `FORCE_CONFIG_UPDATE` verwendet werden.
In der `.env`-Datei:
```bash
FORCE_CONFIG_UPDATE=true
```
Oder per `docker run`:
```bash
docker run -d \
--env-file .env \
-e FORCE_CONFIG_UPDATE=true \
-p 2350:2350/tcp \
-p 2350:2350/udp \
-p 3450:3450/tcp \
-p 80:80/tcp \
-v ./data/gamedata:/opt/tmserver/GameData \
-v ./data/controlpanel:/var/www/html \
-v ./data/xaseco:/opt/tmserver/xaseco \
--name tmserver tmserver: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.
## Wichtige Dateien im Config-Ordner
Der Ordner `GameData/Config/` enthält:
| Datei | Beschreibung |
|-------|-------------|
| `dedicated_cfg.txt` | Haupt-Konfigurationsdatei des Servers |
| `blacklist.txt` | Liste gesperrter Spieler |
| `guestlist.txt` | Liste erlaubter Spieler |
| `Default.SystemConfig.Gbx` | System-Konfiguration |
## Wichtige Parameter in der dedicated_cfg.txt
Alle diese Parameter können über [Umgebungsvariablen](umgebungsvariablen.md) gesetzt werden:
| Parameter | Umgebungsvariable | Standard |
|-----------|------------------|----------|
| `<name>` (SuperAdmin-PW) | `SERVER_SA_PASSWORD` | `SuperAdmin` |
| `<name>` (Admin-PW) | `SERVER_ADM_PASSWORD` | `Admin` |
| `<name>` (User-PW) | `SERVER_USER_PASSWORD` | `User` |
| `<login>` | `SERVER_LOGIN` | *(leer)* |
| `<validation_key>` | `SERVER_VALIDATION_KEY` | *(leer)* |
| `<name>` (Servername) | `SERVER_NAME` | `Trackmania Server` |
| `<comment>` | `SERVER_DESC` | `Powered by tmserver-docker` |
| `<hide_server>` | `SERVER_HIDE` | `0` |
| `<max_players>` | `SERVER_MAX_PLAYERS` | `32` |
| `<password>` | `SERVER_PASSWORD` | *(leer)* |
| `<max_spectators>` | `SERVER_MAX_SPECTATORS` | `32` |
| `<ladder_mode>` | `SERVER_LADDER_MODE` | `forced` |
| `<server_port>` | `SERVER_PORT` | `2350` |
| `<server_p2p_port>` | `SERVER_P2P_PORT` | `3450` |
| `<xmlrpc_port>` | `SERVER_XMLRPC_PORT` | `5000` |
| `<connection_uploadrate>` | `SERVER_UPLOAD_RATE` | `512` |
| `<connection_downloadrate>` | `SERVER_DOWNLOAD_RATE` | `8192` |
+26
View File
@@ -0,0 +1,26 @@
# Freigegebene Ports
| Port | Protokoll | Beschreibung |
|------|-----------|-------------|
| 2350 | TCP | Gameserver-Port |
| 2350 | UDP | Gameserver-Port |
| 3450 | TCP | P2P-Gameserver-Port |
| 5000 | TCP | XML-RPC-Port (interne Kommunikation) |
| 80 | TCP | Server-Verwaltungsoberflächen (AdminServ + RemoteCP) |
## Minimale Port-Freigabe
Für den reinen Spielbetrieb ohne Verwaltungsoberfläche reichen die Ports 2350 und 3450:
```bash
docker run -d \
--env-file .env \
-p 2350:2350/tcp \
-p 2350:2350/udp \
-p 3450:3450/tcp \
-v ./data/gamedata:/opt/tmserver/GameData \
-v ./data/xaseco:/opt/tmserver/xaseco \
--name tmserver tmserver:latest
```
> **Hinweis:** Port 5000 (XML-RPC) wird intern von AdminServ verwendet und muss in der Regel nicht nach außen freigegeben werden.
+115
View File
@@ -0,0 +1,115 @@
# RemoteCP Alternative Server-Verwaltungsoberfläche
RemoteCP ist eine weitere Web-Verwaltungsoberfläche für Trackmania-Server, die parallel zu AdminServ installiert ist. Es handelt sich um ein älteres Tool mit eigenem Login-System und eigener Benutzerverwaltung.
## Zugriff
RemoteCP ist als Subpath unter der gleichen Adresse wie AdminServ erreichbar:
- **AdminServ:** `http://<host-ip>/`
- **RemoteCP:** `http://<host-ip>/remotecp/`
## Standard-Zugangsdaten
RemoteCP verwendet die SuperAdmin-Zugangsdaten des Trackmania-Servers:
| Benutzer | Passwort | Beschreibung |
|----------|----------|-------------|
| `SuperAdmin` | Wert aus `SERVER_SA_PASSWORD` | Administrator (volle Rechte) |
| `Guest` | `Guest` | Gast-Zugang (nur Lesen) |
Der Admin-Login für RemoteCP ist identisch mit dem SuperAdmin-Passwort des TM-Servers (`SERVER_SA_PASSWORD`). Es werden keine separaten Zugangsdaten benötigt.
## Umgebungsvariablen
| Variable | Beschreibung | Standard |
|----------|-------------|----------|
| `REMOTECP_DB_HOST` | Hostname des Datenbankservers | `mariadb` |
| `REMOTECP_DB_NAME` | Name der RemoteCP-Datenbank | `remotecp` |
| `REMOTECP_DB_USER` | Datenbank-Benutzername | `remotecp` |
| `REMOTECP_DB_PASSWORD` | Datenbank-Passwort | *(muss gesetzt werden)* |
## Datenbank (MariaDB)
RemoteCP benötigt eine MariaDB-Datenbank für erweiterte Funktionen (Spielerstatistiken, Records, Chat-Nachrichten, etc.). Ein MariaDB-Container wird automatisch als Teil des Docker-Setups bereitgestellt.
### Automatische Einrichtung
Wenn die Datenbank-Variablen in der `.env`-Datei gesetzt sind (`REMOTECP_DB_HOST`, `REMOTECP_DB_PASSWORD`), wird beim ersten Start:
1. Die **MariaDB** erstellt automatisch die Datenbank und den Benutzer (über `MYSQL_DATABASE`, `MYSQL_USER`, `MYSQL_PASSWORD`)
2. Das **Startup-Script** wartet, bis MariaDB erreichbar ist
3. Die **Datenbank-Tabellen** werden automatisch aus den SQL-Schema-Dateien importiert
4. Die **Installer-Markierung** (`cache/installed`) wird gesetzt, damit der Web-Installer übersprungen wird
Es ist kein manuelles Setup über den Web-Installer nötig.
### Manuelle Einrichtung
Falls die automatische Einrichtung nicht gewünscht ist oder fehlschlägt (z.B. MariaDB nicht erreichbar), kann RemoteCP auch manuell eingerichtet werden:
1. Die Datenbank-Variablen (`REMOTECP_DB_HOST`, `REMOTECP_DB_PASSWORD`) **müssen trotzdem in der `.env`-Datei gesetzt sein**, damit die MariaDB die Datenbank und den Benutzer beim ersten Start erstellt
2. RemoteCP-Installer im Browser aufrufen: `http://<host-ip>/remotecp/index.php?page=install`
3. „Install with remoteCP-Database" wählen
4. Die Datenbank-Zugangsdaten eingeben:
- **Database DSN:** `mysql:dbname=remotecp;host=mariadb` (bzw. die Werte aus der `.env`)
- **Database Username:** Wert aus `REMOTECP_DB_USER`
- **Database Password:** Wert aus `REMOTECP_DB_PASSWORD`
5. Server-Daten eingeben (XMLRPC-Port, SuperAdmin-Passwort)
6. Installation abschließen
### Persistente Daten
Die MariaDB-Daten werden über ein eigenes Bind-Mount persistent gespeichert:
| Host-Pfad | Container-Pfad | Beschreibung |
|-----------|----------------|-------------|
| `./data/mariadb` | `/var/lib/mysql` | MariaDB-Datenbankdateien |
> **Hinweis:** Der MariaDB-Container kann auch für weitere Tools genutzt werden. Zusätzliche Datenbanken und Benutzer können über den Root-Zugang (`MARIADB_ROOT_PASSWORD`) erstellt werden.
## Automatische Konfiguration
Beim ersten Start wird RemoteCP automatisch konfiguriert:
- Die **Serververbindung** wird mit dem XML-RPC-Port und dem SuperAdmin-Passwort (`SERVER_SA_PASSWORD`) aus der `.env`-Datei eingerichtet
- Der **Admin-Zugang** verwendet den Benutzernamen `SuperAdmin` mit dem Passwort aus `SERVER_SA_PASSWORD`
- Das Passwort wird als MD5-Hash in der Konfiguration gespeichert
- Die **Datenbankverbindung** wird automatisch in `servers.xml` eingetragen (wenn DB-Variablen gesetzt sind)
## Persistente Speicherung
RemoteCP wird im gleichen Volume wie AdminServ gespeichert:
| Host-Pfad | Container-Pfad | Beschreibung |
|-----------|----------------|-------------|
| `./data/controlpanel/remotecp` | `/var/www/html/remotecp` | RemoteCP-Installation |
Die Konfigurationsdateien befinden sich unter `./data/controlpanel/remotecp/xml/`:
| Datei | Beschreibung |
|-------|-------------|
| `servers.xml` | Server-Verbindungsdaten (Host, Port, Passwort, Datenbank) |
| `admins.xml` | Benutzer und Zugangsdaten |
| `groups.xml` | Berechtigungsgruppen |
## Sicherheit
RemoteCP liefert eine `.htaccess`-Datei mit, die den direkten Zugriff auf XML-Konfigurationsdateien über den Browser verhindert. Apache `mod_rewrite` und `AllowOverride` sind im Image aktiviert, damit dieser Schutz funktioniert.
## Fehlerbehebung
Falls RemoteCP nicht erreichbar ist oder Fehler anzeigt:
1. Prüfe, ob beide Container laufen: `docker ps`
2. MariaDB-Verbindung testen: `docker exec tmserver mysql -h mariadb -u remotecp -p remotecp -e "SELECT 1"`
3. PHP-Debug-Modus aktivieren: `PHP_DISPLAY_ERRORS=true` in der `.env`-Datei setzen
4. Container neu starten: `docker compose restart`
5. PHP-Logs prüfen: `docker exec tmserver cat /var/log/php_errors.log`
6. MariaDB-Logs prüfen: `docker logs tmserver-mariadb`
### Bekannte Hinweise
- 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 Registrierung neuer Benutzer ist standardmäßig aktiviert und kann in `xml/settings/settings.xml` über `<register>false</register>` deaktiviert werden
+96
View File
@@ -0,0 +1,96 @@
# Schnellstart
## Voraussetzungen
- Docker und Docker Compose müssen installiert sein
## 1. Umgebungsvariablen einrichten
Kopiere die Vorlage und passe die Werte an:
```bash
cp .env.example .env
```
Bearbeite die `.env`-Datei und setze mindestens die gewünschten Passwörter. Für den Internet-Modus müssen zusätzlich `SERVER_LOGIN` und `SERVER_VALIDATION_KEY` gesetzt werden.
> **⚠ Sicherheitshinweis:** Die `.env.example` enthält **vorgenerierte Beispiel-Passwörter**. Diese dienen nur als Platzhalter und sind öffentlich einsehbar! **Ändere unbedingt alle Passwörter**, bevor du den Server produktiv einsetzt.
> **Wichtig:** Die `.env`-Datei enthält sensible Daten (Passwörter, Keys) und wird über die `.gitignore` vom Einchecken ausgeschlossen.
## 2. Docker Image bauen
```bash
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`.
## 3. Server starten
### Mit Docker Compose (empfohlen)
```bash
docker compose up -d --build
```
Die Konfiguration erfolgt über die `.env`-Datei, die automatisch eingelesen wird.
### 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.
```bash
docker run -d \
--env-file .env \
-p 2350:2350/tcp \
-p 2350:2350/udp \
-p 3450:3450/tcp \
-p 80:80/tcp \
-v ./data/gamedata:/opt/tmserver/GameData \
-v ./data/controlpanel:/var/www/html \
-v ./data/xaseco:/opt/tmserver/xaseco \
--name tmserver tmserver:latest
```
### LAN-Modus (docker run)
Setze in der `.env`-Datei `SERVER_MODE=lan` oder übergib es direkt:
```bash
docker run -d \
--env-file .env \
-e SERVER_MODE=lan \
-p 2350:2350/tcp \
-p 2350:2350/udp \
-p 3450:3450/tcp \
-p 80:80/tcp \
-v ./data/gamedata:/opt/tmserver/GameData \
-v ./data/controlpanel:/var/www/html \
-v ./data/xaseco:/opt/tmserver/xaseco \
--name tmserver tmserver:latest
```
## 4. Verwaltungsoberflächen öffnen
| Tool | URL | Beschreibung |
|------|-----|-------------|
| AdminServ | `http://<host-ip>/` | Server-Verwaltungsoberfläche |
| RemoteCP | `http://<host-ip>/remotecp/` | Alternative Verwaltungsoberfläche |
Weitere Details unter [AdminServ](adminserv.md) und [RemoteCP](remotecp.md).
## Persistente Konfiguration
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/controlpanel` | `/var/www/html` | AdminServ- und RemoteCP-Daten |
| `./data/xaseco` | `/opt/tmserver/xaseco` | XAseco-Konfiguration und Logs |
| `./data/mariadb` | `/var/lib/mysql` | MariaDB-Datenbankdateien |
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).
+60
View File
@@ -0,0 +1,60 @@
# Server-Modi
Der Trackmania-Server kann in zwei Modi betrieben werden.
## Internet-Dedicated (Standard)
Im Internet-Modus ist der Server über das Trackmania-Masterserver-Netzwerk erreichbar und in der öffentlichen Serverliste sichtbar.
### Voraussetzungen
- Ein Server-Account auf der [Trackmania Players-Seite](https://players.trackmaniaforever.com)
- Die Umgebungsvariablen `SERVER_LOGIN` und `SERVER_VALIDATION_KEY` müssen gesetzt sein
### Konfiguration
In der `.env`-Datei:
```bash
SERVER_MODE=internet
SERVER_LOGIN=dein_login
SERVER_LOGIN_PASSWORD=dein_passwort
SERVER_VALIDATION_KEY=dein_key
```
Wenn `SERVER_LOGIN` oder `SERVER_VALIDATION_KEY` nicht gesetzt sind, bricht der Server mit einer Fehlermeldung ab.
### Server-Account erstellen
1. [players.trackmaniaforever.com](https://players.trackmaniaforever.com) aufrufen
2. Einloggen oder einen neuen Account erstellen
3. Unter „Dedicated Server" einen neuen Server-Account anlegen
4. Login und Validation Key notieren und als Umgebungsvariablen setzen
## LAN-Dedicated
Im LAN-Modus ist der Server nur im lokalen Netzwerk erreichbar. Es werden keine Masterserver-Zugangsdaten benötigt.
### Konfiguration
In der `.env`-Datei:
```bash
SERVER_MODE=lan
```
Oder per Docker-Run:
```bash
docker run -d \
--env-file .env \
-e SERVER_MODE=lan \
-p 2350:2350/tcp \
-p 2350:2350/udp \
-p 3450:3450/tcp \
-p 80:80/tcp \
-v ./data/gamedata:/opt/tmserver/GameData \
-v ./data/controlpanel:/var/www/html \
-v ./data/xaseco:/opt/tmserver/xaseco \
--name tmserver tmserver:latest
```
+158
View File
@@ -0,0 +1,158 @@
# Umgebungsvariablen
Alle Umgebungsvariablen werden über die `.env`-Datei konfiguriert, die von `docker-compose.yml` automatisch eingelesen wird. Alternativ können sie beim `docker run` über `--env-file .env` oder einzeln mit `-e` gesetzt werden.
Die Variablen werden beim **ersten Start** (leeres GameData-Volume) in die `dedicated_cfg.txt` eingetragen. Bei weiteren Starts bleiben manuelle Änderungen erhalten. Siehe [Konfiguration](konfiguration.md) für Details.
> **Sicherheitshinweis:** Sensible Werte (Passwörter, Keys) sind **nicht** im Docker-Image hinterlegt. Sie werden ausschließlich zur Laufzeit über die `.env`-Datei übergeben. Die `.env`-Datei ist über `.gitignore` und `.dockerignore` geschützt und wird weder ins Git noch in den Docker-Build-Context aufgenommen.
## Einrichtung
```bash
# Vorlage kopieren
cp .env.example .env
# Werte anpassen
nano .env
```
> **⚠ Sicherheitshinweis:** Die `.env.example` enthält **vorgenerierte Beispiel-Passwörter**. Diese dienen nur als Platzhalter und sind öffentlich einsehbar! **Ändere unbedingt alle Passwörter**, bevor du den Server produktiv einsetzt. Betroffen sind: `SERVER_SA_PASSWORD`, `SERVER_ADM_PASSWORD`, `SERVER_USER_PASSWORD`, `MARIADB_ROOT_PASSWORD`, `REMOTECP_DB_PASSWORD` und `XASECO_DB_PASSWORD`.
## Authentifizierung
| Variable | Beschreibung | Standard |
|----------|-------------|----------|
| `SERVER_SA_PASSWORD` | SuperAdmin-Passwort | `SuperAdmin` |
| `SERVER_ADM_PASSWORD` | Admin-Passwort | `Admin` |
| `SERVER_USER_PASSWORD` | User-Passwort | `User` |
## Masterserver-Account
| Variable | Beschreibung | Standard |
|----------|-------------|----------|
| `SERVER_LOGIN` | Masterserver-Login (nur Internet-Modus) | *(leer)* |
| `SERVER_LOGIN_PASSWORD` | Masterserver-Passwort | *(leer)* |
| `SERVER_VALIDATION_KEY` | Masterserver-Validierungsschlüssel | *(leer)* |
> **Wichtig:** Im Internet-Modus müssen `SERVER_LOGIN` und `SERVER_VALIDATION_KEY` gesetzt sein, andernfalls startet der Server nicht.
## Server-Optionen
| Variable | Beschreibung | Standard |
|----------|-------------|----------|
| `SERVER_NAME` | Servername (im Spiel sichtbar) | `Trackmania Server` |
| `SERVER_DESC` | Serverbeschreibung | `Powered by tmserver-docker` |
| `SERVER_HIDE` | Server verstecken (`0` = sichtbar, `1` = versteckt, `2` = vor Nations versteckt) | `0` |
| `SERVER_MAX_PLAYERS` | Maximale Spieleranzahl | `32` |
| `SERVER_PASSWORD` | Passwort zum Beitreten (leer = offen) | *(leer)* |
| `SERVER_MAX_SPECTATORS` | Maximale Zuschaueranzahl | `32` |
| `SERVER_SPEC_PASSWORD` | Zuschauer-Passwort (leer = offen) | *(leer)* |
| `SERVER_LADDER_MODE` | Ladder-Modus (`inactive` oder `forced`) | `forced` |
## Netzwerk
| Variable | Beschreibung | Standard |
|----------|-------------|----------|
| `SERVER_PORT` | Gameserver-Port | `2350` |
| `SERVER_P2P_PORT` | P2P-Port | `3450` |
| `SERVER_XMLRPC_PORT` | XML-RPC-Port (intern für AdminServ) | `5000` |
| `SERVER_UPLOAD_RATE` | Upload-Rate in Kbps | `512` |
| `SERVER_DOWNLOAD_RATE` | Download-Rate in Kbps | `8192` |
## Server-Modus & Steuerung
| Variable | Beschreibung | Standard |
|----------|-------------|----------|
| `SERVER_MODE` | Server-Modus (`internet` oder `lan`) | `internet` |
| `FORCE_CONFIG_UPDATE` | Erzwingt erneutes Anwenden aller Umgebungsvariablen auf die Config | `false` |
## 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.
| Variable | Beschreibung | Standard |
|----------|-------------|----------|
| `REMOTECP_DB_HOST` | Hostname des Datenbankservers | `mariadb` |
| `REMOTECP_DB_NAME` | Name der RemoteCP-Datenbank | `remotecp` |
| `REMOTECP_DB_USER` | Datenbank-Benutzername | `remotecp` |
| `REMOTECP_DB_PASSWORD` | Datenbank-Passwort | *(muss gesetzt werden)* |
> **Hinweis:** Diese Werte werden nur beim ersten Start (leeres Volume) angewendet. Weitere Details unter [RemoteCP](remotecp.md).
## MariaDB
| Variable | Beschreibung | Standard |
|----------|-------------|----------|
| `MARIADB_ROOT_PASSWORD` | Root-Passwort für den MariaDB-Server | *(muss gesetzt werden)* |
> **Wichtig:** `MARIADB_ROOT_PASSWORD` muss gesetzt sein, damit der MariaDB-Container startet. Die Datenbank und der Benutzer für RemoteCP werden automatisch aus `REMOTECP_DB_NAME`, `REMOTECP_DB_USER` und `REMOTECP_DB_PASSWORD` erstellt.
> **Hinweis:** Der MariaDB-Container kann mehrere Datenbanken beherbergen. Zusätzliche Datenbanken und Benutzer können über den Root-Zugang erstellt werden.
## XAseco
XAseco ist ein Server-Controller für Rekorde, Karma, Jukebox und mehr. Siehe [XAseco](xaseco.md) für Details.
| Variable | Beschreibung | Standard |
|----------|-------------|----------|
| `XASECO_ENABLED` | XAseco aktivieren/deaktivieren | `true` |
| `XASECO_MASTERADMIN_LOGIN` | Dein Spieler-Login (MasterAdmin) | *(muss gesetzt werden)* |
| `XASECO_DB_HOST` | Hostname des Datenbankservers | `mariadb` |
| `XASECO_DB_NAME` | Name der XAseco-Datenbank | `xaseco` |
| `XASECO_DB_USER` | Datenbank-Benutzername | `xaseco` |
| `XASECO_DB_PASSWORD` | Datenbank-Passwort | *(muss gesetzt werden)* |
| `XASECO_DEDIMANIA_NATION` | Dedimania-Nation (IOC-Code) | `DEU` |
> **Hinweis:** Die Server-Zugangsdaten (`SERVER_SA_PASSWORD`, `SERVER_XMLRPC_PORT`) und Dedimania-Daten (`SERVER_LOGIN`, `SERVER_LOGIN_PASSWORD`) werden automatisch aus der bestehenden Konfiguration übernommen.
## Debugging
| Variable | Beschreibung | Standard |
|----------|-------------|----------|
| `PHP_DISPLAY_ERRORS` | Zeigt PHP-Fehlermeldungen im Browser an (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:** 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.
## Beispiel
### Docker Compose (empfohlen)
Passe die Werte in der `.env`-Datei an und starte mit:
```bash
docker compose up -d --build
```
### docker run
```bash
docker run -d \
--env-file .env \
-p 2350:2350/tcp \
-p 2350:2350/udp \
-p 3450:3450/tcp \
-p 80:80/tcp \
-v ./data/gamedata:/opt/tmserver/GameData \
-v ./data/controlpanel:/var/www/html \
-v ./data/xaseco:/opt/tmserver/xaseco \
--name tmserver tmserver:latest
```
Einzelne Werte können zusätzlich überschrieben werden:
```bash
docker run -d \
--env-file .env \
-e SERVER_NAME="Mein Server" \
-e SERVER_MAX_PLAYERS=64 \
-p 2350:2350/tcp \
-p 2350:2350/udp \
-p 3450:3450/tcp \
-p 80:80/tcp \
-v ./data/gamedata:/opt/tmserver/GameData \
-v ./data/controlpanel:/var/www/html \
-v ./data/xaseco:/opt/tmserver/xaseco \
--name tmserver tmserver:latest
```
+120
View File
@@ -0,0 +1,120 @@
# XAseco
XAseco ist ein Server-Controller für TrackMania Nations Forever. Er verwaltet lokale Rekorde, Dedimania-Weltrekorde, Karma/Votes, eine Track-Jukebox und vieles mehr direkt im Spielchat.
Im Container wird die modifizierte Version **XAseco 1.16** verwendet, die für PHP 7.x angepasst wurde (Patches von Bueddel, Xymph, undef.de und reaby).
## Funktionsweise
XAseco verbindet sich über XML-RPC mit dem TrackMania-Server und reagiert auf Spielereignisse (neue Rekorde, Spieler-Connects, Chat-Befehle usw.). Die Daten werden in einer eigenen MySQL-Datenbank gespeichert.
## Konfiguration
Die Konfiguration erfolgt ausschließlich über Umgebungsvariablen in der `.env`-Datei. Beim **ersten Start** (leeres XAseco-Volume) werden die Werte automatisch in die XML-Konfigurationsdateien eingetragen.
### Erforderliche Variablen
| Variable | Beschreibung | Standard |
|----------|-------------|----------|
| `XASECO_MASTERADMIN_LOGIN` | Dein Spieler-Login (MasterAdmin mit allen Rechten) | *(muss gesetzt werden)* |
| `XASECO_DB_PASSWORD` | Passwort für die XAseco-Datenbank | *(muss gesetzt werden)* |
### Optionale Variablen
| Variable | Beschreibung | Standard |
|----------|-------------|----------|
| `XASECO_ENABLED` | XAseco aktivieren/deaktivieren | `true` |
| `XASECO_DB_HOST` | Hostname des Datenbankservers | `mariadb` |
| `XASECO_DB_NAME` | Name der XAseco-Datenbank | `xaseco` |
| `XASECO_DB_USER` | Datenbank-Benutzername | `xaseco` |
| `XASECO_DEDIMANIA_NATION` | Dedimania-Nation ([IOC-Code](https://en.wikipedia.org/wiki/List_of_IOC_country_codes), z.B. `DEU`, `AUT`, `CHE`) | `DEU` |
### Automatisch übernommene Variablen
Diese Werte werden aus der bestehenden Server-Konfiguration übernommen und müssen **nicht** separat gesetzt werden:
| Quelle | Verwendung in XAseco |
|--------|---------------------|
| `SERVER_SA_PASSWORD` | SuperAdmin-Passwort für die XML-RPC-Verbindung |
| `SERVER_XMLRPC_PORT` | XML-RPC-Port für die Verbindung zum TM-Server |
| `SERVER_LOGIN` | Dedimania Server-Login |
| `SERVER_LOGIN_PASSWORD` | Dedimania Server-Passwort |
## Datenbank
XAseco verwendet eine **eigene Datenbank** im selben MariaDB-Container. Die Datenbank und der Benutzer werden beim ersten Start des MariaDB-Containers automatisch erstellt (über ein Init-Script).
Das Datenbankschema (drei Tabellen-Dateien) wird beim ersten Start des tmserver-Containers automatisch importiert.
### Manueller Zugriff
Falls nötig, kann die XAseco-Datenbank über den MariaDB-Root-Zugang administriert werden:
```bash
docker exec -it tmserver-mariadb mysql -u root -p
```
### Nachträgliche Installation (bestehende MariaDB)
Das Init-Script (`assets/db/init-xaseco-db.sh`) wird von MariaDB nur beim **allerersten Start** (leeres `data/mariadb/`-Volume) ausgeführt. Wenn der MariaDB-Container bereits Daten enthält (z.B. weil er zuvor ohne XAseco lief), muss die Datenbank **einmalig manuell** erstellt werden:
```bash
docker exec -it tmserver-mariadb mysql -u root -p -e "
CREATE DATABASE IF NOT EXISTS xaseco CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS 'xaseco'@'%' IDENTIFIED BY 'DEIN_XASECO_DB_PASSWORT';
GRANT ALL PRIVILEGES ON xaseco.* TO 'xaseco'@'%';
FLUSH PRIVILEGES;"
```
Ersetze `DEIN_XASECO_DB_PASSWORT` durch den Wert von `XASECO_DB_PASSWORD` aus der `.env`-Datei. Das Tabellen-Schema wird anschließend beim nächsten Container-Start automatisch importiert, sofern das XAseco-Volume noch leer ist.
## Admin-System
XAseco kennt drei Berechtigungsstufen:
| Stufe | Beschreibung |
|-------|-------------|
| **MasterAdmin** | Volle Kontrolle (wird über `XASECO_MASTERADMIN_LOGIN` gesetzt) |
| **Admin** | Erweiterte Befehle (ebenfalls über `XASECO_MASTERADMIN_LOGIN` gesetzt) |
| **Operator** | Eingeschränkte Moderationsbefehle |
Weitere Admins/Operatoren können nach dem ersten Start manuell in `data/xaseco/adminops.xml` eingetragen werden.
## Persistente Daten
Alle XAseco-Daten werden im Volume `./data/xaseco/` gespeichert:
- Konfigurationsdateien (`config.xml`, `localdatabase.xml`, `dedimania.xml`, ...)
- Log-Datei (`aseco.log`)
- Admin-/Operator-Listen (`adminops.xml`)
## Deaktivieren
XAseco kann über die `.env`-Datei deaktiviert werden:
```env
XASECO_ENABLED=false
```
Der TrackMania-Server läuft dann ohne Server-Controller.
## Logs
Die XAseco-Logdatei befindet sich unter:
```
./data/xaseco/aseco.log
```
Bei Problemen ist dies die erste Anlaufstelle für die Fehlersuche.
## Wichtige Chat-Befehle
| Befehl | Beschreibung |
|--------|-------------|
| `/helpadmin` | Admin-Befehle anzeigen |
| `/recs` | Lokale Rekorde anzeigen |
| `/dedirecs` | Dedimania-Rekorde anzeigen |
| `/jukebox` | Track-Jukebox öffnen |
| `/stats` | Spieler-Statistiken anzeigen |
| `/admin help` | Alle Admin-Befehle |