Overview
Palworld's dedicated server binary is built for x86-64. A Pi 5 is ARM64. This guide runs the server through hardware-accelerated emulation via a purpose-built Docker image, and covers every setting that determines whether your server is actually findable — not just online.
The single most common failure mode
A server that works perfectly over direct-connect but never appears in the
community browser almost always traces back to one missing setting — covered in
Step 3. If you only remember one thing from this page, remember IS_MULTIPLAY.
What you'll need
- Raspberry Pi 58GB model recommended for 3–5 players
- NVMe SSDStrongly preferred over microSD — saves are write-heavy
- Raspberry Pi OS (64-bit)Already flashed, SSH-accessible
- Router admin accessFor port forwarding & a DHCP reservation
Fix the kernel page size
Raspberry Pi 5 boots a 16 KB memory-page kernel by default. The x86 emulation layer underneath the game server binary cannot load at all under 16K pages — it fails before your server ever gets a chance to start. Switch to the standard 4K-page kernel first.
sudo nano /boot/firmware/config.txt
Add this line at the bottom of the file, then save and exit:
kernel=kernel8.img
sudo reboot
After it reconnects, confirm the page size actually changed:
getconf PAGE_SIZE
# must print 4096 — if it still says 16384, double-check config.txt
Install Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
Log out and back in for the group change to apply (or run newgrp docker), then confirm:
docker --version
docker compose version
The compose file
This runs on thijsvanloef/palworld-server-docker — actively maintained, tested on ARM64, and the only common option with a properly documented setting for community-list visibility.
mkdir -p ~/palworld && cd ~/palworld
nano compose.yaml
services:
palworld:
image: thijsvanloef/palworld-server-docker:latest
restart: unless-stopped
container_name: palworld-server
stop_grace_period: 30s
ports:
- 8211:8211/udp
- 27015:27015/udp
environment:
PUID: 1000
PGID: 1000
PORT: 8211
PLAYERS: 8
MULTITHREADING: true
RCON_ENABLED: true
RCON_PORT: 25575
SERVER_PASSWORD: "yourpasswordhere"
REST_API_ENABLED: true
TZ: "America/Chicago"
ADMIN_PASSWORD: "youradminpasswordhere"
COMMUNITY: true
IS_MULTIPLAY: true
PUBLIC_IP: "YOUR.PUBLIC.IP.HERE"
PUBLIC_PORT: 8211
QUERY_PORT: 27015
SERVER_NAME: "Your Server Name"
CROSSPLAY_PLATFORMS: "(Steam,Xbox,PS5,Mac)"
AUTO_UPDATE_ENABLED: false
BACKUP_ENABLED: true
BACKUP_CRON_EXPRESSION: "30 3 * * *"
AUTO_REBOOT_ENABLED: true
AUTO_REBOOT_CRON_EXPRESSION: "35 3 * * *"
AUTO_REBOOT_WARN_MINUTES: 5
volumes:
- ./palworld:/palworld/
IS_MULTIPLAY is the setting almost every guide skips Without it, the server runs fine and direct-connect works perfectly — but it will never appear in the community browser, which is the only way console players can find it at all. This came from reading the image's actual source, not from any official doc.
QUERY_PORT is a second, separate port
Community-list registration uses 27015 independently of the game port
8211. Forgetting to forward it produces the exact same symptom:
joinable by IP, invisible in the browser.
Find your public IP for the PUBLIC_IP field:
curl ifconfig.me
Settings reference
| Setting | Value | Why it matters |
|---|---|---|
IS_MULTIPLAY | true | Required for community-list visibility. Undocumented elsewhere. |
COMMUNITY | true | Registers the server on the in-game browser at all. |
QUERY_PORT | 27015 | Separate port used specifically for community-list discovery. |
PUBLIC_IP | your public IP | Must be your real internet-facing address, not the Pi's LAN IP. |
REST_API_ENABLED | true | Required for AUTO_REBOOT_ENABLED to function — silently no-ops without it. |
CROSSPLAY_PLATFORMS | (Steam,Xbox,PS5,Mac) | Controls which platforms can see/join. |
First boot
docker compose up -d
docker logs -f palworld-server
First launch downloads the actual game server files through Steam — several gigabytes, so expect a few minutes depending on your connection. Once it's ready, the log ends with:
Running Palworld dedicated server on :8211
Confirm it's healthy and both ports are published:
docker ps
Router port forwarding
Open two UDP ports as static rules in your router's admin UI — not UPnP.
Why not UPnP UPnP-added mappings can silently disappear if the router's settings are ever reset or resaved. A manually configured rule persists through that.
| Service | Protocol | External port | Internal port |
|---|---|---|---|
| Palworld | UDP | 8211 | 8211 |
| Palworld Query | UDP | 27015 | 27015 |
Point both at your Pi's LAN IP, and while you're in the router UI, set a DHCP reservation for that IP against the Pi's MAC address so the forward never silently breaks.
Verify it's reachable
Reliability extras
Already included in the compose file above, worth understanding why:
- Nightly backup —
BACKUP_ENABLED+BACKUP_CRON_EXPRESSION - Nightly restart — Unreal Engine dedicated servers can silently hang after roughly a day of continuous uptime. A scheduled restart during a dead hour prevents it before it happens to you mid-session.
- Timezone — the reboot cron runs in the container's configured
TZ, not necessarily your local time. Double-check it matches where you live.