Skip to main contentSkip to navigation
[email protected]
Client AreaSupport
Hosting Mammoth
HostingMammothYour Data, Our Responsibility
Home
Solutions
Hosting Services
Store
Pricing
About
Blog
API
Contact

Stay Ahead of the Curve

Get the latest insights on cybersecurity, AI innovations, and enterprise data solutions delivered to your inbox.

Hosting Mammoth
HostingMammothEnterprise Solutions

Enterprise-grade data solutions. Hosting, recovery, cybersecurity, and AI-powered services for businesses worldwide.

[email protected]
Sun - Fri, 9:00am - 5:00pm

Services

  • Cloud Hosting
  • Data Recovery
  • Cybersecurity
  • Legal Support
  • MSP Services
  • Web Development
  • AI Services
  • Free Server Migration

Hosting

  • VPS Hosting (NVMe SSD)
  • VDS Hosting (NVMe)
  • Storage VPS (High SSD)
  • GPU Servers
  • Managed Services
  • Cloud Firewall
  • Load Balancer
  • One-Click Apps
  • n8n Hosting
  • Object Storage
  • FAQ

Company

  • Store
  • Pricing
  • About Us
  • Locations
  • Blog
  • Testimonials
  • Contact
  • Affiliate Program
  • White-Label
  • Terms of Service
  • Privacy Policy
  • Browser Cookies
  • SLA

Support

  • Client Area
  • Submit Ticket
  • Knowledge Base
  • Server Status
  • API Documentation

© 2026 Hosting Mammoth. All rights reserved.

Knowledge Base
Getting StartedAccount ManagementVPS HostingGPU ServersStorage VPSCloud FirewallLoad BalancerServer ManagementBilling & PaymentsSupport & TicketsAffiliate ProgramReseller ProgramMarketplace & Appsn8n HostingManaged ServicesServer MigrationAPI & DevelopersSecurityTroubleshootingGlossaryInstall Guides
  1. Home
  2. /
  3. Support
  4. /
  5. Install Guides
  6. /
  7. How To Install Project Zomboid Server Ubuntu
GUIDEInstall Guides

How to Install Project Zomboid Dedicated Server on Ubuntu 24.04

25 min read

How to Install Project Zomboid Dedicated Server on Ubuntu 24.04

Project Zomboid is the isometric zombie survival game where the only real victory condition is "this is how you died." The multiplayer experience, however, is where the game truly lives -- surviving with friends through months of in-game time, fortifying a Louisville safehouse, and cooperatively losing everything to a single horde. Running your own dedicated server on a Linux VPS gives you 24/7 availability, complete control over sandbox rules, unlimited Workshop mods, and far better performance than hosting from a gaming PC over a home connection.

This tutorial walks you through installing and configuring a Project Zomboid dedicated server on Ubuntu 24.04, from SteamCMD setup to a production systemd service with automated backups. Expect to finish in about 35 minutes.

