Skip to content

Dedicated

Igor Popov edited this page Dec 14, 2013 · 22 revisions

Original developer keks-n
Ported into OpenRA by ihptru


Search for dedicated server related bug reports


Linux - works
Windows - works
Mac OSX - works

You can run any Mod as dedicated.


To run:

  • Fetch required version of OpenRA
              If you compile from sources you will have to edit mods/<mod name>/mod.yaml to specify correct version!
              a) Compile ( make all )
  • It's better if you run OpenRA Dedicated server from bash script with "while loop" because it can crash and you won't even know about it.
        a) Create a file "start.sh" inside of OpenRA root directory
        b) Put next contents into it:
#!/bin/bash
Name="My_Dedicated_Server"
Mod="ra"
Dedicated="True"
DedicatedLoop="True"
ListenPort=1234
ExternalPort=1234
AdvertiseOnline="True"
Map="ba403f6bcb4cae934335b78be42f714992b3a71a"

while true; do
     mono OpenRA.Game.exe Game.Mod=$Mod Server.Dedicated=$Dedicated Server.DedicatedLoop=$DedicatedLoop \
     Server.Name=$Name Server.ListenPort=$ListenPort Server.ExternalPort=$ExternalPort \
     Server.AdvertiseOnline=$AdvertiseOnline Server.Map=$Map
done
  • Change file permissions ( chmod +x start.sh ) and run it ( ./start.sh )

Special notes:

  • Using Null Renderer, Null SoundEngine
  • Ignores DEV versions to join
  • A first client is admin; if admin leaves, last connected client becomes a new admin
  • A new instance is spawned once previous game is finished (counting that you are using Server.DedicatedLoop=True). If game is started with 1 client, a new instance is spawned immediately (we can destroy OpenRA process - it will not affect client's game)

Special abilities:

  • You can configure TimeOut after which started game have to be self-eliminated. Settings option:
             Server.TimeOut=value
              where <value> is a digit in miliseconds (1000 miliseconds = 1 second)
  • You can create a Black-IP-List containing a list of IP addresses which are forbidden to join server. Settings option:
             Server.Ban=IP1,IP2,IP3,...,IPn
  • Use Server.LockBots=True to forbid bots on your server

You can add a MOTD on your server by creating file motd.txt in OpenRA Support Directory, which is /home/<user>/.openra/ in Linux.


Example Scripts:

Here is an example init.d script that uses daemon to run an OpenRA Server (from a shell script within the OpenRA directory) as the user openra.

#!/bin/sh
### BEGIN INIT INFO
# Provides:          openra_ded
# Required-Start:    $remote_fs
# Required-Stop:     $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Initscript for an OpenRA server
# Description:       Starts a dedicated OpenRA server and allows
# it to be started/stopped/restarted with init.d
### END INIT INFO

# Author: Dan9550

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="OpenRA dedicated server"
NAME="openra_ded"

# The executable to use:
DAEMON=/usr/share/openra/start.sh

SCRIPTNAME=/etc/init.d/$NAME

#The game will be executed as this user. NEVER execute as root
USERNAME=openra

#USERNAME must have write access to the HOMEDIR
HOMEDIR=/home/$USERNAME

[ -r /etc/default/$NAME ] && . /etc/default/$NAME

. /lib/init/vars.sh

. /lib/lsb/init-functions

do_start()
{
        daemon --name="$NAME" --user=$USERNAME --running && return 1
        daemon --name="$NAME" --respawn --user=$USERNAME --output=/home/openra/openra_ded.out --env=HOME=$HOMEDIR  $DAEMON > /dev/null
}

do_stop()
{
        daemon --name=$NAME --user=$USERNAME --running ] || return 1
        daemon --name=$NAME --user=$USERNAME --stop
        pkill -f "mono OpenRA*"

}

do_reload() {
        return 0
}

case "$1" in
  start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  restart|force-reload)
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
                do_start
                case "$?" in
                        0) log_end_msg 0 ;;
                        1) log_end_msg 1 ;; # Old process is still running
                        *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
          *)
                log_end_msg 1
                ;;
        esac
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
        exit 3
        ;;
esac

Below is an example script for automation of OpenRA updates, it is designed to be run daily and could be much more sophisticated. If your server is not running on a Debian based system it should be modified accordingly.

#! /bin/bash
# Magical OpenRA Server (bleed) update script
#
# By Dan9550

# At this point i should stop the current server
/etc/init.d/openra stop

# Gets date, formatted for the download link of course
TODAY=$(date +"%Y%m%d")

# Attempts to download new build
wget http://openra.res0l.net/download/linux/deb/playtest/$TODAY -O /tmp/oraupdate.deb

# Installs new build
dpkg -i /tmp/oraupdate.deb

