How to Install a Palworld Dedicated Server on Ubuntu 24.04 VPS
Hosting your own Palworld dedicated server gives you a persistent world that your friends can join around the clock, full control over every gameplay multiplier, and freedom from the player limits and instability that plague peer-to-peer sessions. This guide walks you through a production-grade install on a fresh Ubuntu 24.04 VPS -- from SteamCMD to a hardened systemd service with automated backups, RCON, and update workflow.
Want to skip the provisioning hassle? Spin up a game-ready VPS with SSD storage and private networking in under 60 seconds. Launch a CloudCore Business VPS and come back to Step 1.
Table of Contents
What is a Palworld Dedicated Server?
Palworld is a multiplayer open-world survival crafting game built on Unreal Engine 5, developed by Pocketpair. While the game ships with a built-in "host game" mode that runs inside the client, that mode is limited to 4 players by default, requires the host to remain online for the world to be accessible, and suffers from the usual constraints of peer-to-peer hosting (NAT punchthrough, uplink bandwidth, host-side latency advantages).
The dedicated server is a separate headless binary distributed on Steam as app ID 2394010. It runs without a graphics context, accepts up to 32 simultaneous players in its current stable build, and is designed to run 24/7 on Linux or Windows. Because it is a standalone process, the world persists independently of whether any player is connected -- your base, your captured Pals, and world progression keep ticking (or stay frozen, depending on settings) regardless of client activity.
The server reads a single primary configuration file called PalWorldSettings.ini, exposes an RCON administration socket for remote commands, and stores world state on disk under a Saved/SaveGames/ tree that you can snapshot, roll back, or migrate between hosts. Official documentation lives at tech.palworldgame.com.
Why Self-Host Palworld on Your Own VPS?
Running Palworld on a VPS you control, rather than renting a pre-configured game panel from a managed game-hosting company, delivers concrete advantages:
- True 32-player capacity -- The dedicated binary supports up to 32 concurrent players. Many managed providers artificially cap slots on lower tiers; your own VPS runs whatever the binary supports.
- Persistent, always-on world -- The world keeps running when nobody is playing. Log in at 3 AM to check on your base; come back to a fully grown farm.
- Full admin control -- Every gameplay multiplier, death penalty, Pal capture rate, day/night ratio, and XP curve is yours to tune in real time. No tier-gated features.
- Mod and script freedom -- Drop in custom save editors, run scheduled restart scripts, integrate with Discord webhooks, or attach any monitoring stack you like. No panel walled garden.
- Predictable flat pricing -- A VPS costs the same whether 2 friends play or 32 players raid together. No per-slot upcharges.
- Root shell access -- Full SSH and sudo. Inspect logs, tune the kernel, swap the save directory to a larger volume, run custom cron jobs. Nothing is off-limits.
- Data ownership -- Your
Saved/folder is yours. Back it up to S3, clone it to a staging world, migrate hosts without vendor assistance.
Self-Hosted VPS vs. Managed Game Hosting
| Scenario | Managed Game Panel | Self-Hosted VPS (Palworld) |
|---|---|---|
| Monthly cost (32 slots) | EUR 25-60/mo | EUR 16-30/mo (flat) |
| Root / SSH access | Usually no | Yes |
| Custom mods and scripts | Limited | Unlimited |
| RCON access | Sometimes gated | Always |
| Backup control | Panel-managed | Full cron + offsite |
| Upgrade path | Change plan | Resize VPS in place |
| Run other services on the same box | No | Yes (Discord bot, web panel, etc.) |
Prerequisites and System Requirements
Before you begin, make sure you have:
- A VPS running Ubuntu 24.04 LTS with root or sudo access
- SSH access to the server (PuTTY on Windows, or the built-in terminal on macOS/Linux)
- At least 16 GB of RAM recommended for a full 32-player server (8 GB minimum for 8-10 players)
- 4 vCPU cores (Palworld is CPU-heavy due to UE5 world simulation and Pal AI)
- 50 GB of free disk space (the server binary plus saves and backups grow quickly)
- A stable public IPv4 address with unrestricted UDP/8211
Recommended Plan: CloudCore Business>
For a stable 32-player Palworld world with headroom for mods, RCON tooling, and a Discord bot on the same box, we recommend the CloudCore Business plan:>
- 6 vCPU cores (AMD EPYC)
- 16 GB RAM
- 200 GB NVMe SSD
- Unmetered bandwidth
- EUR 29.99/month>
Smaller 4-8 player servers can run fine on CloudCore Professional (12 GB RAM). For heavily modded or 32-player servers with complex base builds, step up to 24-32 GB RAM.
Connect to your server via SSH to get started:
ssh root@your-server-ipStep 1: Update the System and Create a Dedicated User
Start by updating your package index and upgrading installed packages:
sudo apt update && sudo apt upgrade -yIf the kernel was updated, reboot before continuing:
sudo rebootNever run a game server as root. Create a dedicated unprivileged user called steam that will own the SteamCMD tree and the Palworld install:
sudo useradd -m -s /bin/bash steam
sudo passwd steamThis gives us a clean home directory at /home/steam and isolates the game process from the rest of the system. For the remainder of the guide, switch to the steam user whenever you interact with SteamCMD or the Palworld binary:
sudo -iu steamStep 2: Install SteamCMD Dependencies
SteamCMD is a 32-bit application and depends on the i386 multiarch libraries plus a handful of runtime packages. As root (or via sudo), enable the i386 architecture and install dependencies:
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install -y \
software-properties-common \
lib32gcc-s1 \
libsdl2-2.0-0:i386 \
libc6-i386 \
curl \
wget \
tar \
xz-utils \
ca-certificatesExpected output (abbreviated):
Setting up lib32gcc-s1 (14.2.0-4ubuntu2~24.04) ...
Setting up libsdl2-2.0-0:i386 (2.30.0+dfsg-1build3) ...
...
0 upgraded, 14 newly installed, 0 to remove.Ubuntu 24.04 requires you to accept the Steam license interactively the first time you install its package -- we install SteamCMD manually instead (next step), which bypasses that prompt.
Step 3: Install SteamCMD
Switch to the steam user and pull SteamCMD's official Linux tarball into its home directory:
sudo -iu steam
mkdir -p ~/steamcmd
cd ~/steamcmd
curl -sSL https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz | tar -xzVerify the binary exists:
ls -la ~/steamcmd/steamcmd.shRun SteamCMD once so it can self-update and fetch its runtime components:
./steamcmd.sh +quitExpected output (final lines):
Redirecting stderr to '/home/steam/Steam/logs/stderr.txt'
[ 0%] Checking for available updates...
[----] Verifying installation...
Steam Console Client (c) Valve Corporation - version 1739067670
-- type 'quit' to exit --
Loading Steam API...OKIf you see OK at the end, SteamCMD is ready.
Step 4: Install the Palworld Dedicated Server (App 2394010)
The Palworld dedicated server is published as Steam app ID 2394010 and is downloadable with an anonymous Steam login -- no Steam account or game ownership required on the server side.
Still as the steam user, create a target directory and install the server:
mkdir -p ~/palworld
cd ~/steamcmd
./steamcmd.sh +force_install_dir /home/steam/palworld \
+login anonymous \
+app_update 2394010 validate \
+quitExpected output:
Connecting anonymously to Steam Public...OK
Waiting for client config...OK
Waiting for user info...OK
Update state (0x3) reconfiguring, progress: 0.00 (0 / 0)
Update state (0x61) downloading, progress: 12.34 (185012000 / 1498000000)
...
Update state (0x81) verifying update, progress: 97.45 (1459820000 / 1498000000)
Success! App '2394010' fully installed.The download is approximately 1.5-2.5 GB depending on the current build. When it completes, the full server tree lives at /home/steam/palworld/:
ls /home/steam/palworldExpected layout:
Engine Pal PalServer.sh steamappsThe launch script is PalServer.sh. It wraps the actual binary at Pal/Binaries/Linux/PalServer-Linux-Shipping.
Step 5: First Launch and Config Generation
The Palworld server does not create its user-editable config on install -- it generates a default config on first launch, which you then copy to the override path. Do a short first launch to trigger that generation:
cd ~/palworld
./PalServer.shYou will see the server initialize, bind UDP 8211, and print something like:
LogInit: Engine is initialized. Leaving FEngineLoop::Init()
LogPalServerDedicated: Pal Server Version: 0.3.4.xxxxx
LogNet: Game server listening on port 8211Let it run for about 10 seconds, then stop it with Ctrl+C.
The default config was generated at:
/home/steam/palworld/DefaultPalWorldSettings.iniAnd the server will look for overrides at:
/home/steam/palworld/Pal/Saved/Config/LinuxServer/PalWorldSettings.iniCopy the default into the override location so you have every field laid out and ready to edit:
mkdir -p ~/palworld/Pal/Saved/Config/LinuxServer
cp ~/palworld/DefaultPalWorldSettings.ini \
~/palworld/Pal/Saved/Config/LinuxServer/PalWorldSettings.iniStep 6: Configure PalWorldSettings.ini
Open the override file:
nano ~/palworld/Pal/Saved/Config/LinuxServer/PalWorldSettings.iniThe entire file is a single bracketed OptionSettings line with comma-separated key=value pairs. Below is a sensible production-grade configuration. Replace placeholder passwords with your own strong values:
[/Script/Pal.PalGameWorldSettings]
OptionSettings=(Difficulty=None,DayTimeSpeedRate=1.000000,NightTimeSpeedRate=1.000000,ExpRate=1.200000,PalCaptureRate=1.200000,PalSpawnNumRate=1.000000,PalDamageRateAttack=1.000000,PalDamageRateDefense=1.000000,PlayerDamageRateAttack=1.000000,PlayerDamageRateDefense=1.000000,PlayerStomachDecreaseRate=1.000000,PlayerStaminaDecreaseRate=1.000000,PlayerAutoHPRegeneRate=1.000000,PlayerAutoHpRegeneRateInSleep=1.000000,PalStomachDecreaseRate=1.000000,PalStaminaDecreaseRate=1.000000,PalAutoHPRegeneRate=1.000000,PalAutoHpRegeneRateInSleep=1.000000,BuildObjectDamageRate=1.000000,BuildObjectDeteriorationDamageRate=1.000000,CollectionDropRate=1.500000,CollectionObjectHpRate=1.000000,CollectionObjectRespawnSpeedRate=1.000000,EnemyDropItemRate=1.000000,DeathPenalty=ItemAndEquipment,bEnablePlayerToPlayerDamage=False,bEnableFriendlyFire=False,bEnableInvaderEnemy=True,bActiveUNKO=False,bEnableAimAssistPad=True,bEnableAimAssistKeyboard=False,DropItemMaxNum=3000,DropItemMaxNum_UNKO=100,BaseCampMaxNum=128,BaseCampWorkerMaxNum=15,DropItemAliveMaxHours=1.000000,bAutoResetGuildNoOnlinePlayers=False,AutoResetGuildTimeNoOnlinePlayers=72.000000,GuildPlayerMaxNum=20,PalEggDefaultHatchingTime=72.000000,WorkSpeedRate=1.000000,bIsMultiplay=True,bIsPvP=False,bCanPickupOtherGuildDeathPenaltyDrop=False,bEnableNonLoginPenalty=True,bEnableFastTravel=True,bIsStartLocationSelectByMap=True,bExistPlayerAfterLogout=False,bEnableDefenseOtherGuildPlayer=False,CoopPlayerMaxNum=4,ServerPlayerMaxNum=32,ServerName="My Palworld Server",ServerDescription="A self-hosted Palworld world on Ubuntu 24.04.",AdminPassword="change-me-strong-admin-pass",ServerPassword="",PublicPort=8211,PublicIP="",RCONEnabled=True,RCONPort=25575,Region="",bUseAuth=True,BanListURL="https://api.palworldgame.com/api/banlist.txt")Critical fields to review:
ServerName-- Shown in the in-game community server browser.ServerDescription-- One-line description shown beneath the name.AdminPassword-- Required for in-game admin commands and RCON. Always set a strong value.ServerPassword-- If non-empty, players must enter it to join. Leave empty for a public server.ServerPlayerMaxNum=32-- Maximum concurrent players. The engine hard-caps at 32.PublicPort=8211-- UDP port the server binds. Must match your firewall rule.RCONEnabled=TrueandRCONPort=25575-- Enables remote admin console. See Step 8.DeathPenalty-- Options:None(drop nothing),Item(drop inventory only),ItemAndEquipment(default),All(drop everything including Pals). Match to your community preference.ExpRate,PalCaptureRate,CollectionDropRate-- Gameplay multipliers. BumpingPalCaptureRateto1.5-2.0noticeably reduces early-game grind.bEnablePlayerToPlayerDamage=False-- Keep PvP off unless you are specifically running a PvP world.
Ctrl+O, Enter, then Ctrl+X.Step 7: Open UDP Port 8211 in the Firewall
Palworld uses UDP/8211 exclusively for game traffic (plus TCP/25575 for RCON if enabled). If you are using UFW (the standard Ubuntu firewall), allow the game port:
sudo ufw allow 8211/udp comment 'Palworld game'
sudo ufw reload
sudo ufw statusExpected output:
Status: active
To Action From -- ------ ---- 22/tcp ALLOW Anywhere 8211/udp ALLOW Anywhere # Palworld game
For RCON, do not expose TCP/25575 to the public internet. Either leave it bound to localhost (the default when you SSH in and issue RCON locally) or restrict access to your home IP:
sudo ufw allow from YOUR.HOME.IP.HERE to any port 25575 proto tcp comment 'Palworld RCON'If your provider uses a separate network firewall (Contabo, OVH, Hetzner), mirror the UDP/8211 rule there as well. See our guide on Configuring UFW on Ubuntu 24.04 for a deeper walkthrough.
Step 8: Enable RCON for Remote Admin
With RCONEnabled=True and RCONPort=25575 set in PalWorldSettings.ini, the server will accept RCON connections using the admin password. Install a lightweight RCON client to interact with it:
sudo apt install -y mcrconTest the connection (run as any user, from the server itself):
mcrcon -H 127.0.0.1 -P 25575 -p 'change-me-strong-admin-pass' 'Info'Expected output:
Welcome to Palworld Dedicated Server[v0.3.4.xxxxx] My Palworld ServerYou can now issue any admin command remotely. See Admin Commands via RCON below.
Step 9: Create a systemd Service with Auto-Restart
Running PalServer.sh in a terminal is fine for testing but will die the moment you close your SSH session. Wrap the server in a systemd unit so it starts on boot, restarts on crash, and writes its logs to journalctl.
As root, create the unit file:
sudo tee /etc/systemd/system/palworld.service > /dev/null <<'EOF' [Unit] Description=Palworld Dedicated Server After=network-online.target Wants=network-online.target[Service] Type=simple User=steam Group=steam WorkingDirectory=/home/steam/palworld ExecStartPre=/home/steam/steamcmd/steamcmd.sh +force_install_dir /home/steam/palworld +login anonymous +app_update 2394010 +quit ExecStart=/home/steam/palworld/PalServer.sh -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS Restart=on-failure RestartSec=10 KillSignal=SIGINT TimeoutStopSec=60 LimitNOFILE=65535
Hardening
NoNewPrivileges=true PrivateTmp=true ProtectSystem=full ProtectHome=false
[Install] WantedBy=multi-user.target EOF
Explanation of the important directives:
ExecStartPre=-- Runs a SteamCMD update check before every launch so the binary stays current automatically. Remove this line if you prefer manual update control.ExecStart=-- The three flags-useperfthreads -NoAsyncLoadingThread -UseMultithreadForDSare widely used community flags that improve multi-core utilization on headless Linux servers. See Performance Tuning.Restart=on-failure+RestartSec=10-- Auto-restart on crash with a 10-second cooldown.KillSignal=SIGINT-- Sends the same Ctrl+C that lets the server save state cleanly on shutdown.TimeoutStopSec=60-- Gives the server up to 60 seconds to flush saves before systemd force-kills it.
sudo systemctl daemon-reload
sudo systemctl enable palworld
sudo systemctl start palworldCheck that it is running:
sudo systemctl status palworldExpected output:
* palworld.service - Palworld Dedicated Server
Loaded: loaded (/etc/systemd/system/palworld.service; enabled; preset: enabled)
Active: active (running) since Wed 2026-04-16 10:00:00 UTC; 30s ago
Main PID: 2345 (PalServer-Linux)
Tasks: 24 (limit: 19055)
Memory: 3.2G
CPU: 18.456s
CGroup: /system.slice/palworld.service
-2345 /home/steam/palworld/Pal/Binaries/Linux/PalServer-Linux-Shipping Pal ...</code></pre></div>Tail the logs in real time:
<div class="code-block" data-lang="bash"><div class="code-block__header"><span class="code-block__lang">bash</span></div><pre><code class="language-bash">sudo journalctl -u palworld -f</code></pre></div>
For a deeper look at systemd unit files, see Managing systemd Services on Ubuntu 24.04.
Step 10: Automate World Backups
Palworld stores its entire world state -- players, Pals, bases, inventories -- under:
<div class="code-block" data-lang="text"><div class="code-block__header"><span class="code-block__lang">text</span></div><pre><code class="language-text">/home/steam/palworld/Pal/Saved/SaveGames/</code></pre></div>
A single corrupted save can erase weeks of progress. Set up a cron job that snapshots this directory every 30 minutes and retains the last 7 days of backups.
Create a backup script as the steam user:
<div class="code-block" data-lang="bash"><div class="code-block__header"><span class="code-block__lang">bash</span></div><pre><code class="language-bash">sudo -iu steam
mkdir -p ~/palworld-backups
tee ~/palworld-backup.sh > /dev/null <<'EOF'
#!/bin/bash
set -euo pipefail
SRC="/home/steam/palworld/Pal/Saved/SaveGames"
DST="/home/steam/palworld-backups"
STAMP="$(date -u +%Y%m%d-%H%M%S)"
Create compressed snapshot
tar -czf "${DST}/palworld-save-${STAMP}.tar.gz" -C "$(dirname "$SRC")" "$(basename "$SRC")"Retain last 7 days only (336 snapshots at 30-min cadence)
find "${DST}" -name 'palworld-save-*.tar.gz' -mtime +7 -delete
EOF
chmod +x ~/palworld-backup.sh</code></pre></div>Install the cron entry:
<div class="code-block" data-lang="bash"><div class="code-block__header"><span class="code-block__lang">bash</span></div><pre><code class="language-bash">crontab -e</code></pre></div>
Add this line:
<div class="code-block" data-lang="text"><div class="code-block__header"><span class="code-block__lang">text</span></div><pre><code class="language-text">/30 * /home/steam/palworld-backup.sh >> /home/steam/palworld-backups/backup.log 2>&1</code></pre></div>
Verify the first snapshot after 30 minutes:
<div class="code-block" data-lang="bash"><div class="code-block__header"><span class="code-block__lang">bash</span></div><pre><code class="language-bash">ls -lah ~/palworld-backups/</code></pre></div>
For disaster recovery, also rsync the backup directory to offsite storage (S3, Backblaze B2, another VPS) on a daily schedule. A single tar.gz of a mature 20-player world is typically 100-500 MB -- trivial to archive offsite.
Restoring a Backup
Stop the server, extract the snapshot back over SaveGames, then restart:
<div class="code-block" data-lang="bash"><div class="code-block__header"><span class="code-block__lang">bash</span></div><pre><code class="language-bash">sudo systemctl stop palworld
cd /home/steam/palworld/Pal/Saved
sudo -u steam tar -xzf /home/steam/palworld-backups/palworld-save-20260416-033000.tar.gz
sudo systemctl start palworld</code></pre></div>
Admin Commands via RCON
With RCON enabled, run admin actions without logging into the game. All commands follow the pattern:
<div class="code-block" data-lang="bash"><div class="code-block__header"><span class="code-block__lang">bash</span></div><pre><code class="language-bash">mcrcon -H 127.0.0.1 -P 25575 -p 'YOUR-ADMIN-PASSWORD' 'Command Arguments'</code></pre></div>
Common Admin Commands
<div class="article-table-wrap"><table><thead><tr><th>Command</th><th>Purpose</th></tr></thead><tbody><tr><td><code>Info</code></td><td>Show server version and name</td></tr><tr><td><code>ShowPlayers</code></td><td>List connected players with SteamID and PlayerUID</td></tr><tr><td><code>Broadcast <message></code></td><td>Send a server-wide chat message (no spaces in message)</td></tr><tr><td><code>Save</code></td><td>Force an immediate world save</td></tr><tr><td><code>Shutdown <seconds> <message></code></td><td>Graceful countdown shutdown with broadcast message</td></tr><tr><td><code>DoExit</code></td><td>Immediate shutdown (no save) -- avoid unless stuck</td></tr><tr><td><code>KickPlayer <SteamID></code></td><td>Kick a player by their Steam ID</td></tr><tr><td><code>BanPlayer <SteamID></code></td><td>Permanently ban a player</td></tr><tr><td><code>TeleportToPlayer <SteamID></code></td><td>Teleport yourself to a player (must be logged in)</td></tr><tr><td><code>TeleportToMe <SteamID></code></td><td>Summon a player to your position</td></tr></tbody></table></div>
Scheduled Daily Restart
Palworld benefits from a daily restart to flush memory and apply any Steam updates. Add a cron entry that issues a graceful RCON shutdown at 5 AM:
<div class="code-block" data-lang="text"><div class="code-block__header"><span class="code-block__lang">text</span></div><pre><code class="language-text">0 5 * mcrcon -H 127.0.0.1 -P 25575 -p 'YOUR-ADMIN-PASSWORD' 'Shutdown 300 Server_restarting_in_5_minutes'</code></pre></div>
Because systemd has Restart=on-failure, the service will not auto-restart after a clean shutdown. To get auto-restart after a scheduled Shutdown, change the unit to Restart=always -- or leave it as-is and add a @reboot or paired systemctl start cron entry five minutes later.
Performance Tuning
Palworld's UE5 server is notoriously CPU-heavy. The community has converged on a small set of launch flags and kernel tweaks that meaningfully improve frame pacing under load.
Launch Flags (already in our systemd unit)
<div class="code-block" data-lang="text"><div class="code-block__header"><span class="code-block__lang">text</span></div><pre><code class="language-text">-useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS</code></pre></div>
These flags instruct the Unreal Engine runtime to:
-useperfthreads -- Promote critical worker threads to real-time priority where possible, reducing tick jitter.
-NoAsyncLoadingThread -- Disable the async asset loader (unnecessary on a headless server), freeing a core.
-UseMultithreadForDS -- Enable multi-threaded dedicated-server mode (enabled by default in newer builds; explicit flag is harmless).
Kernel and Resource Tuning
Raise the open-file limit (large worlds hit it):
<div class="code-block" data-lang="bash"><div class="code-block__header"><span class="code-block__lang">bash</span></div><pre><code class="language-bash">sudo tee /etc/security/limits.d/palworld.conf > /dev/null <<EOF
steam soft nofile 65535
steam hard nofile 65535
EOF</code></pre></div>
Increase UDP buffer sizes for smoother networking under 20+ player load:
<div class="code-block" data-lang="bash"><div class="code-block__header"><span class="code-block__lang">bash</span></div><pre><code class="language-bash">sudo tee /etc/sysctl.d/99-palworld.conf > /dev/null <<EOF
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.core.netdev_max_backlog=5000
EOF
sudo sysctl --system</code></pre></div>
CPU Governor
On dedicated VPS hardware, set the performance governor so cores do not clock down during lull:
<div class="code-block" data-lang="bash"><div class="code-block__header"><span class="code-block__lang">bash</span></div><pre><code class="language-bash">sudo apt install -y cpufrequtils
echo 'GOVERNOR="performance"' | sudo tee /etc/default/cpufrequtils
sudo systemctl restart cpufrequtils</code></pre></div>
Note: many virtualized VPS platforms fix the governor at the hypervisor level, in which case this is a no-op but harmless.
Memory Sizing Reference
Approximate RAM usage by player count on a mature world:
<div class="article-table-wrap"><table><thead><tr><th>Players</th><th>Approximate RAM Usage</th><th>Recommended Plan</th></tr></thead><tbody><tr><td>1-4</td><td>6-8 GB</td><td>CloudCore Professional (12 GB)</td></tr><tr><td>5-10</td><td>8-12 GB</td><td>CloudCore Professional (12 GB)</td></tr><tr><td>11-20</td><td>12-16 GB</td><td>CloudCore Business (16 GB)</td></tr><tr><td>21-32</td><td>16-24 GB</td><td>CloudCore Business (16 GB) or larger</td></tr></tbody></table></div>
If you see the OOM-killer terminate PalServer-Linux-Shipping in dmesg, you need more RAM -- not more swap. Swap thrashing on a game server causes unplayable stutters.
Updating the Server
Palworld receives patches regularly, and clients will refuse to connect to an out-of-date server. The update command is the same SteamCMD invocation used for install:
<div class="code-block" data-lang="bash"><div class="code-block__header"><span class="code-block__lang">bash</span></div><pre><code class="language-bash">sudo systemctl stop palworld
sudo -iu steam bash -c '/home/steam/steamcmd/steamcmd.sh +force_install_dir /home/steam/palworld +login anonymous +app_update 2394010 validate +quit'
sudo systemctl start palworld</code></pre></div>
Because our systemd unit includes ExecStartPre= that runs the same app_update on every start, you can alternatively just restart the service:
<div class="code-block" data-lang="bash"><div class="code-block__header"><span class="code-block__lang">bash</span></div><pre><code class="language-bash">sudo systemctl restart palworld</code></pre></div>
The validate flag checksums every file and re-downloads any mismatches. It adds a minute or two to the update but prevents subtle corruption issues after failed downloads.
To check the currently installed build ID:
<div class="code-block" data-lang="bash"><div class="code-block__header"><span class="code-block__lang">bash</span></div><pre><code class="language-bash">grep -A1 '"2394010"' /home/steam/palworld/steamapps/appmanifest_2394010.acf | grep buildid</code></pre></div>
Compare against the latest build ID on SteamDB to see whether you are current.
Troubleshooting
<div class="article-table-wrap"><table><thead><tr><th>Problem</th><th>Cause</th><th>Solution</th></tr></thead><tbody><tr><td>Server killed with <code>out of memory</code> in <code>dmesg</code></td><td>RAM exhausted under player load</td><td>Upgrade to more RAM. Do not compensate with swap -- it causes stutters. Check <code>free -h</code> and ps aux --sort=-rss \head.</td></tr><tr><td>CPU pegged at 100% constantly</td><td>Too many base workers / overbuilt bases / insufficient vCPU</td><td>Lower <code>BaseCampWorkerMaxNum</code>. Upgrade vCPU. Check hot cores with <code>htop</code>.</td></tr><tr><td>Save file corruption after crash</td><td>Ungraceful shutdown mid-save</td><td>Restore latest backup from <code>~/palworld-backups/</code>. Ensure systemd <code>KillSignal=SIGINT</code> and <code>TimeoutStopSec=60</code> are set.</td></tr><tr><td>Players cannot connect</td><td>UDP/8211 blocked or wrong public IP</td><td>Verify UFW: <code>sudo ufw status</code>. Verify provider firewall. Test from outside: <code>nc -u -zv YOUR.IP 8211</code>.</td></tr><tr><td>"Server is full" despite low player count</td><td><code>ServerPlayerMaxNum</code> misset</td><td>Edit <code>PalWorldSettings.ini</code>, set to <code>32</code>, restart service.</td></tr><tr><td>RCON connection refused</td><td>RCON not enabled or wrong port</td><td>Confirm <code>RCONEnabled=True</code> and <code>RCONPort=25575</code>. Check ss -tlnp \grep 25575.</td></tr><tr><td>Server unreachable after Palworld patch</td><td>Client version newer than server</td><td>Run <code>sudo systemctl restart palworld</code> to trigger the <code>ExecStartPre</code> update, or manually <code>app_update 2394010 validate</code>.</td></tr><tr><td>High packet loss / rubber-banding</td><td>Insufficient UDP buffers</td><td>Apply the <code>sysctl</code> tuning in <a href="#performance-tuning">Performance Tuning</a>.</td></tr><tr><td><code>steamcmd.sh: not found</code> or 32-bit errors</td><td>Multiarch i386 libraries missing</td><td>Re-run the <code>dpkg --add-architecture i386</code> step and reinstall <code>lib32gcc-s1</code>.</td></tr><tr><td>Server starts, then exits after ~30 seconds</td><td>First run without generated config</td><td>Complete <a href="#step-5-first-launch-and-config-generation">Step 5</a> to create <code>PalWorldSettings.ini</code>.</td></tr></tbody></table></div>
Viewing Logs
The most useful debugging tool is the systemd journal:
<div class="code-block" data-lang="bash"><div class="code-block__header"><span class="code-block__lang">bash</span></div><pre><code class="language-bash">sudo journalctl -u palworld -f</code></pre></div>
For the last 200 lines without following:
<div class="code-block" data-lang="bash"><div class="code-block__header"><span class="code-block__lang">bash</span></div><pre><code class="language-bash">sudo journalctl -u palworld -n 200 --no-pager</code></pre></div>
In-game logs also land under ~/palworld/Pal/Saved/Logs/Pal.log -- useful for Unreal-specific errors.
FAQ
How many players can a Palworld dedicated server support?
The current dedicated server binary supports up to 32 concurrent players, configured via ServerPlayerMaxNum in PalWorldSettings.ini. This is an engine-level cap; you cannot exceed it without unofficial modifications. Most servers run comfortably at 16-24 active players on a 16 GB VPS; filling to 32 typically benefits from 24 GB+ of RAM, especially if players build large bases with many Pal workers.
Do I need to own Palworld on Steam to run the dedicated server?
No. The dedicated server (app ID 2394010) is a separate anonymous download on Steam. You log in to SteamCMD as anonymous -- no account, no purchase required on the server host. Players joining the server of course still need to own Palworld on their own Steam accounts.
Can I run Palworld on a 4 GB or 8 GB VPS?
4 GB is not realistic -- the server will OOM within minutes. 8 GB works for a 2-4 player family/friends world with a modest base, but will be cramped. For anything resembling a public or semi-public server, start at 16 GB. UE5 world simulation and Pal AI scale aggressively with player count and base size; undersizing results in OOM kills that corrupt saves.
How do I migrate my save to a new VPS?
Stop the server on the old host, tar the entire ~/palworld/Pal/Saved/ directory, copy it to the new host with scp or rsync, then extract it in the matching location on the new install. Both SaveGames/ (world state) and Config/LinuxServer/PalWorldSettings.ini (your settings) move together. Restart, and the world resumes exactly where it stopped.
Does Palworld support mods on dedicated servers?
Palworld is still in early access and does not yet have official mod support for dedicated servers. Community-made tools exist for save editing (viewing Pal stats, respawning eggs, resetting player data), and some admins run Discord bots that use RCON to bridge chat between game and Discord. Official mod and plugin APIs are on Pocketpair's published roadmap.
Why is my CPU usage so high even with only a few players?
Palworld's CPU cost is dominated by base worker Pal AI, not player count. A single player with 3 fully-staffed level-4 bases can generate more CPU load than 10 players exploring the open world. If CPU pegs, lower BaseCampWorkerMaxNum (default 15, try 10), or restrict BaseCampMaxNum per guild. Large bases with many moving Pals are the biggest tick-rate consumers.
How often should I back up the save?
Every 15-30 minutes for active servers. Saves are small (tens to hundreds of MB compressed) and the main risk is crash-time corruption, not gradual data loss. Retain at least 7 days of snapshots, and copy a daily archive to offsite storage. Our cron example above implements exactly this pattern.
Next Steps
Now that your Palworld server is running, here are recommended next steps to extend the setup:
Hook up a Discord bot via RCON -- Tools like Palworld-Discord-Bot bridge in-game chat to a Discord channel, let admins issue RCON commands from Discord, and announce player joins/leaves.
- Set up Uptime Kuma monitoring -- Deploy Uptime Kuma on the same or a separate VPS and monitor your UDP/8211 game port, RCON socket, and system metrics. Get Discord/email alerts when the world goes down.
Offsite backup to S3 or Backblaze B2 -- Extend the backup cron to rclone copy the snapshot tarballs to cloud object storage nightly. At typical save sizes, a year of daily archives costs pennies.
- Run a web dashboard -- Deploy palworld-server-toolkit or a community web panel on the same VPS to inspect Pals, manage guilds, and issue commands from a browser.
Tune for a PvP world -- Flip bEnablePlayerToPlayerDamage=True and bIsPvP=True, then revisit multipliers like PlayerDamageRateAttack to balance combat pace. Consider a shorter death penalty (Item instead of ItemAndEquipment`) to reduce PvP friction.
- Pair with a VPN for private worlds -- For a strictly-friends server, skip the public UFW rule and instead allow UDP/8211 only from a WireGuard subnet. Friends connect to the VPN first, then join the game.
Ready to Launch Your Palworld World?
>
Our CloudCore Business plan is purpose-built for game servers like Palworld: 6 AMD EPYC vCPU, 16 GB RAM, 200 GB NVMe SSD, and unmetered bandwidth at a flat EUR 29.99/month.
>
- 32-player capacity out of the box
- NVMe storage for fast save writes and instant world loads
- Unmetered bandwidth for public servers
- Root SSH, full firewall control, and your choice of Ubuntu 24.04
- Scale up to 32 GB RAM in-place without rebuilding
>
Deploy a CloudCore Business VPS -- spin up in under 60 seconds and have your Palworld world running before your friends finish downloading the patch.