Difference between revisions of "How to setup a local QuakeJS server under Debian 9 or Debian 10"

From steamWiki
Jump to: navigation, search
(Finalize the Setup)
(Finalize the Setup)
Line 63: Line 63:
 
##Install ''[http://software.clapper.org/daemonize/ daemonize]'' (for use in our init.d script) by running <pre>sudo apt install daemonize</pre>
 
##Install ''[http://software.clapper.org/daemonize/ daemonize]'' (for use in our init.d script) by running <pre>sudo apt install daemonize</pre>
 
##Create a new service file by running <pre>sudo nano /etc/init.d/quakejs</pre>
 
##Create a new service file by running <pre>sudo nano /etc/init.d/quakejs</pre>
##Fill the file with the following THIS DOESN'T WORK YET<pre>### BEGIN INIT INFO&#10;# Provides:          quakejs&#10;# Required-Start:    $network&#10;# Required-Stop:     $network&#10;# Default-Start:     2 3 4 5&#10;# Default-Stop:      0 1 6&#10;# Short-Description: QuakeJs Server&#10;# Description:       Starts/Stops/Restarts the QuakeJS Server Daemon&#10;### END INIT INFO&#10;&#10;set -e&#10;&#10;PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin&#10;DESC="QuakeJS Server"&#10;NAME=quakejs-server&#10;USER=quake&#10;DIR=/home/quake/quakejs&#10;DAEMON=node build/ioq3ded.js +set fs_game baseq3 set dedicated 1 +exec server.cfg&#10;#PIDFILE=/var/run/$NAME.pid&#10;SCRIPTNAME=/etc/init.d/$NAME&#10;&#10;# Gracefully exit if the package has been removed.&#10;test -x $DAEMON || exit 0&#10;&#10;sleep 2&#10;sudo -u $USER $DAEMON $1 $OPTIONS&#10;</pre>
+
##Fill the file with the following <pre>#!/bin/sh&#10;#&#10;# /etc/init.d/quakejs&#10;# Subsystem file for "quakejs" server&#10;#&#10;# chkconfig: 2345 95 05&#10;# description: QuakeJS server daemon&#10;#&#10;# processname: quakejs&#10;# pidfile: /var/run/quakejs.pid&#10;&#10;RETVAL=0&#10;prog="quakejs"&#10;&#10;start() {&#10; echo "Starting $prog:"&#10; daemonize -v -p /var/run/$prog.pid -c /home/quake/quakejs -u quake /usr/bin/node build/ioq3ded.js +set fs_game baseq3 set dedicated 1 +exec server.cfg&#10; RETVAL=$?&#10; [ "$RETVAL" = 0 ] && touch /var/lock/subsys/$prog&#10; echo&#10;}&#10;&#10;stop() {&#10; echo "Stopping $prog:"&#10; killproc $prog -TERM&#10; RETVAL=$?&#10; [ "$RETVAL" = 0 ] && rm -f /var/lock/subsys/$prog&#10; echo&#10;}&#10;&#10;case "$1" in&#10; start)&#10; start&#10; ;;&#10; stop)&#10; stop&#10; ;;&#10; restart)&#10; stop&#10; sleep 3&#10; start&#10; ;;&#10; condrestart)&#10; if [ -f /var/lock/subsys/$prog ] ; then&#10; stop&#10; # avoid race&#10; sleep 3&#10; start&#10; fi&#10; ;;&#10; status)&#10; status $prog&#10; RETVAL=$?&#10; ;;&#10; *)&#10; echo $"Usage: $0 {start|stop|restart|condrestart|status}"&#10; RETVAL=1&#10;esac&#10;exit $RETVAL&#10;</pre>
 
##Make our new file executable by running <pre>sudo chmod +x /etc/init.d/quakejs</pre>
 
##Make our new file executable by running <pre>sudo chmod +x /etc/init.d/quakejs</pre>
 
##Enable it by running <pre>sudo update-rc.d quakejs defaults</pre>
 
##Enable it by running <pre>sudo update-rc.d quakejs defaults</pre>

Revision as of 19:51, 7 July 2019

TLDR: This how to will show you how to setup a local QuakeJS server, local Play page (for users to connect to the local server), and a local content server to provide files to the clients.

I found myself in a situation where I was going to be on a LAN without internet access for an extended period of time along with multiple people and multiple computers. I wanted a fun, fast paced, multiplayer game for us. The catch? I didn't want anyone to have to install anything since these computers didn't belong to us. That's a pretty tall order. What I found was QuakeJS. Quake 3 was open sourced at the beginning of 2012 and some awesome dudes based ioquake3 off of it. Another awesome dude created QuakeJS around 2013/2014. QuakeJS allows you to play Quake 3 entirely in a browser.

