Game Servers

Jedi Knight II: Jedi Outcast server

Run a Jedi Knight II: Jedi Outcast dedicated server with LinuxGSM, in Docker or directly on Linux.

jk2server Docker jk2idtech3

Steam ownership required. The Steam account LinuxGSM uses must own Jedi Knight II: Jedi Outcast.
Notes

This server uses JK2MV, a community patch that improves and modernises the Jedi Outcast client and server.

Run with Docker

First install Docker Engine and the Compose plugin on your Linux host. Run the commands below as a user allowed to access Docker; otherwise prefix Docker commands with sudo. The container manages its own linuxgsm user.

The jk2 image has LinuxGSM and every dependency for Jedi Knight II: Jedi Outcast already installed on Ubuntu 26.04. On first start it downloads the game server, then keeps it updated.

1. Create docker-compose.yml

Give the server a directory of its own and create the file inside it. Docker Compose looks for docker-compose.yml in the directory you run it from, so run every docker compose command below from this directory. Each server needs its own directory.

shell
mkdir -p ~/docker/jk2server
cd ~/docker/jk2server
nano docker-compose.yml

Paste in one of the files below, then save and exit (in nano: CTRL+o, Enter, CTRL+x). The server's files will be stored in ~/docker/jk2server/jk2server, next to docker-compose.yml.

The server uses the host's ports directly, the way it would without Docker. Query ports and server browsers work with no extra setup.

docker-compose.yml
services:
  jk2server:
    image: ghcr.io/gameservermanagers/gameserver:jk2
    container_name: jk2server
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./jk2server:/data
    environment:
      - UPDATE_CHECK=60

The container gets its own network and publishes the default ports. If you change a port in the server's config, change it here too. Bridge networking can hide the server's real IP from the game, which breaks some server browsers.

docker-compose.yml
services:
  jk2server:
    image: ghcr.io/gameservermanagers/gameserver:jk2
    container_name: jk2server
    restart: unless-stopped
    ports:
      - "27960:27960/udp"
    volumes:
      - ./jk2server:/data
    environment:
      - UPDATE_CHECK=60

Also published on Docker Hub as gameservermanagers/gameserver:jk2. Prefer docker run? See Docker help.

2. Add your Steam login before the first start

From the same directory, create the LinuxGSM config file in the server's data directory. LinuxGSM reads it on first start and keeps it on updates.

shell
mkdir -p jk2server/config-lgsm/jk2server
nano jk2server/config-lgsm/jk2server/common.cfg
common.cfg
steamuser="username"
steampass='password'

3. Start it

shell
cd ~/docker/jk2server
docker compose up -d
docker compose logs -f

The first start installs the server, which can take a while for large games. When it is ready the log shows the server details, including ports and passwords.

Ports

With host networking the server uses the host's ports directly. With bridge networking the compose file above publishes them. Either way, open them in your firewall.

PortDefaultProtocol
Game27960UDP

These are the defaults. Run details to see every port the server uses and its protocol.

Manage the server

Show details, ports and passwords
docker exec -it --user linuxgsm jk2server ./jk2server details
Open the live console (leave with CTRL+b then d)
docker exec -it --user linuxgsm jk2server ./jk2server console
Restart the game server
docker restart jk2server
Check for a game update now
docker exec -it --user linuxgsm jk2server ./jk2server update
Update the image
cd ~/docker/jk2server
docker compose pull && docker compose up -d

Server files, configs and logs live in ~/docker/jk2server/jk2server on the host: back up that directory. Docker help below covers permissions, environment variables and bridge networking.

Docker help

Images and tags

Images are built weekly and published to two registries. They are identical, so use whichever you prefer.

RegistryImage
GitHub Container Registryghcr.io/gameservermanagers/gameserver:jk2
Docker Hubgameservermanagers/gameserver:jk2

The image uses the base OS LinuxGSM recommends for this game. You do not need to match it on the host.

Use docker run instead of Compose
shell
docker run -d \
  --name jk2server \
  --network host \
  --restart unless-stopped \
  -v "$PWD/jk2server:/data" \
  -e UPDATE_CHECK=60 \
  ghcr.io/gameservermanagers/gameserver:jk2

With bridge networking, publish the default ports instead of --network host:

shell
docker run -d \
  --name jk2server \
  -p 27960:27960/udp \
  --restart unless-stopped \
  -v "$PWD/jk2server:/data" \
  -e UPDATE_CHECK=60 \
  ghcr.io/gameservermanagers/gameserver:jk2
Data and permissions

Everything that should survive a container update lives in /data inside the container, which is ./jk2server next to docker-compose.yml on the host.

Path in /dataContents
serverfiles/The game server itself
config-lgsm/LinuxGSM config, including common.cfg
log/Script, console and game logs
data/LinuxGSM data and cache

The game server runs as the linuxgsm user, not root. On every start the container sets that user to UID and GID (both 1000 by default) and takes ownership of /data. If your host user has a different ID, set them to match so you can edit files on the host:

docker-compose.yml
environment:
      - UID=1001
      - GID=1001
Environment variables
VariableDefaultWhat it does
UPDATE_CHECK60Minutes between update checks, from 1 to 59, or 60 for hourly. 0 turns scheduled checks off.
UPDATE_ON_STARTtrueCheck for a game update every time the container starts.
VALIDATE_ON_STARTfalseRun a SteamCMD validate on start. Slow, but repairs broken files.
UID / GID1000User and group IDs the game server runs as.
LGSM_GITHUBBRANCHmasterLinuxGSM branch to run. Set develop to test unreleased fixes.
Updates and health checks

