Co-Authored-By: Claude Opus 5.5 <[email protected]>
ql-lg-server
A Quake Live lightning gun (LG) vampiric practice server in Docker, set up with one command.
Players spawn with the LG only. Every hit heals you by the damage you deal (1:1 vampiric), there's no knockback and no items, and the server stays in warmup forever. Nobody has to ready up, there's no countdown, and you never get kicked back to a scoreboard. People join, pair off and duel on thunderstruck. This is how the popular LG duel servers (x76) run, rebuilt from scratch and documented so you can host your own.
- One command:
./setup.shdownloads the game (SteamCMD), builds minqlx, generates an RCON password and starts the server. - Public (listed in the in-game browser) or private (join by address, LAN/VPN): one setting.
- Three variants: antilag, no antilag, flat 100 HP.
- No warmup text on screen (small minqlx plugin), plus a welcome message.
- Recovers on its own: Docker restarts it after a crash, a watchdog restarts it if it hangs, and it restarts daily while nobody is playing. It also takes nightly backups.
- The RCON password never shows up in logs (Quake Live normally prints it there, see How it works).
Quick start
You need a Linux machine (a small VPS is fine: the server idles at ~3% of one core and ~50 MB RAM), Docker with the compose plugin, python3, git, and ~2 GB of disk.
git clone <this repo> ql-lg-server
cd ql-lg-server
./setup.sh # asks: server name, listed or not, join password, port
./scripts/install-cron.sh # optional: watchdog, nightly backup, daily restart
Run it as a normal user in the docker group, not as root. Setup prints the /connect addresses when it's done. Players need Quake Live on Steam.
Public server: forward UDP 27960 (your QL_PORT) on your router or firewall to this machine. Listed servers appear in the in-game browser after a few minutes.
Settings
Everything per-server is in .env (created from .env.example by setup). After editing it, apply the change with docker compose up -d.
| Setting | Default | |
|---|---|---|
QL_HOSTNAME |
LG Vampiric FFA |
name in the browser (^1..^7 colors work) |
QL_LISTED |
yes |
no = unlisted, join by address only |
QL_PASSWORD |
empty | join password |
QL_MAXCLIENTS |
16 |
|
QL_FACTORY |
lgvamp |
lgvamp, lgvamp_nolag or lgvamp100, see below |
QL_MAP |
thunderstruck |
stock map; workshop maps need extra setup |
QL_WELCOME |
short rules text | sent to each player on join; empty = off |
QL_PORT / QL_RCON_PORT |
27960 / 28960 |
game UDP / RCON TCP (127.0.0.1 only) |
QL_NAME |
ql-lg |
Docker container name |
Game modes (factories)
Defined in home/baseq3/scripts/lgvamp.factories:
| Factory | What | Seen on real servers |
|---|---|---|
lgvamp |
LG only, 1:1 vampiric, no knockback, antilag up to 240 ms, spawn 200 HP | x76 "Antilag LG Duel" |
lgvamp_nolag |
same, antilag off (you have to lead your shots by your ping) | x76 "LG Duel EU #3" |
lgvamp100 |
same as lgvamp but spawn with 100 HP |
no, our variant: health above 100 decays ~1 HP/s, so with 200 HP spawns you slowly lose health even when you aren't taking damage |
Shared values: g_startingWeapons 33 (gauntlet + LG), infinite ammo, g_knockback 0, no items, no /kill, no votes, instant weapon switch, dmflags 28 (no self/fall damage), permanent warmup (sv_warmupReadyPercentage 2). Every value and why: docs/HOW-IT-WORKS.md.
Running it
./rcon status # who's on (./rcon alone = interactive console)
./rcon addbot hunter 5 # a target to shoot at; ./rcon kick allbots
./rcon say hello
python3 tools/qlq.py 127.0.0.1 27960 --status
docker compose restart # restart; docker compose stop / start
./setup.sh --update # update the game from Steam
Admins, bans, mutes, multiple servers, backups: docs/ADMIN.md. Share docs/PLAYERS.md with your players (joining, LG client settings).
Layout
setup.sh install / re-run / --update
.env.example settings template (.env is yours, not in git)
docker-compose.yml the container; Dockerfile = Debian + 32-bit libs + Python 3.11 + SteamCMD
rcon server console
home/baseq3/ server.cfg (shared), scripts/lgvamp.factories (game modes);
local.cfg, secrets.cfg, mappool_lg.txt are generated from .env on each start
home/minqlx-plugins/ nowarmuptext.py (hides warmup text), welcome.py
tools/ mkcfg.sh (.env -> cfg), qlrcon.py (RCON client), qlq.py (health check), tests
scripts/ watchdog.sh, daily-restart.sh, backup.sh, install-cron.sh
Not in git (setup creates them): server/ (game files, ~1.1 GB), minqlx-build/, steamcmd-home/, secrets/, logs/, backups/.
Credits
- minqlx (GPL-3.0) by MinoMino: built from source by setup.sh, not included here.
- x76.gg for the LG duel server format this copies (FFA in permanent warmup, vampiric, no knockback).
- SEA LG Duels server: the vampiric LG preset this started from.
- Quake Live is © id Software / Bethesda. The dedicated server is downloaded from Steam (app 349090); no game files are in this repo.
License: MIT (this repo's configs and scripts).