How to set up a Rust game server on a Linux VPS from scratch (Ubuntu 24.04)

Step-by-step guide to deploy a Rust dedicated server on a Linux VPS: SteamCMD install, port configuration, oxide/uMod and persistent systemd unit.

Rust is one of the most infrastructure-demanding multiplayer survival games — a huge procedural map, thousands of persistent entities and constant physics give the server a load profile closer to a database under peak than a typical game. Running your own dedicated server gives full control over wipe schedule, plugins, gather rate and community rules, but it requires a properly configured Linux VPS.

This tutorial walks the full path to set up a Rust server on a Linux VPS from scratch: installing SteamCMD, downloading RustDedicated, configuring ports, optional oxide/uMod integration for plugins, and persistence via systemd to survive reboots. Target persona: a new server owner who wants to bring up a vanilla or lightly modded instance without relying on a proprietary panel.

Estimated execution time: 60 to 90 minutes, with about 15-20 of those spent on procedural map generation during first boot — not a hang, it is real work as RustDedicated builds the world. You finish the tutorial with a server reachable on the community list and auto-restart configured.

Prerequisites

Before starting, confirm your VPS meets the minimum requirements. Rust is demanding — under-sizing results in rubber-banding, lag spikes and crashes during wipes.

Hardware and access prerequisites

A VPS running Ubuntu 24.04 LTS (or 22.04 LTS), 8 GB RAM minimum (16 GB recommended for 50+ slots), 4 vCPUs, 30 GB free SSD and a dedicated public IPv4. Root access via SSH and outbound ports 27015-27020 and 28015-28017 open in the provider’s firewall.

System Ubuntu 24.04 LTS
Minimum RAM 8 GB
Game port 28015/UDP
RCON port 28016/TCP
Query port 28017/UDP

Connect to the VPS via SSH before continuing — the entire procedure runs remotely.

System preparation and dedicated user

Running a game service as root is a security anti-pattern. We’ll create a dedicated user for RustDedicated, with its own home and no sudo permissions. If the process is compromised, the attacker has no easy escalation path to root.

01

Update the system and install the dependencies SteamCMD needs:

sudo apt update && sudo apt upgrade -y
sudo apt install -y software-properties-common
sudo add-apt-repository -y multiverse
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install -y lib32gcc-s1 lib32stdc++6 libsdl2-2.0-0:i386 \
  curl wget tar unzip screen ufw

SteamCMD still depends on 32-bit libraries (i386) even on a 64-bit system — that’s the reason for the dpkg --add-architecture i386.

02

Create the dedicated rust user, with no direct password login:

sudo adduser --disabled-password --gecos "" rust
sudo mkdir -p /home/rust/server
sudo chown -R rust:rust /home/rust

From this point on, all server commands run with sudo -u rust or after sudo su - rust.

03

Configure the firewall, opening only what’s needed:

sudo ufw allow OpenSSH
sudo ufw allow 28015/udp comment 'Rust game'
sudo ufw allow 28016/tcp comment 'Rust RCON'
sudo ufw allow 28017/udp comment 'Rust query'
sudo ufw --force enable
sudo ufw status verbose
RCON exposed to the internet

Port 28016 (RCON) accepts administrative commands. In production, restrict it by IP in UFW: sudo ufw allow from YOUR_ADMIN_IP to any port 28016 proto tcp instead of opening it to the world. RCON with a weak password exposed is a common server-takeover vector.

SteamCMD and RustDedicated installation

SteamCMD is Steam’s command-line client used to download and update dedicated servers. RustDedicated is distributed via app ID 258550 and weighs roughly 8 GB on initial download.

04

Switch to the rust user and download SteamCMD:

sudo su - rust
mkdir -p ~/steamcmd && cd ~/steamcmd
curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxvf -

The tar zxvf - extracts directly from curl’s stdout, avoiding an intermediate file.

05

Download RustDedicated via SteamCMD (anonymous download, no Steam login):

cd ~/steamcmd
./steamcmd.sh +force_install_dir /home/rust/server \
  +login anonymous \
  +app_update 258550 validate \
  +quit

