FROM debian:bullseye-slim RUN mkdir /opt/tmserver WORKDIR /opt/tmserver # Alle benoetigten Pakete in einem Layer installieren und Cache aufraeumen RUN apt-get update && apt-get install -y --no-install-recommends \ unzip \ apache2 \ php \ php-zip \ php-xml \ php-mbstring \ php-mysql \ php-curl \ default-mysql-client \ logrotate \ && rm -rf /var/lib/apt/lists/* # Apache mod_rewrite aktivieren und AllowOverride fuer .htaccess (RemoteCP-Sicherheit) RUN a2enmod rewrite \ && sed -i '//,/<\/Directory>/ s/AllowOverride None/AllowOverride All/' /etc/apache2/apache2.conf COPY assets/bin/TrackmaniaServer_2011-02-21.zip /opt/tmserver RUN unzip /opt/tmserver/TrackmaniaServer_2011-02-21.zip -d /opt/tmserver \ && rm -f /opt/tmserver/TrackmaniaServer_2011-02-21.zip # Custom-Konfiguration ueber die Standard-Config aus dem ZIP kopieren COPY assets/config/dedicated_cfg.txt /opt/tmserver/GameData/Config/dedicated_cfg.txt COPY assets/config/custom_game_settings.txt /opt/tmserver/GameData/Tracks/MatchSettings/ # Config-Verzeichnis rekursiv beschreibbar machen (Server benoetigt Schreibzugriff) RUN chmod -R 777 /opt/tmserver/GameData/Config/ # Tracks-Verzeichnis fuer AdminServ beschreibbar machen (Maps-Upload/Download) RUN chown -R www-data:www-data /opt/tmserver/GameData/Tracks/ \ && chmod -R 755 /opt/tmserver/GameData/Tracks/ # AdminServ-Verzeichnisse im Config-Ordner anlegen RUN mkdir -p /opt/tmserver/GameData/Config/AdminServ/ServerOptions \ && chown -R www-data:www-data /opt/tmserver/GameData/Config/AdminServ # Gesamtes GameData als Default-Template sichern (wird beim ersten Start ins Volume kopiert) RUN cp -a /opt/tmserver/GameData /opt/tmserver/default-gamedata COPY assets/bin/RunTrackmaniaServer.sh /opt/tmserver/ RUN sed -i 's/\r$//' /opt/tmserver/RunTrackmaniaServer.sh \ && chmod +x /opt/tmserver/RunTrackmaniaServer.sh COPY assets/bin/XAsecoHealthcheck.sh /opt/tmserver/ RUN sed -i 's/\r$//' /opt/tmserver/XAsecoHealthcheck.sh \ && chmod +x /opt/tmserver/XAsecoHealthcheck.sh COPY assets/bin/AdminServ_v2.1.1.zip /var/www/html RUN unzip /var/www/html/AdminServ_v2.1.1.zip -d /var/www/html \ && rm -f /var/www/html/AdminServ_v2.1.1.zip \ && rm -f /var/www/html/index.html \ && mkdir -p /var/www/html/logs \ && chmod 755 /var/www/html/logs \ && chmod 666 /var/www/html/config/adminlevel.cfg.php \ && chmod 666 /var/www/html/config/servers.cfg.php \ && chmod 666 /var/www/html/config/adminserv.cfg.php \ && chown -R www-data:www-data /var/www/html/ # RemoteCP installieren (als Subpath /remotecp/) COPY assets/bin/remoteCP_v4.0.3.5.zip /var/www/html RUN unzip /var/www/html/remoteCP_v4.0.3.5.zip -d /var/www/html \ && mv /var/www/html/remoteCP_4.0.3.5-1 /var/www/html/remotecp \ && rm -f /var/www/html/remoteCP_v4.0.3.5.zip \ && mkdir -p /var/www/html/remotecp/cache \ && chmod -R 777 /var/www/html/remotecp/cache \ && chmod -R 666 /var/www/html/remotecp/xml/*.xml \ && chmod -R 777 /var/www/html/remotecp/xml \ && chmod -R 777 /var/www/html/remotecp/xml/settings \ && chown -R www-data:www-data /var/www/html/remotecp/ # Fix PHP-Warnungen in RemoteCP CustomPoints-Plugin (undefined constants) # RemoteCP nutzt bare constants (pt_custom, pt_points, ...), die in PHP 7.2+ # Warnungen ausloesen. Das gepatchte Plugin nutzt stattdessen defined()-Pruefungen. COPY assets/config/remotecp/plugins/CustomPoints/index.php /var/www/html/remotecp/plugins/CustomPoints/index.php RUN chown www-data:www-data /var/www/html/remotecp/plugins/CustomPoints/index.php # Fix PHP-Warnungen in RemoteCP Mods-Plugin (foreach auf leere Umgebungen) # Leere Umgebungen (Island, Bay, …) fuehrten zu "Invalid argument supplied # for foreach()", weil $this->mods['Env'] nicht initialisiert war. # Zusaetzlich bare-constant-Warnungen (pt_*) mit defined()-Pruefungen entschaerft. COPY assets/config/remotecp/plugins/Mods/index.php /var/www/html/remotecp/plugins/Mods/index.php RUN chown www-data:www-data /var/www/html/remotecp/plugins/Mods/index.php # RemoteCP Mods-Plugin: Vorkonfigurierte Skin-Liste (techniverse.net) COPY assets/config/remotecp/plugins/Mods/settings.xml /var/www/html/remotecp/plugins/Mods/settings.xml RUN chown www-data:www-data /var/www/html/remotecp/plugins/Mods/settings.xml # Fix AdminServ MatchSettings-Bugs fuer TmForever: # 1) get_matchset_mapimport.php: Falscher Pfad-Praefix (MatchSettings/ statt # des tatsaechlichen Map-Ordners) beim Erstellen von MatchSettings. # 2) maps-creatematchset.php: GetModeScriptInfo-Aufruf (existiert nur in # ManiaPlanet/TM2) wird fuer TmForever uebersprungen. COPY assets/config/adminserv/get_matchset_mapimport.php /var/www/html/resources/ajax/get_matchset_mapimport.php COPY assets/config/adminserv/maps-creatematchset.php /var/www/html/resources/process/maps-creatematchset.php RUN chown www-data:www-data /var/www/html/resources/ajax/get_matchset_mapimport.php \ && chown www-data:www-data /var/www/html/resources/process/maps-creatematchset.php # AdminServ- und RemoteCP-Dateien als Default-Template sichern (wird beim ersten Start ins Volume kopiert) RUN cp -a /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 verfuegbares freezone-Plugin entfernen RUN sed -i '/plugin\.freezone\.php<\/plugin>/d' /opt/tmserver/xaseco/plugins.xml # TeamSpeak3-Plugin: Eigenes Gateway einbinden (Original-Gateway nicht mehr verfuegbar) # Die teamspeak3.xml wird direkt in den XAseco-Ordner kopiert, damit das Plugin # beim Start automatisch den konfigurierten TS3-Server anzeigt. COPY assets/config/xaseco/teamspeak3.xml /opt/tmserver/xaseco/teamspeak3.xml # XAseco als Default-Template sichern (wird beim ersten Start ins Volume kopiert) RUN cp -a /opt/tmserver/xaseco /opt/tmserver/default-xaseco # PHP-Debug-Konfiguration: wird zur Laufzeit vom Startup-Script gesetzt # (kein Rebuild noetig – nur Container neustarten) # Log-Rotation: logrotate-Konfiguration ins Image kopieren # Wird zur Laufzeit stuendlich per Background-Loop ausgefuehrt (kein cron noetig). COPY assets/config/logrotate.conf /etc/logrotate.d/tmserver RUN chmod 644 /etc/logrotate.d/tmserver # --- Umgebungsvariablen --- # Sensible Werte (Passwoerter, Keys) werden NICHT im Image hinterlegt, # sondern muessen zur Laufzeit uebergeben werden (z.B. via .env-Datei). # Server-Optionen (nicht-sensible Standardwerte) ENV SERVER_NAME="Trackmania Server" ENV SERVER_DESC="Powered by tmserver-docker" ENV SERVER_HIDE=0 ENV SERVER_MAX_PLAYERS=32 ENV SERVER_MAX_SPECTATORS=32 ENV SERVER_LADDER_MODE=forced # Netzwerk ENV SERVER_PORT=2350 ENV SERVER_P2P_PORT=3450 ENV SERVER_XMLRPC_PORT=5000 ENV SERVER_UPLOAD_RATE=512 ENV SERVER_DOWNLOAD_RATE=8192 # Server-Modus und Config-Steuerung ENV SERVER_MODE=internet ENV FORCE_CONFIG_UPDATE=false # Spieleinstellungen (MatchSettings) ENV ALLWARMUPDURATION=0 ENV SHUFFLE_MAPLIST=false # Forced Mods (Skins) - URL zu ZIP-Dateien, die beim Start forciert werden ENV FORCE_MOD_STADIUM="" ENV FORCE_MOD_ISLAND="" ENV FORCE_MOD_BAY="" ENV FORCE_MOD_COAST="" ENV FORCE_MOD_SPEED="" ENV FORCE_MOD_ALPINE="" ENV FORCE_MOD_RALLY="" # RemoteCP ENV REMOTECP_DB_HOST=mariadb ENV REMOTECP_DB_NAME=remotecp ENV REMOTECP_DB_USER=remotecp # XAseco ENV XASECO_ENABLED=true ENV XASECO_MASTERADMIN_LOGIN="" ENV XASECO_DB_HOST=mariadb ENV XASECO_DB_NAME=xaseco ENV XASECO_DB_USER=xaseco ENV XASECO_DEDIMANIA_NATION=DEU ENV XASECO_HEALTHCHECK=true ENV XASECO_HEALTHCHECK_INTERVAL=60 # 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 EXPOSE 2350/udp EXPOSE 3450/tcp EXPOSE 80/tcp # Graceful Shutdown: SIGTERM wird vom Signal-Handler im Startscript abgefangen # und alle Dienste (XAseco, TM-Server, Apache) sauber heruntergefahren. STOPSIGNAL SIGTERM CMD ["/opt/tmserver/RunTrackmaniaServer.sh"]