-
Notifications
You must be signed in to change notification settings - Fork 0
Dedicated
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=Trueto 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