This command takes 10-25 minutes depending on the VPS bandwidth. The validate parameter checksums every file — always use it on the first install and on updates after a forced wipe by Facepunch (first Thursday of each month).

06

Confirm the binary exists and is executable:

ls -la /home/rust/server/RustDedicated
file /home/rust/server/RustDedicated

Expected output: an ELF 64-bit LSB executable, dynamically linked. If ls doesn’t find it, the download silently failed — re-run step 05 and watch the full SteamCMD output for ERROR! Failed to install app '258550'.

Initial server configuration

Before the first boot, configure the parameters that define identity, map size, slots and server name. These parameters go into a startup script — it makes future tweaks easier without touching systemd units.

07

Create the start script at /home/rust/server/start.sh:

nano /home/rust/server/start.sh

Content:

#!/bin/bash
cd /home/rust/server

exec ./RustDedicated -batchmode -nographics \
  +server.identity "hostini" \
  +server.port 28015 \
  +server.queryport 28017 \
  +rcon.port 28016 \
  +rcon.password "REPLACE_WITH_STRONG_PASSWORD" \
  +rcon.web 1 \
  +server.maxplayers 50 \
  +server.hostname "My Rust Server" \
  +server.description "Vanilla server, biweekly wipe" \
  +server.url "https://hostini.com.br" \
  +server.headerimage "https://i.imgur.com/YOUR_BANNER.png" \
  +server.seed 1337 \
  +server.worldsize 3500 \
  +server.saveinterval 300 \
  +server.tickrate 30

Make it executable:

chmod +x /home/rust/server/start.sh
Choosing seed and worldsize

The pair (seed, worldsize) defines the procedural map — the same pair always generates the same map. 3000 maps come up in 5 minutes and fit comfortably in 50 slots; 4500 doubles generation time and requires 16+ GB of RAM. Avoid worldsize above 4500 without dedicated hardware.

08

Run a manual first boot to generate the map and validate the config:

cd /home/rust/server
./start.sh

You’ll see Unity logs, then Generating procedural map. In 5-15 minutes you’ll get Server startup complete — the server is accepting connections. Press Ctrl+C to stop and move on to systemd persistence.

Persistence with systemd

Keeping the server running inside screen or tmux works but doesn’t survive reboots. systemd is the standard Linux solution: the server comes up at boot, restarts on crash and is monitored via journalctl.

09

Exit the rust user and create the unit as root:

exit  # back to root
sudo nano /etc/systemd/system/rust.service

Content:

[Unit]
Description=Rust Dedicated Server
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=rust
Group=rust
WorkingDirectory=/home/rust/server
ExecStart=/home/rust/server/start.sh
Restart=on-failure
RestartSec=15
StandardOutput=append:/home/rust/server/logs/server.log
StandardError=append:/home/rust/server/logs/server.err
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

Create the logs directory and adjust permissions:

sudo -u rust mkdir -p /home/rust/server/logs
sudo systemctl daemon-reload
sudo systemctl enable --now rust.service
10

Watch the startup in real time:

sudo journalctl -u rust.service -f

When you see Server startup complete, the server is ready. Use Ctrl+C to exit the journal follow — this does not stop the server.

Optional plugins with oxide/uMod

For a fully vanilla server, skip this section. For custom moderation, economy, kits, anti-cheat or other common features in real-world servers, oxide/uMod is the standard framework.

11

Stop the server before installing oxide:

sudo systemctl stop rust.service

Download and install oxide.rust inside the server directory:

sudo -u rust bash -c "cd /home/rust/server && \
  wget -q https://umod.org/games/rust/download/develop -O oxide.zip && \
  unzip -o oxide.zip && \
  rm oxide.zip"

Start the server again:

sudo systemctl start rust.service

Plugins live in /home/rust/server/oxide/plugins/. After copying a .cs into that directory, oxide compiles and loads it automatically — no server restart required.

Facepunch forced wipe

Every first Thursday of the month, Facepunch forces a wipe via a binary update. Plugins compiled against the previous version fail until they are updated. Either have an oxide auto-update script or monitor the #news channel on the official uMod Discord so the server doesn’t stay offline on force-wipe day.

Verification

Confirm everything is working before publishing the IP to players.

12