# Removes the package
rm /tmp/oraupdate.deb

# Server restart
/etc/init.d/openra start

Another example Scripts:

There're very crude, but works.

Auto-building the git version:

cron: * * * * * chroot /srv/wheezy /usr/src/update-openra.sh

/srv/wheezy/usr/src/update-openra.sh

#!/bin/bash
cd /usr/src

update() {
        /usr/src/build-openra.sh
}

cleanup() {
        lockfile-remove /tmp/update-openra
}
trap cleanup EXIT TERM
lockfile-create /tmp/update-openra

cd openra-bleed
git pull https://github.com/OpenRA/OpenRA.git bleed | grep 'Already up-to-date' >/dev/null || update
cd - >/dev/null

/srv/wheezy/usr/src/update-openra.sh

#!/bin/bash
cd /usr/src

VERSION=$(date +'%Y%m%d%H%M')

cd openra-bleed
make clean
cd -

rm -rf openra-bleed*{gz,deb,dsc} openra-bleed_* openra-bleed/debian
cp -Rp openra-bleed openra-bleed_$VERSION
cd openra-bleed_$VERSION
hash=$(git log | head -1 | awk '{print $2}')
shorthash=${hash:0:4}
for patch in $(cat ../openra-patches/series); do
        sed -e "s/bleed-XXXX/bleed-$shorthash/g" < ../openra-patches/$patch | patch
done

for file in mods/*/mod.yaml; do
        mv "$file" "$file"~
        sed -e "s/{DEV_VERSION}/bleed-$shorthash/g" > "$file" < "$file"~
done
cd -

tar -czf openra-bleed_$VERSION.tar.gz openra-bleed_$VERSION

cd openra-bleed_$VERSION
make dependencies
dh_make -e [email protected] -f ../openra-bleed_$VERSION.tar.gz -p openra-bleed_$VERSION -C s -y
printf 'override_dh_auto_build:\n\tmake all\n\n' >> debian/rules
echo correction | dpkg-source --commit -q
dpkg-buildpackage -rfakeroot

cd -

cat *deb > builds/openra-bleed.deb-new
if [ "$(stat -c %s builds/openra-bleed.deb-new)" -gt "0" ]; then
        cat builds/openra-bleed.deb-new > builds/openra-bleed.deb
        echo "$hash" > builds/bleed-hash
fi
rm -f "builds/openra-bleed.deb-new"

Auto-updating the servers:

cron:

* * * * * /usr/local/sbin/openra-bleed-update.sh
* * * * * /usr/local/sbin/openra-release-update.sh release
* * * * * /usr/local/sbin/openra-release-update.sh playtest

/usr/local/sbin/openra-bleed-update.sh

#!/bin/bash

HASHURL='http://openra.ipdx.ru:82/deb/bleed-hash'
DEBURL='http://openra.ipdx.ru:82/deb/openra-bleed.deb'

newhash=$(wget "$HASHURL" -O - -o /dev/null)
oldhash=$(cat /home/openra/chroot/bleed-hash)

if [ "$newhash" = "" ]; then
        exit;
fi

if [ "$newhash" != "$oldhash" ]; then
        wget "$DEBURL" -O /home/openra/chroot/tmp/openra-bleed.deb -o -
        chroot /home/openra/chroot mkdir -p /usr/local/openra/bleed/current
        chroot /home/openra/chroot rm -rf /usr/local/openra/bleed/current/*
        chroot /home/openra/chroot dpkg --force-all --instdir /usr/local/openra/bleed/current -i /tmp/openra-bleed.deb
        kill $(netstat -nap | grep :1[234]2[0-9]\ | tr "/" " " | awk '{print $7}')
        echo "$newhash" > /home/openra/chroot/bleed-hash
fi

/usr/local/sbin/openra-release-update.sh

#!/bin/bash
PATH=/usr/bin:/bin:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin

TYPE="$1"

URL=$(wget 'http://openra.res0l.net/download/linux/deb/' -o /dev/null -O - | grep "$TYPE/[0-9]" | head -1 | awk -F '"' '{print $2}')
VERSION=${URL##*/}

OLDVERSION=$(cat /home/openra/chroot/"$TYPE"-version)

case "$TYPE" in
        release)
                n=3
                ;;
        playtest)
                n=4
                ;;
esac

if [ "$VERSION" = "" ]; then
        exit;
fi

