How to set up a Palworld dedicated server on a Linux VPS step by step
Technical tutorial to deploy a Palworld dedicated server on Ubuntu 24.04 LTS VPS: SteamCMD, systemd, firewall, PalWorldSettings.ini and RAM tuning.
Running a Palworld dedicated server on a Linux VPS requires attention to two points that often trip up admins coming from simpler servers: aggressive RAM usage (the process easily exceeds 8 GB with a populated world) and the fact that the game uses UDP on a single main port, with no secondary TCP for HTTP or queries. Misconfiguring the firewall blocks the server from appearing in the listing — a common symptom for first-time owners.
This tutorial covers a from-scratch installation on Ubuntu 24.04 LTS via official SteamCMD, full PalWorldSettings.ini configuration, isolation through a dedicated user, systemd supervision with automatic restart, UFW firewall and memory tuning. Estimated execution time: 30-45 minutes. You finish with a Palworld server online, registered in the community list and automatically restarting after reboot or crash.
The target persona is a new owner setting up their first Palworld dedicated server. No prior Linux experience is required — every command is explained, and the most common errors have a dedicated section at the end.
Prerequisites
A VPS with Ubuntu 24.04 LTS (Server, not Desktop), SSH access as a sudo user, at least 8 GB of RAM (16 GB recommended for 16+ players), 4 vCPUs with high clock and 30 GB of free disk. x86_64 CPU is mandatory. A stable connection to download ~5 GB of the server via SteamCMD.
Confirm the technical parameters before proceeding:
Ubuntu 24.04 LTS x86_64 8 GB (16 GB recommended) 30 GB free 8211/UDP 25575/TCP (optional) Port 8211/UDP is the only mandatory port — all client-server communication goes through it. Port 25575/TCP is optional and only needs to be open if you want remote administration via RCON (recommended for moderation). Do not expose RCON to the open internet — restrict it by IP or use an SSH tunnel.
Installing PalServer via SteamCMD
This section covers everything from creating the dedicated user to the server being downloaded and started for the first time. Running game services with their own user (not root) limits the impact of any failure or exploit — and keeps the game files isolated in a dedicated home.
Update the package index and install basic dependencies:
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 libsdl2-2.0-0:i386 curl wget ca-certificatesThe i386 architecture is required because SteamCMD ships as a 32-bit binary, even though PalServer itself is 64-bit. Without lib32gcc-s1 SteamCMD fails on first run with a library error.
Create a dedicated palworld user with no login privileges:
sudo useradd -r -m -d /opt/palworld -s /bin/bash palworld
sudo su - palworldThe -r flag creates a system user, -m creates the home at /opt/palworld. You are now operating as palworld — all the next commands run in that context until further notice.
Download and prepare SteamCMD inside the user’s home:
cd /opt/palworld
mkdir -p steamcmd && cd steamcmd
curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxvf -
./steamcmd.sh +quitThe first run downloads updates for SteamCMD itself and exits. If a “Steam Guard” or similar error appears, ignore it — we are not logging into a Steam account (Palworld dedicated is anonymous).
Install the Palworld dedicated server (AppID 2394010):
cd /opt/palworld/steamcmd
./steamcmd.sh +force_install_dir /opt/palworld/server \
+login anonymous \
+app_update 2394010 validate \
+quitThe download is approximately 5 GB. On a 1 Gbps VPS the operation takes 1-3 minutes. At the end, confirm the message Success! App '2394010' fully installed. before proceeding. If the internet drops mid-way, run the same command again — SteamCMD resumes from where it stopped.
Run the server once to generate the default configuration files:
cd /opt/palworld/server
./PalServer.shThe server starts, generates the Pal/Saved/Config/LinuxServer/ directory with the default files and keeps running. Wait until the message Setting breakpad minidump AppID appears in the console — that means it is ready. Stop it with Ctrl+C. We will configure it before bringing it back up.
Configuring PalWorldSettings.ini
The PalWorldSettings.ini file controls all server behavior: name, description, password, slots, RCON, public announcement, difficulty and XP/capture rates. It lives at /opt/palworld/server/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini and uses key=value format.
Copy the default template before editing — that way you always have a reference of what changed:
cd /opt/palworld/server/Pal/Saved/Config/LinuxServer
cp PalWorldSettings.ini PalWorldSettings.ini.default
nano PalWorldSettings.iniThe file has a single huge line starting with OptionSettings=(...). Do not break that line across multiple lines — Palworld’s parser is strict and breaking it invalidates the whole configuration.
Adjust the critical fields inside the OptionSettings parentheses. The most important ones for a public server:
ServerName="My Palworld Server",
ServerDescription="24/7 server",
AdminPassword="YOUR_STRONG_ADMIN_PASSWORD_HERE",
ServerPassword="",
PublicIP="YOUR_VPS_PUBLIC_IP",
PublicPort=8211,
ServerPlayerMaxNum=16,
bIsMultiplay=True,
bEnableInvaderEnemy=True,
RCONEnabled=True,
RCONPort=25575Leave ServerPassword="" (empty) for a public server, or set a password for private access. The PublicIP is what appears in the community announcement — fill it in with the IP shown by curl ifconfig.me run on the VPS.
The PalWorldSettings.ini is particularly fragile. Strings must be enclosed in double quotes. Booleans are True/False (capitalized). Numbers do not take quotes. Forgetting a comma between fields makes the server ignore everything after the error and fall back to defaults.
Tune progression rates to balance the pace of play. Defaults are designed for single-player; on a multiplayer server with shorter sessions, slightly increased rates avoid frustration:
ExpRate=1.500000,
PalCaptureRate=1.500000,
PalSpawnNumRate=1.000000,
PalDamageRateAttack=1.000000,
PalDamageRateDefense=1.000000,
PlayerDamageRateAttack=1.000000,
PlayerDamageRateDefense=1.000000,
DeathPenalty="All"ExpRate=1.5 gives 50% more XP. PalCaptureRate=1.5 increases capture probability. DeathPenalty="All" keeps the default (lose everything on death) — other options are "Item", "ItemAndEquipment" and "None" for more casual servers.
Firewall and systemd supervision
Running the server manually is useful to test the configuration, but in production you need a supervisor (to restart on crash) and a firewall (to block anything that is not the game). Switch back to your sudo user now — exit the palworld context with exit.
Open the required ports in UFW:
sudo ufw allow 8211/udp comment 'Palworld game port'
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw enable
sudo ufw status verboseDo not open RCON (25575/tcp) to 0.0.0.0 — if you use it, restrict it to your admin IP: sudo ufw allow from YOUR_IP to any port 25575 proto tcp. Exposed RCON + weak password = server takeover.
Before running ufw enable, confirm that the 22/tcp rule (or your custom SSH port) is added. Enabling UFW without an SSH rule locks you out of the VPS. If that happens, recovery is only possible via the hosting panel’s out-of-band console.
Create the systemd unit file at /etc/systemd/system/palworld.service:
sudo nano /etc/systemd/system/palworld.serviceContents:
[Unit]
Description=Palworld Dedicated Server
After=network.target
[Service]
Type=simple
User=palworld
Group=palworld
WorkingDirectory=/opt/palworld/server
ExecStart=/opt/palworld/server/PalServer.sh
Restart=on-failure
RestartSec=15
LimitNOFILE=65536
StandardOutput=append:/var/log/palworld/server.log
StandardError=append:/var/log/palworld/server.log
[Install]
WantedBy=multi-user.targetCreate the log directory and enable the service:
sudo mkdir -p /var/log/palworld
sudo chown palworld:palworld /var/log/palworld
sudo systemctl daemon-reload
sudo systemctl enable --now palworldLimitNOFILE=65536 raises the file descriptor limit — Palworld opens many simultaneous sockets with multiple players and hits the default 1024 limit with 16+ players.
Configure an automatic restart every 12 hours to mitigate the memory leak. Create a systemd timer:
sudo nano /etc/systemd/system/palworld-restart.service[Unit]
Description=Restart Palworld server
[Service]
Type=oneshot
ExecStart=/bin/systemctl restart palworldsudo nano /etc/systemd/system/palworld-restart.timer[Unit]
Description=Restart Palworld every 12h
[Timer]
OnBootSec=12h
OnUnitActiveSec=12h
Persistent=true
[Install]
WantedBy=timers.targetEnable it:
sudo systemctl daemon-reload
sudo systemctl enable --now palworld-restart.timerPalworld has a progressive memory leak documented by the community. Restarting every 12 hours solves it without players noticing (the transition takes 30-40 seconds). Communicate the schedule to players — restarting mid-raid frustrates them.
Verification
Confirm that the server is running as a supervised service and responding on the network.
sudo systemctl status palworld
sudo ss -ulnp | grep 8211
tail -f /var/log/palworld/server.log
systemctl status should show active (running) for a few minutes. ss -ulnp should list the PalServer-Linux process listening on 8211/UDP. The log should contain lines with Setting breakpad minidump AppID and startup activity with no configuration errors.
For a real-world test, open Palworld on the client, go to “Join Multiplayer Game” → “Community Server List” and search for the name you set in ServerName. It may take 1-3 minutes to propagate. Before showing up in the list, direct connection by IP works: on the same screen, use “Connect by IP” and enter YOUR_VPS_IP:8211.
Troubleshooting
”Address already in use” on startup
Another instance is still running. Stop it with sudo systemctl stop palworld and sudo pkill -u palworld PalServer-Linux. Wait 30 seconds before restarting — the UDP socket takes time to release when the process crashes without a graceful shutdown.
Server starts but does not appear in the community list
Most common cause: PublicIP empty or incorrect in PalWorldSettings.ini. Confirm by running curl ifconfig.me on the VPS and comparing with the configured value. Second cause: port 8211/UDP blocked. Test with nmap -sU -p 8211 YOUR_IP from another machine — if it shows closed or filtered, it is a firewall issue (UFW or upstream provider block).
Players connect but drop after a few minutes
Almost always low RAM. Check with free -h while the server is populated. If the available column drops below 500 MB and swap is being used heavily, you need a plan upgrade or to reduce ServerPlayerMaxNum. Palworld is particularly sensitive to swap — heavy usage causes visible movement stutter.
”Failed to initialize Steam connection”
The server cannot reach Steam infrastructure. Check whether the VPS has outbound internet (curl -I https://steamcdn-a.akamaihd.net) and whether there is a firewall blocking egress. On some hosts with edge firewalling, allow outbound UDP/TCP to Steam ranges.
Next steps
With the base server online, typical evolution points:
- Configure automatic backup of the world (
Pal/Saved/SaveGames/) with rsync scheduled by cron - Implement remote moderation via RCON using tools like
rcon-cli - Add a Discord webhook to notify when a player joins/leaves (via log parser)
- Set up RAM and CPU monitoring to alert before OOM
- Spin up a second server on another UDP port (
8212) for a separate PVP mode
If you are putting this into production and want low latency for Brazilian players, a Hostini VPS in São Paulo typically delivers 5-15 ms across most of Brazil, with edge DDoS protection sized for UDP spikes — exactly the profile Palworld servers demand at peak hours.
Frequently asked questions
How much RAM and CPU do I need for a Palworld server?
The Palworld dedicated server consumes between 6 and 12 GB of RAM in real use, depending on the number of players and world size. For 4-8 players, 8 GB of RAM and 4 vCPUs deliver stability. For 16-32 players, consider 16 GB of RAM and 6 vCPUs. The process is single-thread dominant, so high clock matters more than many cores.
Does the Palworld server run on ARM64 (Ampere, Graviton)?
No. The official PalServer binary from Pocketpair is compiled for x86_64 Linux with glibc dependencies. ARM64 does not work even via practical emulation. Use a VPS with Intel or AMD x86_64 CPU — any standard plan covers it.
Why does my server not appear in the in-game community list?
Confirm that PublicIP and PublicPort are filled in PalWorldSettings.ini with the actual VPS IP and UDP port 8211. Servers behind strict NAT or without a correct PublicIP cannot announce themselves. Propagation takes 1-3 minutes after startup. Direct connection by IP works even without the public listing.
The server crashes or freezes with OOM (out of memory) — how do I avoid it?
Palworld has a known memory leak on long sessions — the process grows gradually. Configure a scheduled restart every 12 or 24 hours via cron or systemd timer. Also ensure swap is configured (4-8 GB) as a safety net, but not as a primary solution — heavy swap causes in-game stutter.
Can I run the Palworld server in a Docker container?
Yes, there are working community images. For production on a dedicated VPS, running directly on the host with systemd is more predictable — fewer network layers, simpler UDP debugging and direct updates via SteamCMD. Docker makes sense if you manage multiple servers on the same machine.
How do I back up the server world without stopping the service?
World data lives in Pal/Saved/SaveGames/0/<WorldID>/. You can copy that folder with the server running, but there is a risk of capturing inconsistent state. Ideally, trigger a save manually via RCON (Save command), wait 5 seconds and then copy. For automation, schedule a bash script that runs Save + rsync + daily rotation.