Palworld document: https://docs.palworldgame.com/getting-started/deploy-dedicated-server/
Need a server so that my friends can play the game even when I am not running the game and hosting. Tailscale was the first choice. However, it’s difficult to help non-engineer friends in China set up Tailscale and additional VPN. So I gave up Tailscale.
This blog post details how I installed and configured a Palworld server that can back up and restore save files and starts up automatically at boot.
Saves Converter
https://hub.tcno.co/games/palworld/converter/
It can convert between dedicated server and co-op saves.
If you find that the fog of war isn’t working properly after the conversion, you can copy the LocalData.sav file from your current save to the new world save.
The file is located at: %AppData%\Local\Pal\Saved\SaveGames\<user ID>\<world ID>\.
GCP Spot VM
Chose GCP spot VM. Because we don’t require it to be 100% reliable and it’s much cheaper than on-demand. Even if GCP terminates the instance, the data on the disk is preserved. All saved data remains intact and can be used again later. I used AWS spot EC2 several years ago and AWS didn’t preserve the disks if I recall correctly.
Two players. 2 cores + 8GB memory VM is sufficient. The memory can be trimmed down to 6GB to save more money.
Installation
Steam
https://developer.valvesoftware.com/wiki/SteamCMD#Linux
Manually installation.
sudo apt-get install lib32gcc-s1
Run steam as a non-root user:
sudo useradd -m steam
sudo passwd steam
sudo -u steam -s
cd /home/steam
mkdir ~/Steam && cd ~/Steam
curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxvf -
Or
Debian Trixie — no apt-add-repository (Ubuntu-only). Enable non-free manually.
It didn’t work for me didn’t know why.
sudo dpkg --add-architecture i386
echo "deb http://deb.debian.org/debian trixie main contrib non-free non-free-firmware" \
| sudo tee /etc/apt/sources.list.d/non-free.list
sudo apt update
sudo apt install steamcmd
Palworld Server Installation
I installed the steamcmd binary so using steamcmd.sh.
Install and upatde:
./steamcmd.sh +@sSteamCmdForcePlatformType linux \
+force_install_dir /home/steam/palworld \
+login anonymous \
+app_update 2394010 validate \
+quit
Run
Follow the Palworld documentation. Palworld server config:
# copy default ini here
vi Pal/Saved/Config/LinuxServer/PalWorldSettings.ini
Start:
nohup ./palworld/PalServer.sh -port=8211 -players=4 -logformat=text > ~/palserver.log 2>&1 &
Stop:
pkill -f PalServer
SSH
gcloud config set project $PROJ
gcloud config set compute/zone asia-northeast1-c
Start my VM named pal:
gcloud compute instances start pal
gcloud compute ssh pal
su - steam
bash
Backup and Restore
Create a bucket. Mine is pal-saves-backup.
gcloud storage buckets create gs://pal-saves-backup --project=$PROJ --location=$ZONE
Install the required zip and unzip.
Backup
Set up a cron job to run every 10 minutes to back up the saves folder:
#!/bin/bash
set -e
ZIP=/tmp/saves_$(date +%Y%m%d_%H%M%S).zip
BUCKET=gs://pal-saves-backup/saves/
cd /home/steam/palworld/Pal/Saved
zip -rq "$ZIP" SaveGames
gcloud storage cp "$ZIP" "$BUCKET"
rm -f "$ZIP"
crontab -e
*/10 * * * * /home/steam/backup.sh
Restore
I never had to use the restore script because the disk was preserved.
~/restore-saves.sh — restores latest backup (or pass a timestamp to pick one).
#!/bin/bash
set -e
SAVED_DIR=/home/steam/palworld/Pal/Saved
SAVES=$SAVED_DIR/SaveGames
BUCKET=gs://pal-saves-backup/saves/
if [ -n "$1" ]; then
FILE=$(gcloud storage ls "$BUCKET" | grep "$1" | tail -1)
else
FILE=$(gcloud storage ls "$BUCKET" | tail -1)
fi
[ -z "$FILE" ] && { echo "No backup found"; exit 1; }
echo "Restoring: $FILE"
pkill -f PalServer || true
TMP=$(mktemp -d)
gcloud storage cp "$FILE" "$TMP/backup.zip"
rm -rf "$SAVES"
unzip -oq "$TMP/backup.zip" -d "$SAVED_DIR"
rm -rf "$TMP"
echo "Done"
Usage:
bash ~/restore-saves.sh # latest
bash ~/restore-saves.sh 20260713_09 # specific time
Systemctl
Add palserver.service to Systemctl to have the server atuo started on server startup.
/etc/systemd/system/palserver.service
[Service]
User=steam
WorkingDirectory=/home/steam
ExecStart=/bin/bash -c '/home/steam/palworld/PalServer.sh -port=8211 -players=4 -logformat=text'
Restart=always
RestartSec=10
KillSignal=SIGTERM
TimeoutStopSec=30
sudo systemctl daemon-reload
sudo systemctl enable palserver
sudo systemctl start palserver
After finishing all the step, I can start and stop the server for my friends on my phone. Sometimes the IP of the spot VM changes but not a big problem. I can make the IP static if I want.