xaseco implementiert + Doku erweitert + Lizenz erweitert.

This commit is contained in:
scriptos
2026-03-20 23:11:15 +01:00
parent 5d626a7c9d
commit bef71bd924
16 changed files with 521 additions and 44 deletions
+25 -3
View File
@@ -2,10 +2,13 @@
# tmserver-docker Umgebungsvariablen
# ============================================================
# Diese Datei wird von docker-compose.yml eingelesen.
# Bitte ändere sämtliche Passwörter hier, um die Sicherheit deines Servers zu gewährleisten.
# 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 ---
@@ -24,8 +27,8 @@ 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="$F00F$F10re$F20eZ$F30on$F40e $F50|$F60 T$F70ra$F80ck$F90ma$FA0n$FB0ia$FC0 S$FD0er$FE0ve$FF0r"
SERVER_DESC="Powered by tm-server-docker"
SERVER_NAME='Trackmania Server'
SERVER_DESC="Powered by tmserver-docker"
SERVER_HIDE=0
SERVER_MAX_PLAYERS=40
SERVER_PASSWORD=
@@ -66,3 +69,22 @@ 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
+47
View File
@@ -13,6 +13,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
php-xml \
php-mbstring \
php-mysql \
php-curl \
default-mysql-client \
&& rm -rf /var/lib/apt/lists/*
@@ -72,6 +73,43 @@ RUN unzip /var/www/html/remoteCP_v4.0.3.5.zip -d /var/www/html \
# 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)
@@ -103,12 +141,21 @@ 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 2350/tcp
+71 -16
View File
@@ -1,4 +1,4 @@
MIT License
MIT-Lizenz
Copyright © 2019 lduriez (Original: https://github.com/lduriez/tmserver-docker)
Copyright © 2026 Patrick Asmus
@@ -14,20 +14,75 @@ Blog: https://www.cleveradmin.de
---
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
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.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
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.
===============================================================================
+11 -4
View File
@@ -16,6 +16,8 @@ cp .env.example .env
Passe die Werte in der `.env`-Datei an deine Umgebung an (Passwörter, Masterserver-Account, etc.).
> **⚠ 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.
### 2. Server starten
```bash
@@ -36,20 +38,24 @@ docker compose up -d --build
│ ├── 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/
── 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
├── AdminServ/ # AdminServ + RemoteCP
── MariaDB/ # MariaDB-Datenbankdateien
├── gamedata/ # TM-Server-Daten
├── controlpanel/ # AdminServ + RemoteCP
── xaseco/ # XAseco-Konfiguration und Logs
└── mariadb/ # MariaDB-Datenbankdateien
```
## Dokumentation
@@ -62,6 +68,7 @@ Die vollständige Dokumentation befindet sich im Ordner [`docs/`](docs/README.md
- [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
---
+159 -1
View File
@@ -232,6 +232,127 @@ 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
@@ -327,4 +448,41 @@ echo "Server config dedicated_cfg.txt is"
cat "$CONFIG"
echo "Launching Server in ${SERVER_MODE} mode"
exec ./TrackmaniaServer /dedicated_cfg=dedicated_cfg.txt /game_settings=MatchSettings/custom_game_settings.txt /nodaemon ${LAUNCH_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.
+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."
+2
View File
@@ -18,6 +18,7 @@ services:
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
@@ -35,6 +36,7 @@ services:
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
+3
View File
@@ -4,6 +4,8 @@
> **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 |
@@ -12,4 +14,5 @@
| [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 |
+9 -7
View File
@@ -6,7 +6,7 @@ Die Template-Konfiguration befindet sich im Repository unter `assets/config/dedi
## Persistente Speicherung
Das gesamte **GameData-Verzeichnis** wird über ein Bind-Mount (`./data/GameData`) persistent auf dem Host gespeichert. Das bedeutet:
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
@@ -16,9 +16,9 @@ Das gesamte **GameData-Verzeichnis** wird über ein Bind-Mount (`./data/GameData
| Host-Pfad | Container-Pfad | Beschreibung |
|-----------|----------------|-------------|
| `./data/GameData` | `/opt/tmserver/GameData` | Gesamtes GameData-Verzeichnis |
| `./data/AdminServ` | `/var/www/html` | AdminServ- und RemoteCP-Daten |
| `./data/MariaDB` | `/var/lib/mysql` | MariaDB-Datenbankdateien |
| `./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
@@ -54,7 +54,7 @@ Nach dem ersten Start kann die Konfiguration direkt auf dem Host bearbeitet werd
```bash
# Konfiguration direkt auf dem Host bearbeiten
nano ./data/GameData/Config/dedicated_cfg.txt
nano ./data/gamedata/Config/dedicated_cfg.txt
# Alternativ: im Container anzeigen
docker exec tmserver cat /opt/tmserver/GameData/Config/dedicated_cfg.txt
@@ -63,7 +63,7 @@ docker exec tmserver cat /opt/tmserver/GameData/Config/dedicated_cfg.txt
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`.
> **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)
@@ -85,7 +85,9 @@ docker run -d \
-p 2350:2350/udp \
-p 3450:3450/tcp \
-p 80:80/tcp \
-v ./data/GameData:/opt/tmserver/GameData \
-v ./data/gamedata:/opt/tmserver/GameData \
-v ./data/controlpanel:/var/www/html \
-v ./data/xaseco:/opt/tmserver/xaseco \
--name tmserver tmserver:latest
```
+2 -1
View File
@@ -18,7 +18,8 @@ docker run -d \
-p 2350:2350/tcp \
-p 2350:2350/udp \
-p 3450:3450/tcp \
-v ./data/GameData:/opt/tmserver/GameData \
-v ./data/gamedata:/opt/tmserver/GameData \
-v ./data/xaseco:/opt/tmserver/xaseco \
--name tmserver tmserver:latest
```
+3 -3
View File
@@ -64,7 +64,7 @@ Die MariaDB-Daten werden über ein eigenes Bind-Mount persistent gespeichert:
| Host-Pfad | Container-Pfad | Beschreibung |
|-----------|----------------|-------------|
| `./data/MariaDB` | `/var/lib/mysql` | MariaDB-Datenbankdateien |
| `./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.
@@ -83,9 +83,9 @@ RemoteCP wird im gleichen Volume wie AdminServ gespeichert:
| Host-Pfad | Container-Pfad | Beschreibung |
|-----------|----------------|-------------|
| `./data/AdminServ/remotecp` | `/var/www/html/remotecp` | RemoteCP-Installation |
| `./data/controlpanel/remotecp` | `/var/www/html/remotecp` | RemoteCP-Installation |
Die Konfigurationsdateien befinden sich unter `./data/AdminServ/remotecp/xml/`:
Die Konfigurationsdateien befinden sich unter `./data/controlpanel/remotecp/xml/`:
| Datei | Beschreibung |
|-------|-------------|
+13 -6
View File
@@ -14,6 +14,8 @@ 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
@@ -45,7 +47,10 @@ docker run -d \
-p 2350:2350/udp \
-p 3450:3450/tcp \
-p 80:80/tcp \
-v ./data/GameData:/opt/tmserver/GameData \ -v ./data/AdminServ:/var/www/html \ --name tmserver tmserver:latest
-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)
@@ -60,8 +65,9 @@ docker run -d \
-p 2350:2350/udp \
-p 3450:3450/tcp \
-p 80:80/tcp \
-v ./data/GameData:/opt/tmserver/GameData \
-v ./data/AdminServ:/var/www/html \
-v ./data/gamedata:/opt/tmserver/GameData \
-v ./data/controlpanel:/var/www/html \
-v ./data/xaseco:/opt/tmserver/xaseco \
--name tmserver tmserver:latest
```
@@ -80,9 +86,10 @@ Alle Server- und AdminServ-Daten werden über Bind-Mounts persistent auf dem Hos
| Host-Pfad | Container-Pfad | Beschreibung |
|-----------|----------------|-------------|
| `./data/GameData` | `/opt/tmserver/GameData` | TM-Server-Daten (Config, Tracks, Skins, etc.) |
| `./data/AdminServ` | `/var/www/html` | AdminServ- und RemoteCP-Daten |
| `./data/MariaDB` | `/var/lib/mysql` | MariaDB-Datenbankdateien |
| `./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.
+3 -1
View File
@@ -53,6 +53,8 @@ docker run -d \
-p 2350:2350/udp \
-p 3450:3450/tcp \
-p 80:80/tcp \
-v ./data/GameData:/opt/tmserver/GameData \
-v ./data/gamedata:/opt/tmserver/GameData \
-v ./data/controlpanel:/var/www/html \
-v ./data/xaseco:/opt/tmserver/xaseco \
--name tmserver tmserver:latest
```
+24 -2
View File
@@ -16,6 +16,8 @@ cp .env.example .env
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 |
@@ -87,6 +89,22 @@ RemoteCP verwendet die SuperAdmin-Zugangsdaten (`SERVER_SA_PASSWORD`) des TM-Ser
> **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 |
@@ -116,7 +134,9 @@ docker run -d \
-p 2350:2350/udp \
-p 3450:3450/tcp \
-p 80:80/tcp \
-v ./data/GameData:/opt/tmserver/GameData \
-v ./data/gamedata:/opt/tmserver/GameData \
-v ./data/controlpanel:/var/www/html \
-v ./data/xaseco:/opt/tmserver/xaseco \
--name tmserver tmserver:latest
```
@@ -131,6 +151,8 @@ docker run -d \
-p 2350:2350/udp \
-p 3450:3450/tcp \
-p 80:80/tcp \
-v ./data/GameData:/opt/tmserver/GameData \
-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 |