Check the service status:

sudo systemctl status rust.service

It should show active (running) and the RustDedicated process PID.

13

Confirm the server is listening on the correct ports:

sudo ss -tulpn | grep -E '28015|28016|28017'

You should see 3 lines — one per port (UDP/TCP/UDP), all bound to the RustDedicated process.

14

Test the connection from the Rust client: open the game, console (F1), type:

client.connect YOUR_PUBLIC_IP:28015

In 5-10 seconds you land on the asset loading screen. After a successful login, the server automatically appears on the community list within a few hours.

Troubleshooting

Server does not appear on the public list

Typical cause: query port (28017/UDP) blocked or IP behind CGNAT. Test from outside the VPS:

nmap -sU -p 28017 YOUR_PUBLIC_IP

If it returns open|filtered, adjust the hosting provider’s firewall (not just the internal UFW). If it returns filtered, the IP is most likely CGNAT — it will require a dedicated IP.

Map generates but the server crashes in 2-3 minutes

This is almost always OOM (out of memory). Check via dmesg | grep -i oom and syslog. Immediate fix: drop worldsize to 3000 and maxplayers to 25. Real fix: upgrade to a VPS with more RAM.

RustDedicated update breaks oxide plugins

Run the oxide update before bringing the server up after a force wipe:

sudo systemctl stop rust.service
sudo -u rust bash -c "cd /home/rust/server && \
  wget -q https://umod.org/games/rust/download/develop -O oxide.zip && \
  unzip -o oxide.zip && rm oxide.zip"
sudo systemctl start rust.service

Next steps

With the server running, consider the next steps to level up the operation:

  • Set up automated backups of the server/hostini/ directory (map, save and blueprints) via cron + rsync to external storage.
  • Enable RCON via web interface (already in the config) for remote administration without SSH.
  • Add essential plugins such as AdminRadar, BetterChat and No Decay to shape the experience without weighing the server down.
  • Implement a biweekly wipe schedule automatically via a systemd timer.
  • If you are putting this into production for a real community, a Hostini VPS ships with dedicated IPv4, DDoS protection enabled by default and NVMe SSD — three requirements that decide whether your Rust server stays online during a coordinated raid or goes down with the base.

Frequently asked questions

How much RAM does a VPS need to run a Rust dedicated server?

The absolute minimum for a 3000 map with 10 slots is 8 GB of RAM. For 4500 maps with 50+ active players, 16 GB is the comfortable floor. Rust is memory-hungry as entities, deployables and procedural generation grow — monitoring via htop after a few hours of gameplay is essential.

Why does RustDedicated consume so much CPU even when empty?

Procedural map generation runs on first boot and can take 5-15 minutes consuming a full vCPU. After that, idle usage sits between 20-40% of a modern vCPU. Spikes occur on wipe day and during events like cargo ship, patrol heli and raidable bases.

Do I need a dedicated IP to run Rust?

Yes. Rust requires a static public IPv4 so clients can connect directly and so the server shows up correctly on the Facepunch master server. CGNAT or shared IP does not work — the server starts, but players cannot connect via the public list.

Can I use Wine to run the Windows version of RustDedicated on Linux?

Technically yes, but it is unnecessary. Facepunch maintains a fully supported and stable native Linux binary (RustDedicated) — performance equivalent or better than Windows on the same machine. Wine only adds overhead and failure points.

How do I wipe without losing the player base?

A wipe is the controlled deletion of .map and .sav files under server/<identity>/. To preserve player progression (XP, blueprints), keep the player.blueprints.X.db file. Partial wipes (map only, with BPs preserved) and full wipes (everything) are the two most common strategies, with a typical 2-week cadence.

Does oxide/uMod affect server performance?

Yes, plugins consume extra CPU and memory — most are lightweight, some heavy (custom anti-cheat, complex economy plugins). Start with 5-10 essential plugins and monitor the server tick time via fps in the console. Below 30 fps on the server indicates plugin overload or insufficient hardware.

Topics:
Next steps VPS, dedicated or managed panel for FiveM, SAMP, MTA, Tibia and more.Host your game server with Hostini →
Was this tutorial helpful?
Chat on WhatsApp