The source code has instructions for creating a dedicated server as well as building from source & generating assets for a content server. Unfortunately the Emscripten tool used to build the project has changed the way it operates in since 2014 and the current version of the QuakeJS source doesn't build with modern versions of Emscripten. I've found some work-arounds. Some helpful discussion on how to setup a local webpage to connect to the server (as well as providing the content necessary to play) can be found here.

The theory is pretty simple

  1. Follow Inolen's original instructions for setting up a QuakeJS server
  2. Download everything we might need from the content server http://content.quakejs.com and rehost it locally
  3. Download the source code (and referenced CSS & JS files) from http://www.quakejs.com/play, modify them for local use, and rehost them locally
  4. Frag

Below I'm going to break it down step by step

NOTE: This guide assumes your local server's hostname is "quakejs"

Prepare your Machine

  1. Make sure our system is up to date before we start by running
    sudo apt update
    and
    sudo apt upgrade
  2. Create a dedicated user to run our server with
    sudo adduser quake
  3. Temporarily give quake sudo access to make setup easier (we'll remove it later) by running
    sudo usermod -aG sudo quake
  4. Switch to our new quake user and start in his home directory by running
    su - quake

Setup a Local QuakeJS Server

  1. Install curl by running
    sudo apt install curl
  2. Add the repo for node.js by running
    curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
  3. Install the tools we need to setup our server by running
    sudo apt install git build-essential nodejs
  4. Make sure we're in our home directory by running
    cd ~
  5. Clone the original QuakeJS git repository (along with the ioq3 repository sub-module) by running
    git clone --recurse-submodules https://github.com/inolen/quakejs.git
  6. Move into the newly created quakejs directory by running
    cd quakejs
  7. Install the necessary node.js packages by running
    npm install
  8. Fix the vulnerabilities that can be easily addressed by running
    npm audit fix
  9. To download BASE3Q files, run the server for the 1st time by executing the following command. Hold down enter to get through the EULA, agree to the EULA by hitting y and game files will be downloaded. Once all files have been downloaded (you'll see the line ignoring setsockopt command) quit the server by hitting Ctrl+C
    node build/ioq3ded.js +set fs_game baseq3 +set dedicated 1
  10. Optionally run the following command to download additional CPMA files. Again hit Ctrl+C to quit the server once all files have been downloaded (you'll see the line ignoring setsockopt command)
    node build/ioq3ded.js +set fs_game cpma +set dedicated 1
  11. Create a baseq3 server config file by running the following command
    nano base/baseq3/server.cfg
    and fill in the body with the following
    seta sv_hostname "quakejs"
    seta sv_maxclients 12
    seta g_motd "Welcome to the Local baseq3 QuakeJS Server"
    seta g_quadfactor 3
    seta g_gametype 0
    seta timelimit 15
    seta fraglimit 25
    seta g_weaponrespawn 3
    seta g_inactivity 3000
    seta g_forcerespawn 0
    seta rconpassword "quakejs"
    set d1 "map q3dm7 ; set nextmap vstr d2"
    set d2 "map q3dm17 ; set nextmap vstr d1"
    vstr d1
    Make sure you change the password in seta rconpassword
  12. Optionally create a cpma server config file by running the following command
    nano base/cpma/server.cfg
    and fill in the body with the following
    seta sv_hostname "quakejs"
    seta sv_maxclients 12
    seta g_motd "Welcome to the Local cpma QuakeJS Server"
    seta g_quadfactor 3
    seta g_gametype 0
    seta timelimit 15
    seta fraglimit 25
    seta g_weaponrespawn 3
    seta g_inactivity 3000
    seta g_forcerespawn 0
    seta rconpassword "quakejs"
    set d1 "map q3dm7 ; set nextmap vstr d2"
    set d2 "map q3dm17 ; set nextmap vstr d1"
    vstr d1
    Make sure you change the password in seta rconpassword
  13. You can run your server with the following command, but the isn't much point until we setup the Content Server and Play Page.
    node build/ioq3ded.js +set fs_game baseq3 set dedicated 1 +exec server.cfg

Setup a Local Content Server

  1. Setup a webserver to host our content and install jq to help with downloading assets by running
    sudo apt install apache2 jq
  2. change directories to where our web files are hosted by running
    cd /var/www/html/
  3. Download a script that I wrote to simplify getting the assets from http://content.quakejs.com by Running
    sudo wget https://raw.githubusercontent.com/begleysm/quakejs/master/assets/get_assets.sh
  4. Make the script executable by running
    sudo chmod +x get_assets.sh
  5. Run the script to grab all of the assets from http://content.quakejs.com and put them where they can be accessed by clients. (Technically you already downloaded a couple of the files earlier but we'll do everything in 1 go to simplify things).
    sudo bash get_assets.sh
    This will put all of the asset files where they need to go in /assets.
  6. Optionally remove get_assets.sh by running
    sudo rm get_assets.sh

Setup a Local Play Page

  1. If you didn't already install Apache2 for the content server, do it now by running
    sudo apt install apache2
  2. Delete the default index.html that comes with Apache2 by running
    sudo rm /var/www/html/index.html
  3. Download a copy of the Play Page from the QuakeJS website and put it where it can be accessed locally by running
    sudo wget -O /var/www/html/index.html http://www.quakejs.com/play
  4. Download a copy of the CSS used to format the Play Page and it where it goes by running
    sudo wget -O /var/www/html/game.css http://www.quakejs.com/css/ff3bfe05fa66a6c5418f2f02b0e55e36-game.css
  5. Download a copy of the JS and put it where it goes by running
    sudo wget -O /var/www/html/ioquake3.js http://www.quakejs.com/js/38cbed8aa9a0bda4736d1aede69b4867-ioquake3.js
  6. Modify the Play Page you downloaded to make it suitable for running locally by running the following command and making the change specified below
    sudo nano /var/www/html/index.html
    1. Change Line 4 to say whatever you want, something like
      <title>QuakeJS Local</title>
    2. Change Line 5 to
      <link rel="stylesheet" href="/game.css"></link>
    3. Change Line 6 to
      <script type="text/javascript" src="/ioquake3.js"></script>
    4. Comment out Lines 7 through 16 to disable Google Analytics
      1. Change Line 7 to
        <!-- <script type="text/javascript">
      2. Change Line 16 to
        </script> -->
    5. Change Line 75 to
      var args = ['+set', 'fs_cdn', 'quakejs:80', '+connect', 'quakejs:27960'];

Finalize the Setup

  1. Configure Debian to autorun our server on boot
    1. Install daemonize (for use in our init.d script) by running
      sudo apt install daemonize
    2. Create a new service file by running
      sudo nano /etc/init.d/quakejs
    3. Fill the file with the following
      #!/bin/sh
      #
      # /etc/init.d/quakejs
      # Subsystem file for "quakejs" server
      #
      # chkconfig: 2345 95 05
      # description: QuakeJS server daemon
      #
      # processname: quakejs
      # pidfile: /var/run/quakejs.pid
      
      RETVAL=0
      prog="quakejs"
      
      start() {
      	echo "Starting $prog:"
      	daemonize -v -p /var/run/$prog.pid -c /home/quake/quakejs -u quake /usr/bin/node build/ioq3ded.js +set fs_game baseq3 set dedicated 1 +exec server.cfg
      	RETVAL=$?
      	[ "$RETVAL" = 0 ] && touch /var/lock/subsys/$prog
      	echo
      }
      
      stop() {
      	echo "Stopping $prog:"
      	killproc $prog -TERM
      	RETVAL=$?
      	[ "$RETVAL" = 0 ] && rm -f /var/lock/subsys/$prog
      	echo
      }
      
      case "$1" in
      	start)
      		start
      		;;
      	stop)
      		stop
      		;;
      	restart)
      		stop
      		sleep 3
      		start
      		;;
      	condrestart)
      		if [ -f /var/lock/subsys/$prog ] ; then
      			stop
      			# avoid race
      			sleep 3
      			start
      		fi
      		;;
      	status)
      		status $prog
      		RETVAL=$?
      		;;
      	*)
      		echo $"Usage: $0 {start|stop|restart|condrestart|status}"
      		RETVAL=1
      esac
      exit $RETVAL
      
    4. Make our new file executable by running
      sudo chmod +x /etc/init.d/quakejs
    5. Enable it by running
      sudo update-rc.d quakejs defaults
    6. You can test this by running
      sudo systemctl start quakejs
      and/or rebooting your machine by running
      sudo reboot
  2. Lastly we need to remove sudo privileges from user quake
    1. Get back to our original sudo user (not quake) by running the following command which undoes su - quake
      exit
    2. Remove quake from the sudo group by running
      gpasswd -d quake sudo

That's it! Whenever your quakejs server boots up it will automatically start the quakejs game server and Apache2 webserver. When a computer on your LAN visits http://quakejs/ they'll automatically download the files they need from http://quakejs/assets/ and then connect to the QuakeJS server at quakejs:27960.

Get a few friends together, have them point their browsers to http://quakejs/ and start fragging!