The game server updates itself. The container checks every UPDATE_CHECK minutes and on start. If an update is out, it stops the server, updates it and starts it again.

The image brings new LinuxGSM releases, dependency fixes and OS updates. Pull it now and then with docker compose pull && docker compose up -d.

The image runs LinuxGSM's monitor as the Docker health check every minute, so docker ps shows whether the game server is answering, not just whether the container is up.

Bridge networking

network_mode: host is the simplest choice: the game server uses the host's ports directly, the way it would without Docker, and query ports work without extra setup.

If you need bridge networking, choose Bridge networking in step 1 for a compose file that publishes the default ports. If you change a port in the server's config, change it there too.

Bridge networking can hide the server's real IP from the game, which breaks some server browsers. Use host networking if players cannot find the server.

Troubleshooting
  • Permission denied in /data: set UID and GID to the owner of the host directory.
  • Server not listed in game: check the ports are open, use host networking, and add a GSLT if the game needs one.
  • Install fails at SteamCMD: the game may need a Steam login. Check the notes at the top of this page.
  • Will not start: stop the container, then run docker compose run --rm jk2server debug to see why.
  • Still stuck: run details and debug, then ask on Discord or GitHub Discussions with the output.

Install on Linux

Install directly on a server running Ubuntu 26.04, Debian 11 or Enterprise Linux 8.

1. Create a user and log in

Creating users and installing system packages require administrator privileges. From your administrator account, use sudo below (omit it if already root). Install curl, tar and an editor such as nano with your distribution's package manager first.

administrator shell
sudo adduser jk2server

Give the user a strong password, then switch to its login shell:

administrator shell
sudo su - jk2server

Run all remaining commands as jk2server from its home directory, without sudo. On Enterprise Linux, create the account with sudo useradd -m jk2server and set its password with sudo passwd jk2server instead of adduser.

2. Download LinuxGSM

shell
curl -Lo linuxgsm.sh https://linuxgsm.sh && chmod +x linuxgsm.sh && bash linuxgsm.sh jk2server

3. Add your Steam login

Create lgsm/config-lgsm/jk2server/common.cfg relative to the game-server user's home directory and add your dedicated Steam account:

shell
mkdir -p lgsm/config-lgsm/jk2server
nano lgsm/config-lgsm/jk2server/common.cfg
common.cfg
steamuser="username"
steampass='password'

4. Install

shell
./jk2server install

LinuxGSM checks dependencies and installs the game files. If this user has sudo access, it can install missing packages when prompted. Otherwise, ask an administrator to install the packages listed by LinuxGSM, then rerun this command as jk2server. Running ./jk2server install as root only installs dependencies, not the game server.

5. Configure and start the server

Review your LinuxGSM settings in lgsm/config-lgsm/jk2server/jk2server.cfg (instance settings) or lgsm/config-lgsm/jk2server/common.cfg (shared settings). Do not edit _default.cfg, which LinuxGSM updates automatically. Game settings use a separate config file; run ./jk2server details to find its path. Once configured, start the server explicitly:

shell
./jk2server start

Ports

Open these ports in your firewall. They are the defaults; run ./jk2server details to see the ports your server uses.

PortDefaultProtocol
Game27960UDP

Common commands

Start the server
start
./jk2server start
Stop the server
stop
./jk2server stop
Restart the server
restart
./jk2server restart
Show details, ports and passwords
./jk2server details
Open the live console (leave with CTRL+b then d; CTRL+c stops the server)
./jk2server console
Update the game server
./jk2server update
Run in the foreground to debug
./jk2server debug
Back up the whole server
./jk2server backup
List every command
./jk2server

Automate with cron

Restart the server if it crashes, apply game updates and keep LinuxGSM current. Add these with crontab -e.

crontab
*/5 * * * * /home/jk2server/jk2server monitor > /dev/null 2>&1
*/30 * * * * /home/jk2server/jk2server update > /dev/null 2>&1
0 0 * * 0 /home/jk2server/jk2server update-lgsm > /dev/null 2>&1

Deploy from a cloud marketplace

LinuxGSM is available as a one-click app on two cloud providers. You get a fresh Ubuntu server with LinuxGSM ready to use, then install Jedi Knight II: Jedi Outcast on it.

Akamai (Linode) Marketplace

  1. Open LinuxGSM on the Akamai Marketplace and start a deploy.
  2. Choose a limited sudo username and, under the advanced options, set the game server name to jk2server.
  3. Pick any plan with enough CPU, memory and disk for Jedi Knight II: Jedi Outcast, then create the instance.
  4. When it has finished setting up, log in over SSH or the Lish console and read the generated passwords, then switch to the linuxgsm user and install:
shell
cat /home/YOUR_USERNAME/.credentials
su linuxgsm
cd /home/linuxgsm
./jk2server install

Akamai does not keep this app updated for you, so run ./jk2server update-lgsm now and then. Details are in the Akamai guide.

DigitalOcean Marketplace

Create a Droplet from the LinuxGSM 1-Click App, choosing a size with enough resources for Jedi Knight II: Jedi Outcast. Log in over SSH and follow the Linux install steps for jk2server.

Remember to open the game's ports in the provider's cloud firewall as well as on the server.