`
+
+
+
-### type
-
-* `build` : changements qui affectent le système de build ou des dépendances externes (npm, make…)
-* `ci` : changements concernant les fichiers et scripts d’intégration ou de configuration (Travis, Ansible, BrowserStack…)
-* `feat` : ajout d’une nouvelle fonctionnalité
-* `fix` : correction d’un bug
-* `perf` : amélioration des performances
-* `refactor` : modification qui n’apporte ni nouvelle fonctionnalité ni d’amélioration de performances
-* `style` : changement qui n’apporte aucune altération fonctionnelle ou sémantique (indentation, mise en forme, ajout d’espace, renommante d’une 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/)
\ No newline at end of file
+
+
License |
Matrix |
Mastodon
+
diff --git a/RunTrackmaniaServer.sh b/RunTrackmaniaServer.sh
deleted file mode 100755
index 8e87c8a..0000000
--- a/RunTrackmaniaServer.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/sh
-
-echo "Starting apache server"
-service apache2 start
-
-echo "Setting ENV/ARG variables"
-sed -i "s/SuperAdmin/${SERVER_SA_PASSWORD}/" /opt/tmserver/GameData/Config/dedicated_cfg.txt
-sed -i "s/Admin/${SERVER_ADM_PASSWORD}/" /opt/tmserver/GameData/Config/dedicated_cfg.txt
-sed -i "s/${SERVER_NAME}" /opt/tmserver/GameData/Config/dedicated_cfg.txt
-sed -i "s/${SERVER_DESC}" /opt/tmserver/GameData/Config/dedicated_cfg.txt
-sed -i "s/False/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
diff --git a/AdminServ_v2.1.1.zip b/assets/bin/AdminServ_v2.1.1.zip
old mode 100755
new mode 100644
similarity index 100%
rename from AdminServ_v2.1.1.zip
rename to assets/bin/AdminServ_v2.1.1.zip
diff --git a/assets/bin/RunTrackmaniaServer.sh b/assets/bin/RunTrackmaniaServer.sh
new file mode 100644
index 0000000..fe58113
--- /dev/null
+++ b/assets/bin/RunTrackmaniaServer.sh
@@ -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" < PHP-Debug-Modus deaktiviert"
+ cat > "$PHP_INI_DIR/99-adminserv-debug.ini" < 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" < 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/&/\&/g; s/\</g; s/>/\>/g')
+ SAFE_RCP_NAME=$(printf '%s' "${SERVER_NAME:-Trackmania Server}" | sed 's/&/\&/g; s/\</g; s/>/\>/g')
+ SAFE_DB_DSN=$(printf '%s' "$DB_DSN" | sed 's/&/\&/g; s/\</g; s/>/\>/g')
+ SAFE_DB_USER=$(printf '%s' "$REMOTECP_DB_USER" | sed 's/&/\&/g; s/\</g; s/>/\>/g')
+ SAFE_DB_PW=$(printf '%s' "$REMOTECP_DB_PASSWORD" | sed 's/&/\&/g; s/\</g; s/>/\>/g')
+ cat > "$REMOTECP_DIR/xml/servers.xml" <
+
+
+ 1
+
+ ${SAFE_RCP_NAME}
+
+
+
+ 127.0.0.1
+ ${XMLRPC_PORT}
+ ${SA_PW}
+ 000000
+
+
+ localhost
+
+ username
+ password
+ /GameData/Tracks/
+
+
+ ${SAFE_DB_DSN}
+ ${SAFE_DB_USER}
+ ${SAFE_DB_PW}
+
+
+ guestlist.txt
+ blacklist.txt
+
+
+
+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" <
+
+
+ L1
+ true
+
+
+
+ rcplive
+ 5b8e508f6f4a95bc581a37243d88f07e
+ false
+ false
+ en
+
+
+
+ G1
+ true
+
+
+
+ Guest
+ adb831a7fdd83dd1e2a309ce7591dff8
+ false
+ false
+ en
+
+
+
+ 1
+ true
+
+
+
+ SuperAdmin
+ ${RCP_PW_MD5}
+ false
+ false
+ de
+
+
+
+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:///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/&/\&/g; s/\</g; s/>/\>/g')
+
+ # --- config.xml: MasterAdmin und TMServer-Verbindung konfigurieren ---
+ if [ -n "$XASECO_ADMIN" ]; then
+ SAFE_ADMIN=$(printf '%s' "$XASECO_ADMIN" | sed 's/&/\&/g; s/\</g; s/>/\>/g')
+ # MasterAdmin in die masteradmins-Liste einfuegen (nach -Tag)
+ sed -i "//a\\
+ ${SAFE_ADMIN} " "$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|YOUR_SUPERADMIN_PASSWORD|${SA_PW_XASECO}|" "$XASECO_DIR/config.xml"
+ sed -i "s|5000|${XMLRPC_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/&/\&/g; s/\</g; s/>/\>/g')
+ sed -i "s|||" "$XASECO_DIR/adminops.xml"
+ # Admin in die admins-Liste einfuegen
+ sed -i "//a\\
+ ${SAFE_ADMIN} " "$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/&/\&/g; s/\</g; s/>/\>/g')
+ SAFE_DB_USER=$(printf '%s' "$XASECO_DB_USER" | sed 's/&/\&/g; s/\</g; s/>/\>/g')
+ SAFE_DB_PW=$(printf '%s' "$XASECO_DB_PASSWORD" | sed 's/&/\&/g; s/\</g; s/>/\>/g')
+ SAFE_DB_NAME=$(printf '%s' "$XASECO_DB_NAME" | sed 's/&/\&/g; s/\</g; s/>/\>/g')
+ sed -i "s|localhost|${SAFE_DB_HOST}|" "$XASECO_DIR/localdatabase.xml"
+ sed -i "s|YOUR_MYSQL_LOGIN|${SAFE_DB_USER}|" "$XASECO_DIR/localdatabase.xml"
+ sed -i "s|YOUR_MYSQL_PASSWORD|${SAFE_DB_PW}|" "$XASECO_DIR/localdatabase.xml"
+ sed -i "s|aseco|${SAFE_DB_NAME}|" "$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/&/\&/g; s/\</g; s/>/\>/g')
+ SAFE_DEDI_PW=$(printf '%s' "$DEDI_PASSWORD" | sed 's/&/\&/g; s/\</g; s/>/\>/g')
+ SAFE_DEDI_NATION=$(printf '%s' "$DEDI_NATION" | sed 's/&/\&/g; s/\</g; s/>/\>/g')
+ sed -i "s|YOUR_SERVER_LOGIN|${SAFE_DEDI_LOGIN}|" "$XASECO_DIR/dedimania.xml"
+ sed -i "s|YOUR_SERVER_PASSWORD|${SAFE_DEDI_PW}|" "$XASECO_DIR/dedimania.xml"
+ sed -i "s|YOUR_SERVER_NATION|${SAFE_DEDI_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 >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
diff --git a/TrackmaniaServer_2011-02-21.zip b/assets/bin/TrackmaniaServer_2011-02-21.zip
similarity index 100%
rename from TrackmaniaServer_2011-02-21.zip
rename to assets/bin/TrackmaniaServer_2011-02-21.zip
diff --git a/assets/bin/remoteCP_v4.0.3.5.zip b/assets/bin/remoteCP_v4.0.3.5.zip
new file mode 100644
index 0000000..55f231b
Binary files /dev/null and b/assets/bin/remoteCP_v4.0.3.5.zip differ
diff --git a/assets/bin/xaseco_v1.16.zip b/assets/bin/xaseco_v1.16.zip
new file mode 100644
index 0000000..10ced66
Binary files /dev/null and b/assets/bin/xaseco_v1.16.zip differ
diff --git a/custom_game_settings.txt b/assets/config/custom_game_settings.txt
similarity index 100%
rename from custom_game_settings.txt
rename to assets/config/custom_game_settings.txt
diff --git a/assets/config/dedicated_cfg.txt b/assets/config/dedicated_cfg.txt
new file mode 100644
index 0000000..a56276c
--- /dev/null
+++ b/assets/config/dedicated_cfg.txt
@@ -0,0 +1,92 @@
+
+
+
+
+
+ SuperAdmin
+ %%SERVER_SA_PASSWORD%%
+
+
+ Admin
+ %%SERVER_ADM_PASSWORD%%
+
+
+ User
+ %%SERVER_USER_PASSWORD%%
+
+
+
+
+ %%SERVER_LOGIN%%
+ %%SERVER_LOGIN_PASSWORD%%
+ %%SERVER_VALIDATION_KEY%%
+
+
+
+ %%SERVER_NAME%%
+ %%SERVER_DESC%%
+ %%SERVER_HIDE%%
+
+ %%SERVER_MAX_PLAYERS%%
+ %%SERVER_PASSWORD%%
+
+ %%SERVER_MAX_SPECTATORS%%
+ %%SERVER_SPEC_PASSWORD%%
+
+ %%SERVER_LADDER_MODE%%
+ 0
+ 50000
+
+ True
+ True
+
+ 60000
+ 0.5
+
+
+
+
+
+ False
+ True
+ True
+
+
+ 0
+
+ False
+
+
+
+ %%SERVER_UPLOAD_RATE%%
+ %%SERVER_DOWNLOAD_RATE%%
+
+
+ %%SERVER_PORT%%
+ %%SERVER_P2P_PORT%%
+ 0
+
+
+
+ 600
+
+ %%SERVER_XMLRPC_PORT%%
+ True
+
+
+
+
+
+ stadium
+
+ False
+
+
+
+
+
+ False
+
+
+
+
diff --git a/assets/db/init-xaseco-db.sh b/assets/db/init-xaseco-db.sh
new file mode 100644
index 0000000..2cf7bcb
--- /dev/null
+++ b/assets/db/init-xaseco-db.sh
@@ -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."
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..4e6168b
--- /dev/null
+++ b/docker-compose.yml
@@ -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
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 0000000..7ba5be7
--- /dev/null
+++ b/docs/README.md
@@ -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 |
diff --git a/docs/adminserv.md b/docs/adminserv.md
new file mode 100644
index 0000000..9dc11d9
--- /dev/null
+++ b/docs/adminserv.md
@@ -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://` 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:///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
+```
diff --git a/docs/konfiguration.md b/docs/konfiguration.md
new file mode 100644
index 0000000..13ae80b
--- /dev/null
+++ b/docs/konfiguration.md
@@ -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 |
+|-----------|------------------|----------|
+| `` (SuperAdmin-PW) | `SERVER_SA_PASSWORD` | `SuperAdmin` |
+| `` (Admin-PW) | `SERVER_ADM_PASSWORD` | `Admin` |
+| `` (User-PW) | `SERVER_USER_PASSWORD` | `User` |
+| `` | `SERVER_LOGIN` | *(leer)* |
+| `` | `SERVER_VALIDATION_KEY` | *(leer)* |
+| `` (Servername) | `SERVER_NAME` | `Trackmania Server` |
+| `` | `SERVER_DESC` | `Powered by tmserver-docker` |
+| `` | `SERVER_HIDE` | `0` |
+| `` | `SERVER_MAX_PLAYERS` | `32` |
+| `` | `SERVER_PASSWORD` | *(leer)* |
+| `` | `SERVER_MAX_SPECTATORS` | `32` |
+| `` | `SERVER_LADDER_MODE` | `forced` |
+| `` | `SERVER_PORT` | `2350` |
+| `` | `SERVER_P2P_PORT` | `3450` |
+| `` | `SERVER_XMLRPC_PORT` | `5000` |
+| `` | `SERVER_UPLOAD_RATE` | `512` |
+| `` | `SERVER_DOWNLOAD_RATE` | `8192` |
diff --git a/docs/ports.md b/docs/ports.md
new file mode 100644
index 0000000..d9e334b
--- /dev/null
+++ b/docs/ports.md
@@ -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.
diff --git a/docs/remotecp.md b/docs/remotecp.md
new file mode 100644
index 0000000..43aa08d
--- /dev/null
+++ b/docs/remotecp.md
@@ -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:///`
+- **RemoteCP:** `http:///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:///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 `false` deaktiviert werden
diff --git a/docs/schnellstart.md b/docs/schnellstart.md
new file mode 100644
index 0000000..dfbfdcd
--- /dev/null
+++ b/docs/schnellstart.md
@@ -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:///` | Server-Verwaltungsoberfläche |
+| RemoteCP | `http:///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).
diff --git a/docs/server-modi.md b/docs/server-modi.md
new file mode 100644
index 0000000..424795a
--- /dev/null
+++ b/docs/server-modi.md
@@ -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
+```
diff --git a/docs/umgebungsvariablen.md b/docs/umgebungsvariablen.md
new file mode 100644
index 0000000..4844f89
--- /dev/null
+++ b/docs/umgebungsvariablen.md
@@ -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
+```
diff --git a/docs/xaseco.md b/docs/xaseco.md
new file mode 100644
index 0000000..91553d2
--- /dev/null
+++ b/docs/xaseco.md
@@ -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 |