if [ "$VERSION" != "$OLDVERSION" ]; then
        wget "http://openra.res0l.net$URL" -O "/home/openra/chroot/tmp/openra-$TYPE-${VERSION}.deb" -o -
        chroot /home/openra/chroot mkdir -p "/usr/local/openra/$TYPE/${VERSION}"
        chroot /home/openra/chroot dpkg --force-all --instdir "/usr/local/openra/$TYPE/${VERSION}" -i "/tmp/openra-$TYPE-${VERSION}.deb"
        chroot /home/openra/chroot rm -f "/usr/local/openra/$TYPE/current"
        chroot /home/openra/chroot ln -sf "${VERSION}" "/usr/local/openra/${TYPE}/current"
        kill $(netstat -nap | grep :1[234]${n}[0-9]\ | tr "/" " " | awk '{print $7}')
        echo "$VERSION" > /home/openra/chroot/$TYPE-version
fi

How are the servers runned:

cat /etc/rc.local

screen -dm -S openrarel_0 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start.sh 1230 release"
screen -dm -S openrarel_1 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start.sh 1231 release"
screen -dm -S openrarel_2 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start.sh 1232 release"
screen -dm -S openrarel_3 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start.sh 1233 release"
screen -dm -S openrarel_4 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start.sh 1234 release"
screen -dm -S openrarel_5 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start.sh 1235 release"
screen -dm -S openrarel_6 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start.sh 1236 release"
screen -dm -S openrarel_7 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start.sh 1237 release"
screen -dm -S openracncrel_0 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start_cnc.sh 1330 release"
screen -dm -S openracncrel_1 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start_cnc.sh 1331 release"
screen -dm -S openrad2krel_0 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start_d2k.sh 1430 release"
screen -dm -S openrad2krel_1 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start_d2k.sh 1431 release"

screen -dm -S openrapt_0 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start.sh 1240 playtest"
screen -dm -S openrapt_1 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start.sh 1241 playtest"
screen -dm -S openrapt_2 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start.sh 1242 playtest"
screen -dm -S openrapt_3 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start.sh 1243 playtest"
screen -dm -S openrapt_4 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start.sh 1244 playtest"
screen -dm -S openrapt_5 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start.sh 1245 playtest"
screen -dm -S openracncpt_0 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start_cnc.sh 1340 playtest"
screen -dm -S openracncpt_1 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start_cnc.sh 1341 playtest"
screen -dm -S openrad2kpt_0 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start_d2k.sh 1440 playtest"
screen -dm -S openrad2kpt_1 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start_d2k.sh 1441 playtest"

screen -dm -S openrableed_0 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start.sh 1220 bleed"
screen -dm -S openrableed_1 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start.sh 1221 bleed"
screen -dm -S openracncbleed_0 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start_cnc.sh 1320 bleed"
screen -dm -S openracncbleed_1 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start_cnc.sh 1321 bleed"
screen -dm -S openrad2kbleed_0 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start_d2k.sh 1420 bleed"
screen -dm -S openrad2kbleed_1 chroot /home/openra/chroot su -l openra -c "/home/openra/bin/start_d2k.sh 1421 bleed"

/home/openra/chroot/home/openra/bin/start.sh

#!/bin/bash
Name="xaionaro_hetzner_$2"
Mod="ra"
Dedicated="True"
DedicatedLoop="True"
ListenPort="$1"
ExternalPort="$1"
AdvertiseOnline="True"
#Map="ba403f6bcb4cae934335b78be42f714992b3a71a"
#Map="399372de425c9e8e9d49df90fbbc467dcfc52ac7"

# Haos Ridges
Map="3bc995f925d5b1a894513fb3e570ce22784adcf1"


while true; do
        cd "/usr/local/openra/$2/current/usr/share/openra" 2>/dev/null || 
        cd "/usr/local/openra/$2/current/usr/local/share/openra" 2>/dev/null ||
        cd "/usr/local/openra/$2/current/usr/share/openra-bleed" 2>/dev/null || 
        cd "/usr/local/openra/$2/current/usr/local/share/openra-bleed"
        if [ "$2" = "release" ]; then
                mono OpenRA.Game.exe Game.Mod=$Mod Server.Dedicated=$Dedicated Server.DedicatedLoop=$DedicatedLoop \
                        Server.Name=$Name Server.ListenPort=$ListenPort Server.ExternalPort=$ExternalPort \
                        Server.AdvertiseOnline=$AdvertiseOnline Server.Map=$Map
        else
                mono OpenRA.Game.exe Game.Mod=$Mod Server.Dedicated=$Dedicated Server.DedicatedLoop=$DedicatedLoop \
                        Server.Name=$Name Server.ListenPort=$ListenPort Server.ExternalPort=$ExternalPort \
                        Server.AdvertiseOnline=$AdvertiseOnline Server.Map=$Map
        fi
done


Another simple script to automatically host OpenRA server (one per Mod) in a separate screen session once new release or playtest version is published: ihptru/openra-server-hoster


Clone this wiki locally