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