OpenTTD

Wstęp

Artykuł dotyczy uruchomienia serwera OpenTTD w systemie Debian Linux. Poradnik opiera się na wersji Debian 13 (wersja minimalne z podstawowymi narzędziami oraz SSH) oraz OpenTTD 15.

Instalacja

Na początku musimy zainstalować kilka bibliotek i programwów:

apt install libgomp1 libsdl2-compat unzip 7zip

Dodajemy użytkownika, na którym będzie uruchomiona usługa. W moim przypadku będzie to użytkownik openttd:

useradd -m -s /bin/bash openttd

Dla bezpieczeństwa zmieniamy hasło dla użytkownika usługi:

passwd openttd

Logujemy się na użytkownika usługi:

su - openttd

Ściągamy OpenTTD:

mkdir versions
cd versions
wget https://cdn.openttd.org/openttd-releases/15.3/openttd-15.3-linux-generic-amd64.tar.xz
unxz ./openttd-15.3-linux-generic-amd64.tar.xz
tar xf ./openttd-15.3-linux-generic-amd64.tar
rm ./openttd-15.3-linux-generic-amd64.tar
wget https://cdn.openttd.org/opengfx-releases/8.0/opengfx-8.0-all.zip
unzip ./opengfx-8.0-all.zip
mkdir -p ~/.local/share/openttd/baseset
mv ./opengfx-8.0.tar ~/.local/share/openttd/baseset
rm ./opengfx-8.0-all.zip

Tworzymy też link, aby łatwiej później było instalować aktualizacje:

ln -s ./openttd-15.3-linux-generic-amd64 ./openttd

Sprawdzamy czy OpenTTD startuje:

~/versions/openttd/openttd -D

Jeśli pojawi się log z utworzeniem mapy:

[2026-06-06 14:41:00] dbg: [net:3] Generating map, please wait...
[2026-06-06 14:41:00] dbg: [net:3] Map generation percentage complete: 5
[2026-06-06 14:41:00] dbg: [net:3] Map generation percentage complete: 11
[2026-06-06 14:41:00] dbg: [net:3] Map generation percentage complete: 15
[2026-06-06 14:41:00] dbg: [net:3] Map generation percentage complete: 20
[2026-06-06 14:41:01] dbg: [net:3] Map generation percentage complete: 25
[2026-06-06 14:41:01] dbg: [net:3] Map generation percentage complete: 30
[2026-06-06 14:41:01] dbg: [net:3] Map generation percentage complete: 35
[2026-06-06 14:41:01] dbg: [net:3] Map generation percentage complete: 40
[2026-06-06 14:41:01] dbg: [net:3] Map generation percentage complete: 45
[2026-06-06 14:41:01] dbg: [net:3] Map generation percentage complete: 50
[2026-06-06 14:41:01] dbg: [net:3] Map generation percentage complete: 60
[2026-06-06 14:41:01] dbg: [net:3] Map generation percentage complete: 65
[2026-06-06 14:41:01] dbg: [net:3] Map generation percentage complete: 70
[2026-06-06 14:41:01] dbg: [net:3] Map generation percentage complete: 75
[2026-06-06 14:41:01] dbg: [net:3] Map generation percentage complete: 80
[2026-06-06 14:41:01] dbg: [net:3] Map generation percentage complete: 85
[2026-06-06 14:41:01] dbg: [net:3] Map generation percentage complete: 90
[2026-06-06 14:41:01] dbg: [net:3] Map generation percentage complete: 99
[2026-06-06 14:41:01] dbg: [net:3] Map generated, starting game

To znaczy, że wszystko jest na dobrej drodze już do dalszej konfiguracji. Przerywamy proces naciskając klawisze CTRL + C.

Konfiguracja

Edytujemy plik /home/openttd/.config/openttd/openttd.cfg i szukamy w nim kilku ważnych opcji dotyczących gry sieciowej:

  • pause_on_join = true – pauza podczas łączenia się innych graczy
  • server_game_type = public – czy serwer ma być publicznie widoczny na liście serwerów
  • autoclean_companies = true oraz autoclean_novehicles = 6 – po ilu miesiącach w grze ma być usunięta firma, która jest bez gracza oraz bez pojazdów
  • max_companies = 12 – maksymalna ilość firm graczy
  • max_clients = 20 – maksymalna ilość graczy
  • restart_game_year – w którym roku ma nastąpić restart gry
  • restart_hours – po ilu godzinach ma nastąpić restart gry
  • min_active_clients – minimalna ilość graczy, aby serwer nie był w trybie pauzy

Edytujemy plik /home/openttd/.config/openttd/private.cfg i szukamy opcji:

  • server_name – nazwa jaka ma się pojawiać na liście serwerów
  • [bans] – od nowej linii lista zbanowanych adresów IP zapisanych w CIDR

W pliku /home/openttd/.config/openttd/secrets.cfg ustawiamy hasło RCON (zdalne wykonywanie komend):

  • rcon_password

Firewall

OpenTTD wymaga 3 portów:

  • TCP i UDP 3979 – wymagany do grania w sieci
  • UDP 3978 – wymagany jeśli chcemy, aby serwer był widoczny na liście serwerów

Autostart

Tworzymy i edytujemy plik /etc/systemd/system/openttd.service:

[Unit]
Description=OpenTTD Server
After=network.target

