Install Palworld's dedicated server under its own Linux account, edit the configuration the server actually reads and enable discovery for console players. This walkthrough creates a new, unmodded world on a fresh Ubuntu 24.04 x86_64 VPS with a public IPv4 address, SSH and a user with sudo. It follows Pocketpair's server documentation 1.0.4, checked on October 12, 2026.
Older guides that say dedicated-server crossplay excludes PS5 no longer match the current platform reference. Steam, Xbox/Microsoft Store, Mac and PS5 are supported; Xbox and PS5 players need a community server listed in the game.
Choose memory and the way players find the server#
Pocketpair's requirements recommend four or more CPU cores and list 16 GB RAM, with more memory for larger workloads. An 8 GB machine can boot but has greater out-of-memory crash risk. Use SSD storage and leave room for world data and archives. This is a deployment baseline, not a promise of a particular player count.
A community server is the same dedicated process registered in the game's server list. This guide enables that registration. For a PC-only private group using direct IP, you can omit -publiclobby; for Xbox or PS5, keep it. A listed server can still have a join password.
Download into a fixed directory#
Run these commands on the VPS. The game account has its own HOME, owns the installed files and does not run as root:
sudo apt update
sudo apt install -y ca-certificates curl lib32gcc-s1 libstdc++6 nano ufw
sudo adduser --system --group --home /srv/palworld palworld
sudo install -d -o palworld -g palworld -m 750 /srv/palworld/steamcmd /srv/palworld/server
sudo -u palworld -H curl -fsSLo /srv/palworld/steamcmd/steamcmd.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz
sudo -u palworld -H tar -xzf /srv/palworld/steamcmd/steamcmd.tar.gz -C /srv/palworld/steamcmd
sudo -u palworld -H /srv/palworld/steamcmd/steamcmd.sh +force_install_dir /srv/palworld/server +login anonymous +app_update 2394010 validate +quit
The application ID and PalServer.sh launcher come from the deployment reference. Confirm that download succeeded and keep its build information in your server notes. Run once in the foreground to generate configuration directories:
sudo -u palworld -H /bin/bash -c 'cd /srv/palworld/server && ./PalServer.sh -port=8211'
Wait for startup, then press Ctrl+C and wait for this initial process to finish. Do this before admitting players. Missing-library or launch errors need fixing before continuing; do not create a service around an installation that never started.
Copy the complete defaults, then edit the active INI#
On a new installation, copy the installed template:
sudo -u palworld cp /srv/palworld/server/DefaultPalWorldSettings.ini /srv/palworld/server/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini
sudo chmod 600 /srv/palworld/server/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini
sudo -u palworld nano /srv/palworld/server/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini
Do not repeat that copy on an existing configured world: it overwrites your settings. The configuration reference explains that editing DefaultPalWorldSettings.ini itself does not change the running world.
Keep the template's section header and one complete OptionSettings=(...) line. Within that line replace the existing values for the keys below. This is a fragment to locate and edit, not a replacement file:
ServerName="Our Palworld Server",ServerDescription="Private group",ServerPassword="REPLACE_JOIN_SECRET",AdminPassword="REPLACE_ADMIN_SECRET",ServerPlayerMaxNum=8,CrossplayPlatforms=(Steam,Xbox,PS5,Mac),RCONEnabled=False,RESTAPIEnabled=False
Use different random join and administrator passwords. Keep every other template field and its outer parentheses; do not add a second OptionSettings line. Pocketpair's official repository demonstrates the section [/Script/Pal.PalGameWorldSettings] and tuple syntax. A text editor's visual wrapping is fine; splitting the tuple into unrelated INI keys is not.
Keep PublicIP empty initially. PublicPort is an advertised endpoint; it does not change the listening port. We set the listening port explicitly at launch. RCON and REST remain disabled here, so neither needs a public firewall rule.
Run it as a community service#
Create sudo nano /etc/systemd/system/palworld.service:
[Unit]
Description=Palworld dedicated server
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=palworld
Group=palworld
WorkingDirectory=/srv/palworld/server
Environment=HOME=/srv/palworld
ExecStart=/srv/palworld/server/PalServer.sh -port=8211 -publiclobby
KillSignal=SIGINT
TimeoutStopSec=180
SendSIGKILL=no
Restart=no
UMask=0027
[Install]
WantedBy=multi-user.target
-publiclobby enables community registration. Leave the old -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS bundle out: the current argument reference says leaving it unset may improve performance in 1.0 and later. Measure an actual workload before adding tuning flags.
Restart=no also lets a deliberate in-game shutdown leave the server stopped for backup. A service can be stopped from Linux in an emergency, but the routine save-and-shutdown procedure below uses documented game commands.
sudo systemctl daemon-reload
sudo systemctl enable --now palworld
sudo systemctl status palworld --no-pager
sudo journalctl -u palworld -n 100 --no-pager
Open UDP and check each platform#
Allow your real SSH port before enabling UFW. This example uses 22; substitute the port your SSH connection uses. In the provider firewall, permit the same game port:
sudo ufw allow 22/tcp
sudo ufw allow 8211/udp
sudo ufw enable
sudo ufw status verbose
sudo ss -lunp
The game route is UDP 8211. Opening TCP 8211 does not substitute for it. Leave outbound access available for download and community registration.
From a PC client that offers direct address entry, connect to VPS_IP:8211. Xbox and PS5 players should find the configured ServerName in the community list. Compare the displayed server name with the configured one; a default name can indicate the active configuration was not applied.
Join from an external player connection and enter the join password. Verify the platforms your group actually uses; one successful PC join does not establish console discovery. Note the client/server versions if joining fails. Do not make compatibility claims from the active state alone.
Save, shut down and copy the data away#
With your administrator player connected, use the documented in-game commands. Replace the placeholder with the separate administrator password:
/AdminPassword REPLACE_ADMIN_SECRET
/Save
/Shutdown 30 Maintenance
Wait for shutdown to complete. On the VPS:
sudo systemctl is-active palworld
sudo systemctl show palworld -p MainPID -p SubState
sudo journalctl -u palworld -n 80 --no-pager
Confirm there is no running game process (MainPID=0) and the log shows completed shutdown. An unexpected failure needs investigation before treating its files as a clean backup. If shutdown remains pending, do not archive live data or force-kill the process just to make the state look correct.
Archive the complete Pal/Saved tree, including configuration and worlds:
set -e
sudo install -d -m 700 /var/backups/palworld
PALWORLD_BACKUP="/var/backups/palworld/palworld-$(date -u +%Y%m%dT%H%M%SZ).tar.gz"
sudo tar -czf "$PALWORLD_BACKUP" -C /srv/palworld/server Pal/Saved
sudo tar -tzf "$PALWORLD_BACKUP"
install -d -m 700 "$HOME/gamehost-backup-export"
sudo install -m 600 -o "$(id -u)" -g "$(id -g)" "$PALWORLD_BACKUP" "$HOME/gamehost-backup-export/palworld-backup.tar.gz"
sudo systemctl start palworld
Run the archive block together; set -e stops on an error before restarting the service. The export file is created with mode 600 inside your own private directory, while the dated archive remains root-private.
On your computer, retrieve that copy over SSH. Use the same SSH login that ran the archive commands and substitute the public address; add -P YOUR_SSH_PORT for a custom SSH port:
scp SSH_USER@VPS_IP:gamehost-backup-export/palworld-backup.tar.gz ./palworld-backup.tar.gz
Then run rm -- "$HOME/gamehost-backup-export/palworld-backup.tar.gz" on the VPS. Keep dated archives, the service file and server-build notes off-host. Check that a small world change survives shutdown and startup. A separate restore rehearsal with matching software and an isolated endpoint is still needed to prove the archive is usable.
Update during maintenance and diagnose the next failure#
For an update, perform the same in-game shutdown and backup, omitting the final sudo systemctl start palworld in the archive block. Confirm MainPID=0 again, then repeat the SteamCMD download command. If you already restarted after the backup, repeat /Save and /Shutdown and verify process exit first. Preserve the active INI; compare it with new defaults rather than replacing it. Start the service and recheck both world progress and the platforms in your group.
| Observation | Useful next check |
|---|---|
| PC joins, Xbox/PS5 cannot find it | Confirm the service command includes -publiclobby and the community list shows the correct name. Check the platforms allowed in the active INI. |
| Settings do not apply | Inspect Pal/Saved/Config/LinuxServer/PalWorldSettings.ini; compare its section and single complete tuple with the installed defaults. Edit while stopped. |
| Direct IP times out | Check UDP 8211 in both firewalls, listening socket and the public address. |
| Listing advertises the wrong endpoint | Compare listening -port, public IP and advertised PublicPort; change public addressing only after confirming the mismatch. |
| Service disappears under load | Inspect journalctl -u palworld and journalctl -k for a crash or OOM kill; capture memory and workload evidence before reducing limits or buying a larger VPS. |
| Fresh world or missing progress | Stop further play and preserve all of Pal/Saved before attempting recovery; check which installation the service launched. |
A discovery failure, a transport failure and a save-selection failure call for different fixes. Preserve the evidence and change the setting that corresponds to the observed failure.




