Package: shinqlx
shinqlxShiN0's Quake Live eXtension, implemented in Rust. Most functionality fromminqlxshould work. Support for Python 3.8 and above should work out of the box.Some limitations apply for certain minqlx functions maybe used in plugins.32-bit implementation may not work. It's untested.Some compatibility might not work, as this implementation is not yet fully tested.Compilation and installationInstall rust with the default profile and the nightly toolchain and Rust's build tool cargo, and make sure to add the rust-src component:curl--proto'=https'--tlsv1.2-sSfhttps://sh.rustup.rs|sh
rustupinstallnightly--profiledefault
rustupcomponentaddrust-src
rustupdefaultnightlyInstall Python 3.sudoapt-getupdate
sudoapt-get-yinstallpython3python3-devpython3-pipMake sure, that you have installed Python 3.9 or later:python3--versionNow you should get Redis, Git and build utils which will be used by minqlx's plugins and for compiling shinqlx:sudoapt-get-yinstallredis-serverpkg-configlibssl-devgitbuild-essentialTo avoid interference with operating system packages (and future adaptions from Debian v12 onwards for example), I recommend installing a python virtual environment to install the packges that shinqlx/minqlx or your plugins need:python3-mvenv~/qlds/.venvsource~/qlds/.venv/bin/activateIf you need to install additional packages later, you can activate the virtual python environment withsource ~/qlds/.venv/bin/activateanytime, and then run yourpip install <library>as you like.Install maturin into the virtual python environment:pipinstallmaturinInstall shinqlx from pypi source distribution into the virtual python environment (this may take a while):pipinstallshinqlxSince this may take a while, if you want to see the current progress use run in verbose mode:pipinstall-vshinqlxCopy the convenience scriptrun_server_shinqlx.shinto~/qlds, or whatever other directory you might have installed the quake live dedicated server files in. (Note: The remaining sections assume you installed the dedicated server into ~/qlds)cprun_server_shinqlx.sh~/qlds/Note: In your server startup script, you will have to also activate the the python virtual environment where the different python libraries are installed. I recommend writing a custom script that can be started withsupervisordlater on, that calls run_server_shinqlx.sh, i.e.:#!/bin/bashbasepath="$(dirname$0)"gameport=`expr$1+27960`rconport=`expr$1+28960`servernum=`expr$1+1`source$basepath/.venv/bin/activateexec$basepath/run_server_shinqlx.sh\+setfs_basepath$basepath\+setnet_strict1\+setnet_port$gameport\+setfs_homepath/home/steam/.quakelive/$gameport\+setzmq_rcon_enable0\+setzmq_rcon_password"<a super secret rcon password that no one will ever guess>"\+setrmq_rcon_port$rconport\+setzmq_stats_enable1\+setzmq_stats_password"<a super secret stats password that sites like qlstats.net will need to know to gather stats from your server>"\+setzmq_stats_port$gameportrun_server.sh 0will start a server on port 27960,run_server.sh 1on port 27961, and so on.Supervisor configurationI recommend running your ShiNQlx server through a process monitor likesupervisor. Unfortunately, due to the nature Rust handles crashes with its own panic system, some crashes may not result in the server exiting properly for the supervisor daemon to proper restart your server. Until I can come up with a proper way to solve this, I recommend to add an event listener configuration to your supervisor configuration to automatically check whether your server port is still reachable, and restart the server automatically if it's not.Thesupervisor_checkspackageprovides the main means for this. However, you will have to install the package to your OS pip environment, like so:sudopip3install--break-system-packagessupervisorsupervisor_checksAfter installation, you can configure your server in the supervisor configuration. Here is an example/etc/supervisor/conf.d/quakelive.conf, running two servers on the same host, and the supervisor_checks checking every 60 seconds for connectivity to the respective port (27960 and 27961) and restarting the server in case it stopped responding to TCP connection attempts on the server port:[program:quakelive]command=/home/steam/bin/run_server.sh %(process_num)suser=steamprocess_name=qzeroded_%(process_num)snumprocs=2autorestart=true[eventlistener:ql_heartbeat_0]command=/usr/local/bin/supervisor_tcp_check -N "quakelive:qzeroded_0" -n ql_heartbeat_0 -r 1 -p 27960events=TICK_60[eventlistener:ql_heartbeat_1]command=/usr/local/bin/supervisor_tcp_check -N "quakelive:qzeroded_1" -n ql_heartbeat_1 -r 1 -p 27961events=TICK_60