Anleitung für einen eigenen dedizierten OpenTTD Server
In dieser Anleitung geht es um das Spiel OpenTTD. Ich zeige Schritt-für-Schritt, wie ein dedizierter Server dafür eingerichtet werden kann.
Inhaltsverzeichnis
Als die Corona-Pandemie vor bereits über einem Jahr angefangen hat, habe ich nach Spielen gesucht, die ich zusammen mit Freunden spielen könnte, ohne dabei an einem Ort zu sein. Eins der Spiele, auf die ich dabei gestoßen bin, ist OpenTTD.
OpenTTD ist ein Open-Source-Simulationsspiel, das auf Transport Tycoon Deluxe basiert
Dieses kostenlose Spiel ist inzwischen auch über Steam oder den Play Store zu finden und hat äußerst positive Bewertungen (96 %) respektive 4,1/5 Sterne. Es geht darum, ein Transportunternehmen durch den Bau und die Verwaltung von Transportwegen und Transportfahrzeugen zu leiten.
Durch einen dedizierten Server ist es möglich, dass sich verschiedene Spieler zu unterschiedlichen Zeiten in ein gemeinsames Spiel einloggen können. Diesen möchte ich in dieser Anleitung aufsetzen.
Server installieren
Wer bereits einen Server nach dieser Anleitung eingerichtet hat, kann diesen Teil überspringen, da hier die Einrichtung in gekürzter Form wiederholt wird.
Der erste Schritt besteht darin, sich einen Server zu besorgen. Empfehlenswert sind meiner Meinung die VPS und insbesondere auch Root-Server (dedizierte CPU) von Netcup. Für einen reinen OpenTTD-Server braucht man keine hohen Anforderungen, hauptsächlich dann, wenn nicht riesige Karten erstellt werden sollen und/oder eine hohe Spieleranzahl erwartet wird. Ein kleinerer VPS sollte vollkommen ausreichen.
Neukunden erhalten mit diesen Affiliate-Gutscheinen einen Rabatt auf die erste Bestellung (und ich eine Provision für geworbene Kunden). Die prozentualen Rabatte bleiben dauerhaft aktiv, solange der VPS nicht gekündigt wird.
Als Betriebssystem wähle ich bei der Neuinstallation Ubuntu 20.04 aus. Ein anderes wäre auch möglich, solange Docker darauf installiert werden kann, aber ich habe einige Erfahrung mit Ubuntu und sehe keinen Grund zu wechseln. Des Weiteren ist das Ende des Standard-Supports erst im April 2025, somit wird es vermutlich erst mal nicht nötig sein, das Betriebssystem auf die nächste Version zu upgraden.
Sobald der Server mit der Neuinstallation fertig ist, muss die Verbindung zum Server hergestellt werden. Dies lässt sich unter Windows mit dem Windows Terminal, PuTTY oder einem ähnlichen Programm bewerkstelligen. Auch VSCode hat einen eingebauten Terminal und bietet den Vorteil der leichteren Bearbeitung, wie hier beschrieben. Ich nutze das Windows Terminal.
Es sollte selbstverständlich die eigene IP-Adresse des Servers eingetragen werden.
Anschließend gegebenenfalls die Frage mit „yes“ beantworten und das Passwort eingeben. Während der Eingabe wird das Passwort nicht angezeigt. Als Erstes schauen wir, ob es Updates gibt und installieren diese gegebenenfalls:
apt update
apt upgrade
Die Frage, ob man updaten möchte mit Y bestätigen.
Der Texteditor Nano sollte schon standardmäßig installiert sein, aber zur Sicherheit kann man ihn so installieren:
apt install nano
Als Nächstes benennen wir den Server um:
nano /etc/hostname
In Nano wird die Datei mit Strg + X verlassen. Nano wird euch Fragen, ob ihr die Änderungen speichern wollt (mit Y bestätigen) und wie ihr die Datei nennen wollt. Da wir sie überschreiben möchten, ändern wir den Namen nicht und bestätigen einfach mit Enter.
Sobald du den Server neu startest reboot
und dich anschließend wieder mit ihm verbindest ssh admin@{ip-Adresse}
ist der neue Host-Name sichtbar.
Nun ist es sinnvoll einen Nutzer anzulegen, der nicht root ist.
useradd -m -G sudo namedesneuennutzers
passwd namedesneuennutzers
Useradd
ist der Befehl, um einen neuen Nutzer anzulegen. Das -m
sorgt dafür, dass dieser Nutzer einen Home-Ordner eingerichtet bekommt. Das -G
packt den Nutzer in eine Gruppe, anschließend wird die Gruppe genannt. Die Sudo Gruppe darf Befehle mit sudo
ausführen. Zuletzt folgt der Name des neuen Nutzers. Mit passwd
wird ein Password für den Nutzer erstellt.
Sollte die sudo Gruppe nicht existieren, musst du eine Gruppe erstellen.
groupadd namederneuengruppe
Diese Gruppe sollte die Rechte haben Sudo-Befehle auszuführen:
EDITOR=nano visudo
In der Datei muss dann die neue Gruppe erwähnt werden.
Jetzt stellen wir bei Bedarf die richtige Zeit ein.
date
Falls nicht die richtige Zeit angezeigt wird:
tzselect
Über die Zahlen lässt sich die Zeitzone auswählen.
timedatectl set-timezone 'Europe/Berlin'
Es ist an der Zeit den Server neu zu starten und sich als neu angelegter Nutzer anzumelden.
reboot
Als Nächstes installiere ich Htop (ein Monitoring-Programm).
apt install htop
Jetzt müsste der Server die Ausführung verweigern und fragen, ob man root sei.
Also noch mal mit Superuser do.
sudo apt install htop
Über die Eingabe von htop
kann man sich nun die Auslastung des Servers anschauen.
Damit lässt sich gut verfolgen, wie stark die CPU und der RAM des Servers beansprucht werden. Mit F10 oder STRG + C verlässt du die Ansicht wieder.
Ich möchte gerne noch eine andere Shell haben.
sudo apt install git curl
sudo apt install zsh
Nun installiere ich zim und ändere die Standard-Shell auf zsh.
curl -fsSL https://raw.githubusercontent.com/zimfw/install/master/install.zsh | zsh
chsh -s /bin/zsh
exec bash
Jetzt müsste die Shell (subjektiv) besser aussehen.
Der wichtigste Part der Installation sind Docker und Docker-Compose. Außerdem optional noch Lazydocker, für eine sehr einfache Möglichkeit sich seine Docker-Container und deren aktuelle Logs über SSH anzusehen.
sudo apt install docker docker-compose
curl https://raw.githubusercontent.com/jesseduffield/lazydocker/master/scripts/install_update_linux.sh | bash
Jetzt muss noch Docker aktiviert werden.
sudo systemctl enable --now docker
Sollte die nächste Zeile nicht erscheinen, muss mit STRG + C nachgeholfen werden. Nun noch den angelegten Nutzer der Dockergruppe aus Bequemlichkeit zuordnen. Aus sicherheitstechnischen Aspekten sollte man dies nicht tun, muss dann immer sudo
vor die Befehle mit docker
schreiben.
sudo gpasswd -a namedesneuennutzers docker
Überprüfe noch, ob der Benutzer tatsächlich in der Gruppe gelandet ist.
id namedesneuennutzers
Als Letztes richten wir einen Ordner im Heimverzeichnis des neuen Nutzers an
cd ~
mkdir docker
Mit mkdir
(make directory) haben wir den Ordner docker im Homeverzeichnis (~) erstellt.
Sollte sich Lazydocker öffnen lassen, ist die Einrichtung abgeschlossen.
sudo lazydocker
Mit Q, ESC oder STRG + C lässt sich Lazydocker wieder beenden.
Docker-Compose mit OpenTTD
Nächster Schritt ist das Erstellen einer Docker-Compose Datei, durch die der Container mit OpenTTD gestartet wird. Zunächst benötigen wir einen Ordner, in der die Konfigurationsdatei und die Spielstände gespeichert werden können als auch die Docker-Compose Datei.
mkdir ~/docker/appdata/openttd -p
touch ~/docker/docker-compose-openttd.yml
Wir schauen nach, ob der Port 3979 bereits genutzt wird.
sudo lsof -i -P -n | grep LISTEN
Wir befüllen jetzt die Docker-Compose Datei.
nano ~/docker/docker-compose-openttd.yml
version: "3.7"
services:
openttd:
container_name: openttd
image: redditopenttd/openttd
ports:
- 3979:3979/tcp
- 3979:3979/udp
restart: unless-stopped
volumes:
- ./appdata/openttd:/config
environment:
- loadgame=false
Sollte der Port 3979 bereits genutzt werden, wählen wir einen anderen Port, unter dem der Docker erreicht werden kann. Zum Beispiel 3969:3979/tcp
und 3969:3979/udp
. Das ist auch nötig, wenn mehrere Server gleichzeitig laufen sollen.
Nachdem wir die Datei gespeichert haben, starten wir den Container.
cd ~/docker
docker-compose -f docker-compose-openttd.yml up -d
Und wir schauen uns an, ob etwas Ungewöhnliches im Log steht.
lazydocker
Zunächst stoppen wir unseren Container wieder.
docker-compose -f docker-compose-openttd down
Der Container lässt sich auch über Lazydocker stoppen.
Bearbeiten der Konfiguration
Nun sollte die Konfiguration nach eigenem belieben angepasst werden. Die Konfigurationsdatei sollte beim ersten Start des Containers automatisch heruntergeladen worden sein.
nano ~/docker/appdata/openttd/.config/openttd.cfg
Hier gibt es viele Möglichkeiten, ich ändere ein paar Werte der Standardeinstellungen:
min_active_clients = 1
Das Spiel wird pausiert, wenn nicht mindestens ein Spieler mit dem Server verbunden ist.
server_password = abc
Es ist möglich ein Passwort zu setzen, wodurch neue Spieler erst das Passwort eingeben müssen, um mitspielen zu können.
server_name = Unnamed Server
Der Server kann umbenannt werden.
autosave = quarterly
Das Spiel wird so viermal im Spieljahr gespeichert.
starting_year = 1920
Damit lässt sich bestimmen, in welchem Jahr das Spiel starten soll.
map_x = 9 map_y = 9
Die Größe der Karte kann verändert werden. Je größer die Karte, umso mehr muss der Server arbeiten.
infrastructure_maintenance = true
Dadurch wird in regelmäßigen Abständen ein Betrag gezahlt, der sich aus der Anzahl der Fläche mit Schienen, Kanälen oder Schleusen errechnet.
forbid_90_deg = true
Dadurch können Züge nicht 90° Kurven fahren.
max_aircraft = 100 max_ships = 200
Diese Einstellung verringert die Anzahl der Flugzeuge und Schiffe, die ein Unternehmen haben darf.
town_name = german
Das sorgt für deutsche Städtenamen.
terrain_type = 2
Das bringt eine etwas weniger flache Landschaft.
snow_line_height = 7
Schnee fängt tiefer an.
town_layout = 4
Abwechslungsreichere Städte
industry_density = 4
Geringere Industriedichte
station_noise_level = true
Mit dieser Einstellung ist die Anzahl der Flughäfen, die in der Nähe einer Stadt platziert werden können, nicht mehr festgelegt. Stattdessen hängt sie vom Lärmpegel der Flughäfen, ihrer Entfernung zum Stadtzentrum und der Einstellung der Stadt ab.
Den Rest lasse ich vorerst so, wie es ist. Jetzt lösche ich die bisherigen automatisch erstellten Spielstände.
cd ~/docker/appdata/openttd/.local/share/save
sudo rm -r autosave
Starten des Spiels
Wir passen die Konfiguration an, damit Spielstände geladen werden.
cd ~/docker
nano docker-compose-openttd.yml
version: "3.7"
services:
openttd:
container_name: openttd
image: redditopenttd/openttd
restart: unless-stopped
ports:
- 3979:3979/tcp
- 3979:3979/udp
volumes:
- ./appdata/openttd:/config
environment:
- loadgame=exit
Und es kann ein neues Spiel gestartet werden.
cd ~/docker
docker-compose -f docker-compose-openttd.yml up -d
Diesmal ist in den Logs zu sehen, dass das Spiel pausiert wurde, was an den veränderten Einstellungen liegt.
Jetzt ist es auch möglich, sich mit dem Spiel zu verbinden. Dazu installieren wir das Spiel und starten es. Im Menü „Mehrspieler“ kann man einen Server hinzufügen.
In das Eingabefeld muss die IP-Adresse inklusive Port eingegeben werden. Also zum Beispiel 191.80.90.90:3979. Anschließend kann man dem Server beitreten.
Update des Servers
Natürlich sollte man ab und an den Server aktualisieren, mit Docker ist das mit wenigen Zeilen Code erledigt.
cd ~/docker
docker-compose -f docker-compose-openttd.yml down
docker pull redditopenttd/openttd
docker-compose -f docker-compose-openttd.yml up -d
# Nicht vergessen auch mal den Host-Server zu updaten
sudo apt update && sudo apt upgrade
Über htop
kann man sich ansehen, ob der Server ausreichend Resourcen hat. An dieser Stelle wünsche ich noch viel Spaß beim Bauen 🚈