[Service]
User=openttd
Group=openttd
WorkingDirectory=/home/openttd/versions/openttd
Type=simple
KillSignal=SIGCONT
Sockets=openttd.socket
ExecStart=/bin/sh -c "/home/openttd/versions/openttd/openttd -D < /run/openttd.control"
ExecStop=/bin/sh -c "echo exit > /run/openttd.control"
StandardOutput=append:/home/openttd/openttd.log
StandardError=append:/home/openttd/openttd.log
RestartSec=15
Restart=on-failure

[Install]
WantedBy=multi-user.target

Tworzymy i edytujemy plik /etc/systemd/system/openttd.socket:

[Unit]
BindsTo=openttd.service

[Socket]
ListenFIFO=/run/openttd.control
FileDescriptorName=control
RemoveOnStop=true
SocketMode=0660
SocketUser=openttd
SocketGroup=openttd

Proszę zwrócić uwagę w w/w plikach na użytkowników oraz ścieżki jeśli użytkownik usługi jest inny niż openttd.

Odblokowanie usługi:

systemctl enable openttd

Uruchomienie usługi:

service openttd start

Po starcie sprawdzamy czy usługa wystartowała, a szczegóły będą w pliku: /home/openttd/openttd.log.

Kopia zapasowa

Pliki i katalogi, które powinniśmy archiwizować:

  • /home/openttd/*.log
  • /home/openttd/.local/share/openttd
  • /home/openttd/.config/openttd

Poniżej przykładowy skrypt do wykonywania kopii zapasowej, który wykonuje kopię co godzinę i umieszcza je w dwóch katalogach:

  • ${HOME}/backup/hours – co godzinę z ostatnich 14 dni
  • ${HOME}/backup/days – ostatni backup wykonany danego dnia

Backupy wykonują się tylko wtedy, gdy w grze zmienia się data. Jeśli serwer jest zapauzowany to nie wykonuje się kopia bo nic się nie zmieniło.

#!/bin/bash

if [ -e /run/openttd.control ];
then
 echo getdate > /run/openttd.control
 sleep 2
 lastTimeGame="`cat /home/openttd/openttd.log | grep \"Date:\" | tail -1 | awk '{print $2}'`"
 if [ ! -f /home/openttd/lasttime.txt ];
 then
  echo "1935-01-01" > /home/openttd/lasttime.txt
 fi
 lastTimeFile="`cat /home/openttd/lasttime.txt`"
 if [ "$lastTimeGame" != "$lastTimeFile" ];
 then
  echo "$lastTimeGame" > /home/openttd/lasttime.txt
  file7z="${HOME}/backup/hours/openttd_`date '+%Y%m%d_%H%M'`.7z"
  cd /
  7za a ${file7z} home/openttd/*.log home/openttd/.local/share/openttd home/openttd/.config/openttd  home/openttd/*.sh
  file7zday="${HOME}/backup/days/openttd_`date '+%m%d'`.7z"
  cp ${file7z} ${file7zday}
  find ${HOME}/backup/hours/openttd_*.7z -mtime +14 -type f -exec rm {} \;
 fi
fi

Tworzymy katalogi:

mkdir -p ${HOME}/backup/{hours,days}

Ustawiamy w cronie:

17 * * * * /home/openttd/backup.sh > /dev/null

RCON

Zdalna administracja serwerem z poziomu OpenTTD. Aby wykonać komendę RCON to należy będąc w grze podłączonej do naszego serwera nacisnąć przycisk tyldy (~) i wpisać: rcon naszehaslo 'komenda’. Lista przydatnych komend:

  • rcon naszehaslo clients – lista graczy
  • rcon naszehaslo companies – lista założonych firm graczy
  • rcon naszehaslo 'kick 111′ – wykopanie gracza o id 111, gdzie id gracza weźmiemy z komendy clients
  • rcon naszehaslo 'ban 111′ – zbanowanie gracza o id 111, gdzie id gracza weźmiemy z komendy clients. Możemy też banować po adresach IP.
  • rcon naszehaslo banlist – wyświetlenie zbanowanych graczy

Pozostałe komendy są dostępne pod adresem: https://wiki.openttd.org/en/Manual/Console

Kompilacja

Jeśli z jakiegoś powodu potrzebujemy skompilować OpenTTD to możemy wykonać za pomocą poniższych poleceń. Najpierw instalacja odpowiednich narzędzi:

apt build-dep openttd
apt install unzip

Ściągamy źródła, wypakowujemy i kompilujemy:

wget https://cdn.openttd.org/openttd-releases/15.3/openttd-15.3-source.zip
unzip ./openttd-15.3-source.zip
cd openttd-15.3/
mkdir build
cd build
cmake -DCMAKE_C_COMPILER=gcc-14 -DCMAKE_CXX_COMPILER=g++-14 ..
make -j$(nproc)

Gra jest skompilowana, należy teraz skopiować katalogi:

mkdir ~/naszkatalog
cp -R {ai,baseset,game,lang,openttd} ~/naszkatalog/

Jeśli po uruchomieniu będziemy mieć błąd ze względu na brak grafik więc trzeba zainstalować je:

wget https://cdn.openttd.org/opengfx-releases/8.0/opengfx-8.0-all.zip
unzip ./opengfx-8.0-all.zip
mkdir -p ~/.local/share/openttd/baseset
mv ./opengfx-8.0.tar ~/.local/share/openttd/baseset
rm ./opengfx-8.0-all.zip 

Więcej na stronie OpenTTD nt kompilacji: https://wiki.openttd.org/en/Archive/Compilation%20and%20Ports/Compiling%20on%20GNU%E2%88%95Linux%20and%20%F0%9F%9F%89BSD#debian-ubuntu


Opublikowano:

Ostatni modyfikacja:

Tagi: