Skip to content

Commit

Permalink
[Doc] Add dedicated host documentation and linux scripts
Browse files Browse the repository at this point in the history
  • Loading branch information
CupnPlateGames authored and past-due committed Jan 14, 2024
1 parent d18a264 commit 33b4629
Show file tree
Hide file tree
Showing 6 changed files with 293 additions and 1 deletion.
2 changes: 1 addition & 1 deletion doc/hosting/AutohostConfig.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Autohost configuration

Running the game with the `--autohost` command line argument opens a game automatically. Combined with `--headless` and `--nosound` it allows to run a dedicated server to host a game. See also `PlayerKeys.md` to add administrators with `--addlobbyadminhash` and `--addlobbyadminpublickey`.
Running the game with the `--autohost` command line argument opens a game automatically. Combined with `--headless` and `--nosound` it allows to run a dedicated server to host a game. See also `PlayerKeys.md` to add administrators with `--addlobbyadminhash` and `--addlobbyadminpublickey` and `DedicatedHost.md` for more details about running a dedicated server.

The autohost option requires a configuration file set in your data directory, under the `autohost` directory. For example : `warzone2100 --autohost=my_host` will look for the configuration file `autohost/my_host`.

Expand Down
104 changes: 104 additions & 0 deletions doc/hosting/DedicatedHost.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
Running a dedicated host
========================

Warzone 2100 can run in background with a few command line arguments and some game configuration files.

Setting the server and running the game manually
------------------------------------------------

### Running the game from the command line

#### Basic command

```
warzone2100 --autohost=<host file> --gameport=<port number> --startplayers=<players> --headless --nosound
```

This command will run a game without front-end for a specific game configuration.

* `--autohost` indicates which game configuration to use. See `AutohostConfig.md` to create a file. Always use `spectatorHost: true`, the host cannot play.
* `--gameport` gives the port number to use. By default it will try to run on port 2100. Each concurrent games must have distinct ports.
* `--startplayers` holds the number of players required to start the game.
* `--headless` disables the GUI, `--nosound` disables the sound.

A default game will start if the autohost file cannot be read or contains errors. If the requested port is not available, the command will fail and stop.

#### Extended command

You can provide more arguments to fine-tune your environment.

* `--configdir=<directory>` will read the configuration file, maps, mods and store logs in the given directory. You can create a default one by providing this option on your regular game, changing your name to create the host keys and copy the newly created directory to your server.
* `--enablelobbyslashcmd` allows administrators to use slash commands to modify the settings (see below to add administrators).
* `--addlobbyadminhash=<hash>` grants admin right to the given player, identified by their hash. This argument must be repeated to add multiple administrators. See `PlayerKeys.md` for details about hashes.
* `--addlobbyadminpublickey=<public key>` grants admin rights to the given player, by their public key. This argument must be repeated to add multiple administrators. See `PlayerKeys.md` for details about keys.
* `--autorating=<host>` overrides the autorating url. See `AutoratingServer.md` for details about the autorating server.


### Checking your firewall

If your server starts but nobody can join, check that your firewall is accepting incoming TCP connections on the given port.

#### With nftables

Check your current rules with `nft list ruleset`. If it is not empty check that the input chain accepts the ports you use for Warzone 2100, especially if your input chain drops unknown ports. For example:

```
table inet filter {
chain input {
[System stuff]
tcp dport { 2100-2105 } ct state new accept # Warzone 2100
counter drop
}
[Other chains]
}
```

### Managing a banlist

You can provide a file with banned IP which contains one ban per line. It can include wildcards.

Put this `banlist.txt` file at the root of your config directory and it will be automatically loaded at game start.


Scripting the server
--------------------

### Linux: Bash + Systemd

#### Configuring the bash scripts

The scripts under `linux_scripts` will start a game automatically by picking the next available port and select a random map from a pool. Those scripts can be installed anywhere but must be kept in the same directory.

Prerequisites:

* `bash` to run the script.
* `sed` to pick a map randomly.
* `ss` or `netstat` to check for an available port.
* `systemd` to run the scripts automatically.

Copy `common_sample.sh` to `common.sh` and update the few variables according to your environment.

Then copy and edit `game_sample.sh` for each game type you would like to run.

And try to run the server by manually calling the script, if you copied `game_sample.sh` to `game.sh`:

```
bash game.sh
```

#### Automatically run the scripts with systemd

Copy and rename a `wz2100host_sample.service` to `/etc/systemd/system/`, one for each simultaneously opened game and edit those few lines:

* `WorkingDirectory=<path>` set it to the directory where the bash scripts are.
* `ExecStart=bash <file path>` set to the game script.
* `User=<user>` pick the system user that will run the game.

Then for each service created, enable and start the service. Enabling the service will automatically run it at boot and starting the service runs it manually without requiring to reboot.

```
systemctl enable <renamed_wz2100host.service>
systemctl start <renamed_wz2100host.service>
```

You can then check the status for each game with `systemctl status <renamed_wz2100host.service>`.
80 changes: 80 additions & 0 deletions doc/hosting/linux_scripts/common.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
#!/bin/bash -e

function check {
if [ ! $(command -v netstat) ] && [ ! $(command -v ss) ]; then
echo "[ERROR] netstat or ss is required to check for available ports"
exit 1
fi
if [ ! $(command -v $wz2100cmd) ]; then
echo "[ERROR] Cannot execute \"$wz2100cmd\"."
exit 1
fi
if [ "$players" == "" ] || [ ! $players -gt 0 ]; then
echo "[ERROR] The number of players is not set."
exit 1
fi
if [ "$hostfile" == "" ]; then
echo "[ERROR] No hostfile given."
exit 1
fi
if [ "$portmin" == "" ] || [ ! $portmin -gt 0 ]; then
portmin=2100
fi
if [ "$portmax" == "" ] || [ $portmax -lt $portmin ]; then
portmax=$portmin
fi
}

function run_host {
check
hostpath="$cfgdir/autohost"
# Find next available port
port=$((portmin - 1))
while true; do
port=$((port + 1))
if [ $(command -v netstat) ]; then
ports="$(netstat -nt | grep [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*:${port})"
else
ports="$(ss -ntO | grep [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*:${port})"
fi
if [ "$ports" == "" ] || [ "$port" -gt "$portmax" ]; then
break
fi
done

if [ "$port" -gt "$portmax" ]; then
echo "No more port available"
return 1
fi
# Set random map
if [ ${#maps[@]} -gt 0 ]; then
if [ "$cfgdir" == "" ]; then
echo "[ERROR] cfgdir must be set to edit autohost file"
return 1
fi
if [ ! -f "$hostpath/$hostfile" ]; then
echo "[ERROR] Host file \"$hostpath/$hostfile\" not found."
return 1
fi
rnd=$(($RANDOM % ${#maps[@]}))
map=${maps[$rnd]}
sed -i "s/\"map\": \"\(.*\)\",$/\"map\": \"$map\",/g" $hostpath/$hostfile
fi
# Set admin list
admcmd=""
for adm in ${adminkeys[@]}
do
admcmd+=" --addlobbyadminpublickey=${adm}"
done
for adm in ${adminhashes[@]}
do
admcmd+=" --addlobbyadminhash=${adm}"
done
if [ "$cfgdir" == "" ]; then
configdir=""
else
configdir="--configdir=$cfgdir"
fi
# Run game
$wz2100cmd $configdir --autohost=$hostfile --gameport=$port --startplayers=$players --enablelobbyslashcmd $admcmd --headless --nosound
}
46 changes: 46 additions & 0 deletions doc/hosting/linux_scripts/config_sample.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#!/bin/bash -e

## Common configuration values
## This file is shared between all games

## Administrators
#################
## adminhashes: the list of admin players' hash
## adminkeys: the list of admin players' public key
## The host is always administrator
## Put keys and/or hashes according to your likings and between quotes.
adminkeys=(
# 'admin1 key'
# 'admin2 key'
)
adminhashes=(
# 'admin3 hash'
# 'admin4 hash'
)

## Ports
########
## portmin: the lowest port to use if available
## portmax: the highest port to use
## Set a range of ports slightly larger than the maximum number of simultaneous
## games in case a game crashes and cannot release the port properly before the
## next game is created.
portmin=2100
portmax=2105

## Game command
###############
## Uncomment or modifiy the command to run Warzone 2100.
## The script will add all the required parameters to run the game.

## Installed from snap
#wz2100cmd="snap run warzone2100"

## Installed from flatpack
#wz2100cmd="flatpak run net.wz2100.wz2100"

## Installed in PATH
#wz2100cmd="warzone2100"

## Built from source
#wz2100cmd="/<path>/<to>/<warzone2100>/bin/warzone2100"
45 changes: 45 additions & 0 deletions doc/hosting/linux_scripts/game_sample.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#!/bin/bash -e

## Game configuration values
## One file for each game type

## Warzone2100 configuration directory
## Leave commented to use the default one
## Required to randomize maps
## Snap default
#cfgdir="$HOME/snap/warzone2100/common/warzone2100"
## Flatpak default
#cfgdir="$HOME/.var/app/net.wz2100.wz2100/data/warzone2100/"
## Home default
#cfgdir="$HOME/.local/share/warzone2100"

## Map pool
## Leave commented to skip randomized maps or provide a list of map names.
## The autohost file will be updated each time with one of these values
#maps=("map1" "map2" "map3")

## Host file
## The name of the file in your 'autohost' directory inside cfgdir.
hostfile="my_game.json"

## Players
## The number of players required to start the game.
players=2


## Run script
## Do not edit below
DIR="${BASH_SOURCE%/*}"
if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi
if [ ! -f "$DIR/common.sh" ]; then
echo "[ERROR] common.sh not found."
exit 1
fi
if [ ! -f "$DIR/config.sh" ]; then
echo "[ERROR] config.sh not found."
echo "Copy 'config_sample.sh' to 'config.sh' and check if the file is readable."
exit 1
fi
. "$DIR/common.sh"
. "$DIR/config.sh"
run_host
17 changes: 17 additions & 0 deletions doc/hosting/linux_scripts/wz2100host_sample.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
[Unit]
Description=Host a Warzone2100 game
Wants=network.target

[Service]
# Edit those three lines
WorkingDirectory=/<path>/<to>/<hosting>/<scripts>
ExecStart=bash game.sh
User=warzone2100

Type=simple
PrivateTmp=true
Restart=on-success
RestartSec=3

[Install]
WantedBy=multi-user.target

0 comments on commit 33b4629

Please sign in to comment.