-
Notifications
You must be signed in to change notification settings - Fork 0
Server Installation
This guide covers installing and configuring the PZO Server Engine (PZOServerEngine.jar) on dedicated servers, virtual private servers (VPS), and 3rd-party game server control panels.
Supported hosts include: Pterodactyl Panels, Docker containers, Indifferent Broccoli, G-Portal, Nitrado, GTXGaming, BisectHosting, Hetzner, OVH, and Windows Server.
Running a dedicated Project Zomboid server with 10-64+ players often causes:
- Multiplayer Rubberbanding: High-speed driving or horde combat causes UDP datagram drops and player desync.
-
Periodic Server Freezes: World auto-saves to SQLite databases (
players.db,vehicles.db) and map chunk files pause the main game loop. - CPU Bottlenecks: Vanilla zombie pathfinding and simulation run mostly on a single tick thread.
PZOServerEngine.jar resolves these bottlenecks through off-heap direct Netty memory buffer pooling, 4096 UDP datagram sockets, multi-threaded ForkJoinPool zombie simulation, and 256KB asynchronous disk write buffering.
Using your hosting panel's File Manager or an SFTP/FTP client (FileZilla / WinSCP):
- Download
PZOServerEngine.jarfrom the latest release on GitHub. - Upload
PZOServerEngine.jarinto your server's root directory (the folder containingProjectZomboid64.jsonorprojectzomboid.jar).
Open ProjectZomboid64.json in your host's File Manager:
-
CRITICAL FOR LINUX / PTERODACTYL: Keep
"mainClass": "zombie/network/GameServer"untouched!Why? The native Linux launcher binary (
ProjectZomboid64) checks ifmainClassmatches"zombie/network/GameServer". IfmainClassis changed, the binary assumes it is booting a desktop client and triggers a failingSteamAPI_Init()check that crashes the server before Java starts. - Add
"-javaagent:PZOServerEngine.jar"to the top of the"vmArgs"array.
{
"mainClass": "zombie/network/GameServer",
"classpath": [
"java/.",
"java/projectzomboid.jar"
],
"vmArgs": [
"-javaagent:PZOServerEngine.jar",
"-Djava.awt.headless=true",
"-Xmx8192m",
"-Dzomboid.server=1",
"-Dzomboid.steam=1",
"-Dzomboid.znetlog=1",
"-Djava.library.path=linux64/",
"-Djava.security.egd=file:/dev/urandom",
"-XX:+UseZGC",
"-XX:-OmitStackTraceInFastThrow",
"-XX:+UseCompactObjectHeaders",
"-XX:+UseStringDeduplication",
"-XX:+PerfDisableSharedMem",
"-XX:+DisableExplicitGC",
"-XX:+ExitOnOutOfMemoryError"
]
}- Save the file and restart your server from your host web panel.
On headless Linux servers and Docker containers, Steamworks native libraries require proper location linking:
-
steam_appid.txt: Ensure a file namedsteam_appid.txtexists in your server root directory containing the text:108600 -
steamclient.soAutomatic Resolution:PZOServerEngine.jarincludes a built-inLinuxSteamServerSanitizerthat scans/home/container/,/home/steam/, andlinux64/, automatically pre-loadingsteamclient.soand creating the required symlink at~/.steam/sdk64/steamclient.so. -
Manual Fallback Command (if your host blocks automatic symlinking):
In your server terminal or startup command, run:
mkdir -p ~/.steam/sdk64 && cp -f linux64/steamclient.so ~/.steam/sdk64/
Match your -Xms (minimum heap) and -Xmx (maximum heap) parameters to your server hosting plan:
| Server Host Plan | Recommended -Xms
|
Recommended -Xmx
|
Player Capacity |
|---|---|---|---|
| 4 GB Plan | -Xms1536m |
-Xmx3584m |
1 - 4 Players |
| 6 GB Plan | -Xms2048m |
-Xmx5120m |
4 - 8 Players |
| 8 GB Plan | -Xms2048m |
-Xmx7168m |
8 - 16 Players |
| 16 GB Plan | -Xms4096m |
-Xmx14336m |
16 - 32 Players |
| 32 GB+ Dedicated | -Xms8192m |
-Xmx28672m |
32 - 64+ Players |
Important: Never allocate 100% of your container's RAM to
-Xmx. Always reserve at least 512MB to 1GB for the operating system, off-heap Netty direct memory buffers, and native C++ libraries (RakNet, FMOD, SQLite). If the container exceeds its RAM limit, the host (e.g. Pterodactyl Wings) will kill the process (OOMKilled).
PZOServerEngine.jar runs a lightweight, low-priority background daemon that updates pzo_server_telemetry.json every 5 seconds inside your server's Zomboid/Lua/ directory.
{
"server_optimized": true,
"max_mb": 8192,
"used_mb": 2410,
"free_mb": 5782,
"gc_count": 14,
"gc_pause_avg_ms": 1,
"threads": 42,
"cpu_percent": 18.5,
"timestamp": 1725807600000
}Server administrators can write simple Discord bots or shell scripts to tail this file and monitor server health, active threads, and garbage collection pauses in real time.