Table of Contents

  • Why Self-Host a Project Zomboid Server?
  • Prerequisites
  • Step 1: Update System Packages
  • Step 2: Create a Dedicated steam User
  • Step 3: Install SteamCMD
  • Step 4: Install Project Zomboid (App 380870)
  • Step 5: Configure Memory in start-server.sh
  • Step 6: Open UDP Ports 16261 and 16262
  • Step 7: First Launch and Admin Password
  • Step 8: Edit servertest.ini
  • Step 9: Add Workshop Mods
  • Step 10: Tune Sandbox Options
  • Step 11: Manage the Whitelist
  • Step 12: Create a systemd Service
  • Step 13: Automate Backups with rsync
  • FAQ
  • Next Steps
  • Why Self-Host a Project Zomboid Server?

    Paid Project Zomboid hosting providers typically charge EUR 15-25 per month for a 4-slot server with limited RAM and shared CPU -- and they often throttle mod counts, restrict file access, or charge extra for scheduled backups. Running your own server on a general-purpose VPS flips that equation.

    • Roughly 70% cost savings -- A CloudCore Professional VPS at EUR 19.99/month gives you a full 8 vCPU / 12 GB RAM box that comfortably handles 4-8 players and hundreds of Workshop mods. The same experience from a dedicated PZ host would cost EUR 50-70/month.
    • Full mod control -- You can install any Workshop mod, any custom map, any server-side patch. No mod-slot limits, no allowlists, no "premium mod" upsells.
    • Full file system access -- Edit servertest.ini, sandbox.lua, and any mod config directly over SSH. Push changes in seconds instead of waiting for a web-panel save cycle.
    • Better hardware per euro -- General-purpose VPS providers compete on raw specs. Game-host control panels are expensive to build, so those providers pass that cost to you through weaker hardware.
    • Run more than PZ on the same box -- Your Ubuntu VPS is not locked to a single game. Stack a TeamSpeak or Mumble server, a Discord bot, and a web status page on the same machine.
    • Keep save data forever -- When you cancel a paid host, your save is gone. On your own VPS, the Zomboid world directory is just a folder -- back it up, archive it, move it to a new server any time.

    Cost Comparison: Self-Hosted vs. Paid PZ Hosting

    ScenarioPaid PZ Host (4-slot)Paid PZ Host (8-slot)Self-Hosted on CloudCore Professional
    Monthly cost~EUR 15-25~EUR 35-60EUR 19.99
    RAM3-4 GB (often capped)6-8 GB12 GB (full)
    CPUShared / 1 vCPUShared / 2 vCPU8 vCPU dedicated
    ModsSometimes limitedSometimes limitedUnlimited
    File accessWeb panel onlyWeb panel + FTPFull SSH + sudo
    BackupsExtra feeExtra feeFree (rsync + cron)
    Run other servicesNoNoYes
    For a group of 4-6 friends who want a persistent world that survives across patches and playstyles, self-hosting pays for itself within the first month.

    Prerequisites

    Before you begin, make sure you have:

    • A VPS running Ubuntu 24.04 LTS with root or sudo access
    • SSH access to your server (PuTTY on Windows, or the built-in terminal on macOS/Linux)
    • At least 4 GB of RAM for a 2-4 player server with a modest mod list (8 GB+ recommended for 4-8 players or heavy mods)
    • At least 10 GB of free disk space for the server, save data, and a few backup rotations
    • A Steam account (Project Zomboid's dedicated server is free and does not require a logged-in Steam account with SteamCMD's anonymous mode)
    Recommended Plan: CloudCore Professional
    >
    For a 4-player server with a curated Workshop mod list, we recommend the Professional VPS plan:
    >
    - 8 vCPU cores
    - 12 GB RAM
    - 100 GB NVMe SSD
    - Unmetered bandwidth
    - EUR 19.99/month
    >
    This gives you enough RAM headroom for Project Zomboid's JVM (4-8 GB), the OS, and any supporting services (Discord relay bots, map viewers, monitoring). Smaller groups of 2-3 players can run comfortably on a CloudCore Professional plan with 6-8 GB RAM.

    Connect to your server via SSH to get started:

    bash
    ssh root@your-server-ip

    Step 1: Update System Packages

    Start by refreshing the package index and applying any pending updates. SteamCMD pulls in 32-bit libraries that need current dependency resolution, so running apt update first avoids the most common install errors.

    bash
    sudo apt update && sudo apt upgrade -y

    Enable the multiverse and i386 architectures, which are required for SteamCMD:

    bash
    sudo add-apt-repository multiverse -y
    sudo dpkg --add-architecture i386
    sudo apt update

    If your kernel was updated, reboot before continuing:

    bash
    sudo reboot

    Step 2: Create a Dedicated steam User

    Never run a game server as root. Create a non-privileged steam user that will own all Project Zomboid files and run the service.

    bash
    sudo useradd -m -s /bin/bash steam
    sudo passwd steam

    Set a strong password when prompted. From here on, all Project Zomboid commands are run as this user. Switch into the account:

    bash
    sudo -iu steam

    Your prompt should now show steam@your-hostname:~$. Confirm the home directory:

    bash
    pwd

    Expected output:

    text
    /home/steam

    Step 3: Install SteamCMD

    Exit back to your sudo user briefly to install the steamcmd package:

    bash
    exit

    Install SteamCMD from the multiverse repository:

    bash
    sudo apt install -y steamcmd

    You will be prompted to accept the Steam Subscriber Agreement -- use Tab to move to <Ok> and accept. The installer pulls in about 200 MB of 32-bit libraries (SteamCMD is still a 32-bit binary).

    Switch back to the steam user:

    bash
    sudo -iu steam

    Create a symlink so steamcmd is easily callable from the home directory:

    bash
    ln -s /usr/games/steamcmd ~/steamcmd

    Verify SteamCMD runs:

    bash
    ~/steamcmd +quit

    On first run, SteamCMD will self-update and exit. Expected output (abbreviated):

    text
    Redirecting stderr to '/home/steam/Steam/logs/stderr.txt'
    [  0%] Checking for available updates...
    [----] Verifying installation...
    Steam Console Client (c) Valve Corporation - version 1712712388
    -- type 'quit' to exit --
    Loading Steam API...OK

    Step 4: Install Project Zomboid (App 380870)

    Project Zomboid Dedicated Server is Steam app ID 380870 and is available for anonymous download -- you do not need to log in with your Steam account credentials.

    Install the server into ~/pzserver:

    bash
    ~/steamcmd +force_install_dir /home/steam/pzserver \
      +login anonymous \
      +app_update 380870 validate \
      +quit

    Expected output (abbreviated):

    text
    Connecting anonymously to Steam Public...OK
    Waiting for client config...OK
    Waiting for user info...OK
     Update state (0x3) reconfiguring, progress: 0.00 (0 / 0)
     Update state (0x61) downloading, progress: 12.34 (145829632 / 1181392896)
     ...
    Success! App '380870' fully installed.

    The download is approximately 1.2 GB and takes 1-3 minutes on a VPS with good bandwidth. Verify the server files:

    bash
    ls ~/pzserver/

    Expected output:

    text
    java          linux64           ProjectZomboid32  start-server.sh
    jre64         natives           ProjectZomboid64  steamapps
    licenses      projectzomboid    ProjectZomboid64.json

    The two key files are start-server.sh (the launcher) and ProjectZomboid64.json (JVM configuration).

    Step 5: Configure Memory in start-server.sh

    Project Zomboid runs on the JVM, and its memory usage is controlled by the -Xmx flag (maximum heap size). The default is conservative -- if you host more than 2 players or use mods, you need to raise it.

    Edit ProjectZomboid64.json, which is where the JVM flags actually live on modern builds:

    bash
    nano ~/pzserver/ProjectZomboid64.json

    Find the vmArgs line and change -Xmx to match your VPS. For a 12 GB Professional plan with 4-6 players and mods, allocate 8 GB:

    json
    {
        "mainClass": "zombie/network/GameServer",
        "classpath": [
            "java/.",
            "java/istack-commons-runtime.jar",
            "java/jassimp.jar",
            "java/javacord-2.0.17-shaded.jar",
            "java/javax.annotation-api.jar",
            "java/jaxb-api.jar",
            "java/jaxb-runtime.jar",
            "java/lwjgl.jar",
            "java/lwjgl-natives-linux.jar",
            "java/lwjgl_util.jar",
            "java/sqlite-jdbc-3.27.2.1.jar",
            "java/trove-3.0.3.jar",
            "java/uncommons-maths-1.2.3.jar"
        ],
        "vmArgs": [
            "-Djava.awt.headless=true",
            "-Xms8g",
            "-Xmx8g",
            "-Dzomboid.steam=1",
            "-Dzomboid.znetlog=1",
            "-XX:+UseZGC",
            "-XX:-OmitStackTraceInFastThrow"
        ]
    }

    Save with Ctrl+O, Enter, then Ctrl+X to exit.

    Memory Sizing Reference

    PlayersMod LoadRecommended -XmxRecommended VPS RAM
    1-2Vanilla / light mods3 GB4 GB plan
    2-4Moderate (10-30 mods)5 GB6-8 GB plan
    4-6Heavy (30-60 mods)8 GB12 GB Professional
    6-10Heavy + custom map12 GB16 GB+ plan
    10+Everything + custom map16 GB+24 GB+ plan
    Always leave at least 2-3 GB of RAM free for the OS and file cache. Setting -Xmx higher than your available RAM will trigger the Linux OOM killer and crash the server mid-session.

    Step 6: Open UDP Ports 16261 and 16262

    Project Zomboid uses two UDP ports:

    • 16261/udp -- Steam/RakNet query and connection port
    • 16262/udp -- Game traffic (joined at runtime for each connected client)
    Both must be reachable from the internet. Exit to your sudo user and configure UFW:

    bash
    exit
    sudo ufw allow 22/tcp comment 'SSH'
    sudo ufw allow 16261/udp comment 'PZ query'
    sudo ufw allow 16262/udp comment 'PZ game'
    sudo ufw enable
    sudo ufw status

    Expected output:

    text
    Status: active

    To Action From -- ------ ---- 22/tcp ALLOW Anywhere 16261/udp ALLOW Anywhere 16262/udp ALLOW Anywhere

    If your VPS provider also has an external firewall (most do), open the same UDP ports there as well.

    Step 7: First Launch and Admin Password

    Switch back to the steam user and run the server for the first time. This initial launch generates the default config files and prompts you to set an admin password.

    bash
    sudo -iu steam
    cd ~/pzserver
    ./start-server.sh

    Expected output (abbreviated):

    text
    64-bit java detected
    Setting breakpad minidump AppID = 108600
    Enter a new Administrator password for this server:

    Enter a strong password, then re-enter it to confirm. The server will then finish booting:

    text
    Admin password set.
    Server Steam ID 90145209012345678
    LuaNet: initialization...
    Loading: /home/steam/Zomboid/Server/servertest.ini
    Loading: /home/steam/Zomboid/Server/servertest_SandboxVars.lua
    Server is listening on port 16261
     SERVER STARTED *

    At this point the server is running in the foreground. Press Ctrl+C (or type quit and hit Enter) to cleanly shut it down before editing the config in the next step.

    All server data lives at /home/steam/Zomboid/ -- not inside ~/pzserver/. This is by design: game files are replaceable via SteamCMD, while your world, config, and mods persist separately.

    Step 8: Edit servertest.ini

    servertest.ini is the master config file. Open it:

    bash
    nano ~/Zomboid/Server/servertest.ini

    Key settings to review and change:

    ini
    PublicName=My Zomboid Server
    PublicDescription=A CloudCore-hosted PZ server running on Ubuntu 24.04
    Public=true
    Open=true
    PingLimit=400
    MaxPlayers=8
    AutoCreateUserInWhiteList=false
    DisplayUserName=true
    SpawnPoint=0,0,0
    SafetySystem=true
    ShowSafety=true
    SafetyToggleTimer=2
    SafetyCooldownTimer=3
    SpawnItems=
    DefaultPort=16261
    UDPPort=16262
    ResetID=572058526
    Mods=
    Map=Muldraugh, KY
    PauseEmpty=true
    GlobalChat=true
    ChatStreams=s,r,a,w,y,sh,f,all
    LogLocalChat=false
    AnnounceDeath=false
    MinutesPerPage=1.0
    SaveWorldEveryMinutes=30
    PlayerSafehouse=true
    AdminSafehouse=false
    SafehouseAllowTrepass=true
    SafehouseAllowFire=true
    SafehouseAllowLoot=true
    SafehouseAllowRespawn=true
    SafehouseDaySurvivedToClaim=0
    SafeHouseRemovalTime=144
    SafehouseAllowNonResidential=false
    AllowDestructionBySledgehammer=true
    KickFastPlayers=false
    ServerPlayerID=
    RCONPort=27015
    RCONPassword=
    DiscordEnable=false
    DiscordToken=
    DiscordChannel=
    DiscordChannelID=
    Password=
    MaxAccountsPerUser=0

    Most important fields for a small friends-only server:

    • PublicName -- Shown in the server browser.
    • Password -- Set this to require a password to join. Leave empty for open access (you should still use the whitelist).
    • MaxPlayers -- Match your RAM budget (see memory table above).
    • PauseEmpty=true -- Pauses world time when nobody is online; saves CPU and keeps the world "fresh" for casual groups.
    • SaveWorldEveryMinutes=30 -- Lowering this to 15 or 20 is safer; higher values mean more progress lost on a crash.
    • Public=true -- Lists the server publicly. Set to false for an invite-only server (players can still join via direct IP).
    • Open=true -- Allows anyone to join if they have the password. Set to false to require the whitelist.
    • RCONPassword -- Set this to enable remote console access via RCON (useful for web panels).
    Save and exit.

    Step 9: Add Workshop Mods

    Workshop mods are defined by two ID types:

    • Workshop ID -- The numeric Steam Workshop item ID (from the URL).
    • Mod ID -- The internal name used by the game; often different from the Workshop ID.
    You declare Workshop IDs in WorkshopItems= so the server downloads them, and Mod IDs in Mods= so the game activates them. Some Workshop items contain multiple mods, each with its own Mod ID.

    Open servertest.ini again:

    bash
    nano ~/Zomboid/Server/servertest.ini

    Find (or add) these two lines near the Mods= line:

    ini
    Mods=ModManager;ModManagerServer;BetterSortCC;Autotsar_Trailers_Nomads
    WorkshopItems=2169435993;2685168362;2313387159;2289429759

    Separate multiple entries with semicolons. To find the correct IDs for a mod:

  • Open the mod on the Steam Workshop.
  • The Workshop ID is the number at the end of the URL (for example, 2169435993 in ?id=2169435993).
  • On the mod's description page, the author usually lists the Mod ID (sometimes called "ModID:") -- copy it exactly, including capitalization.
  • Save the file. When the server next starts, SteamCMD will automatically pull every Workshop ID listed and place the mod files under ~/Zomboid/Workshop/ and ~/pzserver/steamapps/workshop/content/108600/.

    Map Mods

    If a Workshop mod adds a new map (for example, Bedford Falls or Raven Creek), update the Map= line to chain it with Muldraugh, KY:

    ini
    Map=BedfordFalls;Muldraugh, KY

    The order matters: the first map listed is the primary spawn map.

    Step 10: Tune Sandbox Options

    Sandbox options (zombie population, loot rarity, day length, etc.) live in a separate Lua file:

    bash
    nano ~/Zomboid/Server/servertest_SandboxVars.lua

    This file is a Lua table. Common settings to adjust:

    lua
    VERSION = 5,
    Zombies = 3,               -- 1=Insane, 2=Very High, 3=Normal, 4=Low
    Distribution = 1,          -- 1=Urban Focused, 2=Uniform
    DayLength = 3,             -- 1=15min, 2=30min, 3=1hr, 4=2hr, ...
    StartYear = 1,
    StartMonth = 7,
    StartDay = 9,
    StartTime = 2,             -- 1=7AM, 2=9AM, 3=12PM, ...
    WaterShut = 2,             -- 1=Instant, 2=0-30 days, ...
    ElecShut = 2,
    FoodLoot = 3,              -- 1=None, 2=Extremely Rare, 3=Rare, 4=Normal, 5=Abundant
    WeaponLoot = 3,
    OtherLoot = 3,
    Temperature = 3,
    Rain = 3,
    ErosionSpeed = 3,          -- 1=Very Fast (20d), 2=Fast (50d), 3=Normal (100d), ...
    XpMultiplier = 1.0,
    ZombieAttractionMultiplier = 1.0,
    VehicleEasyUse = false,
    Farming = 3,
    CompostTime = 2,
    StatsDecrease = 3,
    NatureAbundance = 3,
    Alarm = 4,
    LockedHouses = 6,
    FoodRotSpeed = 3,
    FridgeFactor = 3,
    LootRespawn = 1,           -- 1=None, 2=Every day, 3=Every week, 4=Every month
    SeenHoursPreventLootRespawn = 0,
    TimeSinceApo = 1,          -- 1=0 days, 2=1 month, 3=2 months, ...
    PlantResilience = 3,
    PlantAbundance = 3,
    EndRegen = 3,

    Common "sweet spots" for a 4-player co-op server:

    • Zombies = 3 (Normal) -- Enough threat to matter, not overwhelming in cities.
    • DayLength = 3 (1 hour) -- Gives time to accomplish something per day without dragging.
    • WaterShut = 2 / ElecShut = 2 -- 0-30 day grace period creates urgency without instant doom.
    • LootRespawn = 3 (Every week, with SeenHoursPreventLootRespawn = 24) -- Prevents permanent depletion on long-running servers.
    Save and exit.

    Step 11: Manage the Whitelist

    If you set Open=false in servertest.ini, only whitelisted players can join. Manage the list with the in-game admin console or via the server console while running.

    From the server console (press Enter to get a prompt while the server is running):

    text
    adduser "PlayerName" "theirpassword"

    Other useful commands:

    text
    # List current players
    players

    Kick a player

    kickuser "PlayerName"

    Ban a player by Steam ID

    banid 76561198012345678

    Grant admin

    setaccesslevel "PlayerName" admin

    Send a server-wide message

    servermsg "Server restart in 5 minutes"

    Save the world now (before planned restart)

    save

    Graceful shutdown (saves then exits)

    quit

    User accounts are stored in a SQLite database at ~/Zomboid/db/servertest.db. You can back this file up directly to preserve accounts across reinstalls.

    Step 12: Create a systemd Service

    Running the server in a terminal with ./start-server.sh is fine for testing, but for a real deployment you want it to auto-start on boot, restart after crashes, and be controllable with systemctl.

    Exit to your sudo user:

    bash
    exit

    Create the service file:

    bash
    sudo nano /etc/systemd/system/pzserver.service

    Paste the following:

    ini
    [Unit]
    Description=Project Zomboid Dedicated Server
    After=network-online.target
    Wants=network-online.target

    [Service] Type=simple User=steam Group=steam WorkingDirectory=/home/steam/pzserver ExecStart=/home/steam/pzserver/start-server.sh Restart=on-failure RestartSec=15 TimeoutStopSec=90 KillSignal=SIGINT LimitNOFILE=100000

    Hardening

    NoNewPrivileges=true PrivateTmp=true ProtectSystem=strict ReadWritePaths=/home/steam

    [Install] WantedBy=multi-user.target

    Save and exit. Reload systemd, enable the service, and start it:

    bash
    sudo systemctl daemon-reload
    sudo systemctl enable pzserver
    sudo systemctl start pzserver

    Check status:

    bash
    sudo systemctl status pzserver

    Expected output:

    text
    ● pzserver.service - Project Zomboid Dedicated Server
         Loaded: loaded (/etc/systemd/system/pzserver.service; enabled; preset: enabled)
         Active: active (running) since Thu 2026-04-16 12:00:00 UTC; 30s ago
       Main PID: 4567 (start-server.s)
          Tasks: 82 (limit: 14236)
         Memory: 4.8G
            CPU: 12.345s
         CGroup: /system.slice/pzserver.service
                 ├─4567 /bin/bash /home/steam/pzserver/start-server.sh
                 └─4612 ./ProjectZomboid64 -Djava.awt.headless=true -Xms8g -Xmx8g ...

    Tail the live server log:

    bash
    sudo journalctl -u pzserver -f

    The service will now:

    • Start automatically on boot.
    • Restart within 15 seconds if the server crashes.
    • Send SIGINT on stop, which Project Zomboid handles as a clean "save then quit."
    • Give the server up to 90 seconds to finish saving before a forced kill.
    To stop, start, or restart:

    bash
    sudo systemctl stop pzserver
    sudo systemctl start pzserver
    sudo systemctl restart pzserver

    Step 13: Automate Backups with rsync

    Project Zomboid's save format is a set of flat files under /home/steam/Zomboid/Saves/Multiplayer/servertest/. Losing that directory means losing the entire world, so scheduled backups are non-negotiable.

    Create a backup directory:

    bash
    sudo mkdir -p /var/backups/pzserver
    sudo chown steam:steam /var/backups/pzserver

    Create a backup script:

    bash
    sudo -iu steam
    nano ~/backup-pz.sh

    Paste:

    bash
    #!/bin/bash
    set -euo pipefail

    SRC="/home/steam/Zomboid" DEST="/var/backups/pzserver" TIMESTAMP=$(date +%Y%m%d-%H%M%S) KEEP_DAYS=7

    mkdir -p "${DEST}"

    Incremental rsync snapshot with hard links

    rsync -a --delete \ --link-dest="${DEST}/latest" \ "${SRC}/" "${DEST}/snapshot-${TIMESTAMP}/"

    Update "latest" symlink

    rm -f "${DEST}/latest" ln -s "snapshot-${TIMESTAMP}" "${DEST}/latest"

    Prune snapshots older than KEEP_DAYS

    find "${DEST}" -maxdepth 1 -name 'snapshot-*' -type d -mtime +${KEEP_DAYS} -exec rm -rf {} \;

    echo "[$(date)] Backup complete: snapshot-${TIMESTAMP}"

    Save and make it executable:

    bash
    chmod +x ~/backup-pz.sh

    Test it once:

    bash
    ~/backup-pz.sh

    You should see a new snapshot-YYYYMMDD-HHMMSS directory under /var/backups/pzserver/ and a latest symlink pointing at it. Because rsync uses --link-dest, each snapshot is a full picture of the world but only stores disk blocks that have changed since the previous snapshot -- seven days of backups typically consumes less than 2x the size of a single save.

    Schedule it via cron. Still as the steam user:

    bash
    crontab -e

    Add this line to run every 6 hours:

    text
    0 /6    /home/steam/backup-pz.sh >> /home/steam/backup-pz.log 2>&1

    Save and exit. For offsite backups, add a second line that pushes the latest snapshot to remote storage (S3, Backblaze B2, or another VPS via SSH):

    text
    30 3   * rsync -az --delete /var/backups/pzserver/latest/ backups@remote-host:/pz-offsite/

    FAQ

    How much RAM does a Project Zomboid server actually need?

    Base memory for a vanilla server with 2 players is about 2-3 GB. Each additional player adds roughly 200-400 MB depending on how much of the map they have loaded. Mods are the biggest variable: a heavily modded server with 40-60 Workshop items easily doubles base memory. For a 4-player modded server, plan on 6-8 GB of JVM heap (-Xmx8g) on a VPS with at least 10-12 GB total RAM. The CloudCore Professional plan's 12 GB is the smallest comfortable size for this scenario.

    Do I need to log into Steam to host a Project Zomboid server?

    No. Project Zomboid's dedicated server (app 380870) is available through SteamCMD's anonymous login (+login anonymous). You do not need to buy a separate server license, and you do not need to tie the server to a personal Steam account. Your players, however, still need to own Project Zomboid to join.

    How do I update Project Zomboid after a game patch?

    Stop the service, re-run the SteamCMD update command, and start the service again:

    bash
    sudo systemctl stop pzserver
    sudo -iu steam ~/steamcmd +force_install_dir /home/steam/pzserver +login anonymous +app_update 380870 validate +quit
    sudo systemctl start pzserver

    All players must be on the matching game version -- Steam handles client-side updates automatically, but servers do not auto-update. Watch The Indie Stone's news feed for release announcements, and back up your world before running any major-version update.

    Why are my Workshop mods not loading?

    The most common cause is a mismatch between Workshop IDs and Mod IDs. The WorkshopItems= line tells SteamCMD what to download; the Mods= line tells the game what to activate. Verify each mod's internal Mod ID by either reading the mod's description on the Workshop page or checking the mod.info file inside ~/Zomboid/Workshop/<workshop_id>/mods/<mod_folder>/mod.info after first launch. Also confirm the mod supports the current game build -- mods broken by a Build 42+ update are a frequent failure mode.

    Can I migrate an existing Project Zomboid world to this server?

    Yes. Stop the service, copy your existing Zomboid/Saves/Multiplayer/servertest/ directory into /home/steam/Zomboid/Saves/Multiplayer/servertest/ (preserving ownership with chown -R steam:steam), copy over servertest.ini, servertest_SandboxVars.lua, and the servertest_spawnregions.lua file, then start the service. Make sure the mod list matches exactly -- a mod that exists in the save but is missing from the server's Mods= line will cause load failures.

    How many players can I realistically host?

    Project Zomboid's network code scales reasonably well up to about 16-20 concurrent players before CPU becomes the bottleneck. In practice, most self-hosted friends-only servers target 4-8 players. For larger populations, the CPU matters more than RAM -- a CloudCore Professional plan's 8 dedicated vCPU cores comfortably handle up to 10 concurrent players with a moderate mod list. Beyond that, look at 16+ vCPU plans or consider running the server at a higher zombie reset time to reduce CPU load.

    What is the best way to administer the server remotely?

    Three options, in order of simplicity:

  • SSH + journalctl -u pzserver -f -- Always available, no extra software. Use the server console (inputs passed via systemd) for admin commands.
  • RCON -- Set RCONPort=27015 and RCONPassword=... in servertest.ini, then connect from your desktop with a tool like mcrcon or rcon-cli. Useful for quick commands without a full SSH session.
  • A web panel -- Tools like Pterodactyl or AMP can wrap Project Zomboid in a web UI for less technical admins. These add significant complexity and are only worth it for multi-server operators.
  • Next Steps

    Now that your Project Zomboid server is running, consider these follow-ups to round out your self-hosted gaming stack:

    • Read the official server reference -- The community-maintained Project Zomboid Wiki dedicated server page documents every servertest.ini flag, every sandbox option, and every known quirk in exhaustive detail. Bookmark it.
    • Add a companion game server on the same VPS -- Your Professional plan has plenty of headroom for a second game server. Check out our guides on how to install a Rust game server on Ubuntu, how to install a Factorio dedicated server on Ubuntu, and how to install a Satisfactory dedicated server on Ubuntu.
    • Set up Discord relay -- Project Zomboid has built-in Discord webhook support via the DiscordEnable, DiscordToken, and DiscordChannelID fields in servertest.ini. Wire it up so in-game chat, deaths, and admin events post to your friend group's Discord server.
    • Monitor uptime -- Deploy Uptime Kuma on the same VPS and add a "Game (Steam)" monitor pointing at your public IP and port 16261/udp. You will get alerts the moment the server goes unreachable.
    • Offsite backups -- Add a second rsync target that pushes snapshots to a different VPS, S3, or Backblaze B2. One server's disk failure shouldn't end the campaign.

    Ready to Deploy?
    >
    Launch a Professional VPS in under 60 seconds and follow this tutorial end to end. 8 vCPU, 12 GB RAM, 100 GB NVMe, and unmetered bandwidth -- everything a 4-player modded Zomboid world needs.
    >
    Get Your Professional VPS Now -- Plans start at EUR 19.99/month.

    Was this article helpful?

    ← Back to Install GuidesBrowse all categories →

    Still have questions?

    Contact Support →Submit a Ticket