Project Zomboid Dedicated Server

Project Zomboid is a top-down survival game emphasizing cooperative multiplayer in a zombie-infested world. This guide covers complete server installation via SteamCMD, sandbox configuration, server setup, mod installation, admin tools, and backup strategies. Project Zomboid servers are efficient and support various gameplay configurations suitable for different player communities.

Table of Contents

System Requirements

Project Zomboid has modest requirements:

  • Ubuntu 20.04 LTS or later
  • 4GB RAM minimum (8GB recommended for 50+ players)
  • 40GB disk space
  • 2+ CPU cores
  • Stable internet connection
  • Root or sudo access

Project Zomboid is one of the lighter multiplayer game servers.

Installing SteamCMD and Project Zomboid

Install dependencies:

sudo apt-get update
sudo apt-get install -y curl wget file bzip2 gzip unzip python3 util-linux ca-certificates binutils lib32gcc1 lib32stdc++6

Create dedicated steam user:

sudo useradd -m -s /bin/bash steam
sudo -u steam mkdir -p /home/steam/steamcmd

Install SteamCMD:

cd /home/steam/steamcmd
sudo -u steam curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | sudo -u steam tar zxvf -

Verify SteamCMD:

sudo -u steam /home/steam/steamcmd/steamcmd.sh +quit

Create Project Zomboid directory:

sudo -u steam mkdir -p /home/steam/zomboid

Install Project Zomboid server (app ID 380870):

sudo -u steam /home/steam/steamcmd/steamcmd.sh \
    +force_install_dir /home/steam/zomboid \
    +login anonymous \
    +app_update 380870 \
    +quit

Verify installation:

ls -la /home/steam/zomboid/
file /home/steam/zomboid/ProjectZomboid64
chmod +x /home/steam/zomboid/ProjectZomboid64

Create data directories:

sudo -u steam mkdir -p /home/steam/zomboid-data/{Saves,Mods,logs}

Server Installation

Create startup script:

sudo tee /home/steam/zomboid/start_server.sh > /dev/null <<'EOF'
#!/bin/bash

GAME_DIR="/home/steam/zomboid"
DATA_DIR="/home/steam/zomboid-data"
SERVER_NAME="${SERVER_NAME:-Project Zomboid Server}"
ADMIN_PASSWORD="${ADMIN_PASSWORD:-adminpass}"
GAME_PASSWORD="${GAME_PASSWORD:-}"
MAX_PLAYERS="${MAX_PLAYERS:-20}"
PORT="${PORT:-16261}"

cd "$GAME_DIR"

mkdir -p "$DATA_DIR/Saves"
mkdir -p "$DATA_DIR/logs"

exec "$GAME_DIR/ProjectZomboid64" \
    -server \
    -servername "$SERVER_NAME" \
    -adminpassword "$ADMIN_PASSWORD" \
    -password "$GAME_PASSWORD" \
    -port "$PORT" \
    -maxplayers "$MAX_PLAYERS" \
    -cachedir "$DATA_DIR/Saves" \
    -logdir "$DATA_DIR/logs" \
    -modfolders "$DATA_DIR/Mods" \
    2>&1 | tee "$DATA_DIR/logs/zomboid_$(date +%Y%m%d).log"
EOF

sudo chmod +x /home/steam/zomboid/start_server.sh
sudo chown steam:steam /home/steam/zomboid/start_server.sh

Sandbox Configuration

Create sandbox.lua configuration for server rules:

sudo tee /home/steam/zomboid-data/Saves/sandbox.lua > /dev/null <<'EOF'
-- Project Zomboid Server Sandbox Configuration

function SandboxVars.GetVarType(var)
	-- Customizable sandbox variables for gameplay
	return 1
end

-- Access to safe zones
SafeZone = {
	xmin = 10000,
	xmax = 10100,
	ymin = 10000,
	ymax = 10100,
	zmin = 0,
	zmax = 4
}

-- Difficulty Settings
Difficulty = {
	ZombieHealthBoost = 0,            -- 0-4, zombie health multiplier
	ZombieDamageBoost = 0,            -- 0-4, zombie damage multiplier
	ZombieAggression = 2,             -- 0-4, zombie aggression level
	ZombieCount = 0.75,               -- 0.5-2.0, spawn rate multiplier
	ZombieRespawn = 16,               -- Hours before zombies respawn
	ZombieLore = "normal",            -- normal or sandbox
	ItemDespawn = 0,                  -- Days before items despawn
	ItemSpawnRules = 0,               -- Scavenging balance
	Injuries = 2,                     -- Injury level (0-2)
	BodyDamage = 2,                   -- Damage system (0-2)
	Diseases = 1,                     -- Disease chance (0-2)
	Hunger = 2,                       -- Hunger rate (0-3)
	Thirst = 2,                       -- Thirst rate (0-3)
	Fatigue = 2,                      -- Fatigue rate (0-3)
	Boredom = 0,                      -- Boredom effects (0-2)
	Stress = 2,                       -- Stress mechanics (0-2)
	Depression = 2,                   -- Depression effects (0-2)
	Radiation = 0,                    -- Radiation system
	NightVision = 0,                  -- Starting night vision
	NPCs = 2,                         -- NPC count (0-4)
	SleepWhenEmpty = 0,               -- Auto-sleep when empty
	AllowStats = 1,                   -- Allow stat tracking
	AllowDeathMessages = 1,           -- Show death messages
	AllowJoinWithoutPassword = 1,     -- Join without password
	AllowPvP = 1,                     -- Enable PvP
	AllowTreaties = 1,                -- Allow faction treaties
	AllowWaterShortsCache = 1,        -- Performance option
	DayLength = 1,                    -- Day length (0.5-4.0)
	DayStartHour = 8,                 -- Start hour of day
	SeasonLength = 30,                -- Season length in days
	ConstructionBoost = 1,            -- Building speed multiplier
	NightDarkness = 2,                -- Night darkness level
	NoFire = 0,                       -- Disable fire
	NoElectricity = 0,                -- Disable electricity
	NoWater = 0,                      -- Disable water
	StartYear = 1,                    -- Starting year
	StartMonth = 7,                   -- Starting month
	StartDay = 9,                     -- Starting day
}

-- Server Rules
ServerRules = {
	AllowPvP = true,
	AllowCheats = false,
	AllowWhitelistingMode = false,
	AllowNaming = true,
	AllowSlicing = true,
	RestrictRotten = false,
	RestrictFarming = false,
	RestrictBuildingStyle = false,
	AllowExtremeBlood = true,
	AllowLiteraryReferences = true,
}

-- Voice Communication
VoiceChat = {
	Enabled = true,
	VolumeThreshold = 1,
}

return Difficulty
EOF

sudo chown steam:steam /home/steam/zomboid-data/Saves/sandbox.lua

Difficulty explanation:

  • ZombieCount: 0.5 = half population, 2.0 = double population
  • ItemDespawn: Days before items disappear
  • Injuries: Enable/disable injury system
  • AllowPvP: Enable player vs player combat
  • DayLength: Multiplier for day/night cycle length
  • ConstructionBoost: Faster/slower building speed

Server Settings

Create ini-style server settings:

sudo tee /home/steam/zomboid-data/Saves/server.ini > /dev/null <<'EOF'
[ServerConfig]
ServerName=Project Zomboid Server
ServerDescription=Cooperative survival server
ServerPassword=
AdminPassword=adminpass
Port=16261
MaxPlayers=20
PingLimit=250
VehicleRespawnTime=1
VehiclesSpawnOnRoof=true
PublicServer=true
PublicServerName=
PublicAddress=
UseFileTransfer=true
BanlistPath=banlist.txt
AllowNonASCIICharacters=true
UnrestrictedLua=false
LogLocation=/home/steam/zomboid-data/logs
SaveLocation=/home/steam/zomboid-data/Saves
CacheDirPath=/home/steam/zomboid-data/Saves

[Mods]
EnableModsOnServer=true
ModsFolderPath=/home/steam/zomboid-data/Mods

[Voice]
VoiceEnabled=true
VoiceVolume=100

[Performance]
MaxNavMeshChunks=10000
NavMeshChunkSize=50
MaxNavMeshWaypoints=1000
EOF

sudo chown steam:steam /home/steam/zomboid-data/Saves/server.ini

Mod Installation

Create mods directory and install popular mods:

mkdir -p /home/steam/zomboid-data/Mods
cd /home/steam/zomboid-data/Mods

# Popular Project Zomboid mods (examples)
# Mods are typically downloaded from steam workshop or moddb

# You would download mod files and extract them here
# Structure: /Mods/ModName/mod.info and mod files

Create mod list file:

sudo tee /home/steam/zomboid-data/Saves/mods.txt > /dev/null <<'EOF'
# Project Zomboid Mod List
# One mod per line
# ExampleMod=true
EOF

sudo chown steam:steam /home/steam/zomboid-data/Saves/mods.txt

Admin Functions

Create admin management script:

sudo tee /home/steam/manage_zomboid.sh > /dev/null <<'EOF'
#!/bin/bash

RCON_COMMAND="${@:-help}"

# Project Zomboid admin commands via RCON

# Player commands
# /adduser username password adminlevel
# /removeuser username
# /changepwd username newpassword
# /kickuser username
# /banuser username banreason
# /unbanuser steamid
# /addwhitelist username
# /removewhitelist username
# /showhwid username

# Server commands
# /save - Force save world
# /stop - Shutdown server gracefully
# /quit - Force quit
# /reloadoptions - Reload config
# /grantadmin username
# /removeadmin username
# /addmod username
# /removemod username

# Message commands
# /msg username message
# /broadcast message
# /announce message

# Vehicle commands
# /respawnallvehicles - Respawn all vehicles
# /givevehicle username vehicletype

# Teleport
# /teleportto x y z
# /teleporttouser username

echo "Project Zomboid Admin Command: $RCON_COMMAND"
EOF

sudo chmod +x /home/steam/manage_zomboid.sh

Whitelist management:

sudo tee /home/steam/zomboid-data/Saves/whitelist.txt > /dev/null <<'EOF'
# Project Zomboid Whitelist
# One username per line
# player1
# player2
EOF

sudo chown steam:steam /home/steam/zomboid-data/Saves/whitelist.txt

Ban list management:

sudo tee /home/steam/zomboid-data/Saves/banlist.txt > /dev/null <<'EOF'
# Project Zomboid Ban List
# Format: SteamID64,Username,Reason,Duration
# 76561198000000000,PlayerName,Cheating,0
EOF

sudo chown steam:steam /home/steam/zomboid-data/Saves/banlist.txt

Firewall and Ports

Configure firewall:

# Game server port (TCP/UDP)
GAME_PORT=16261

# Steam query port
QUERY_PORT=16262

# Configure UFW
sudo ufw allow 16261/tcp
sudo ufw allow 16261/udp
sudo ufw allow 16262/udp

# For iptables
sudo iptables -A INPUT -p tcp --dport 16261 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 16261 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 16262 -j ACCEPT

# Verify
sudo ufw status numbered
sudo netstat -tulnp | grep -E "16261|16262"

Running with Systemd

Create systemd service:

sudo tee /etc/systemd/system/zomboid.service > /dev/null <<'EOF'
[Unit]
Description=Project Zomboid Dedicated Server
After=network.target
Wants=network-online.target

[Service]
Type=simple
User=steam
Group=steam
WorkingDirectory=/home/steam/zomboid
EnvironmentFile=/home/steam/zomboid/server.env

ExecStart=/home/steam/zomboid/start_server.sh

Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal

# Resource limits
LimitNOFILE=65536
LimitNPROC=4096

# Security
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/home/steam/zomboid-data

[Install]
WantedBy=multi-user.target
EOF

Create environment file:

sudo tee /home/steam/zomboid/server.env > /dev/null <<'EOF'
SERVER_NAME=Project Zomboid Server
ADMIN_PASSWORD=adminpass
GAME_PASSWORD=
MAX_PLAYERS=20
PORT=16261
EOF

sudo chown steam:steam /home/steam/zomboid/server.env
sudo chmod 600 /home/steam/zomboid/server.env

Enable and start:

sudo systemctl daemon-reload
sudo systemctl enable zomboid.service
sudo systemctl start zomboid.service
sudo systemctl status zomboid.service

Monitor logs:

sudo journalctl -u zomboid.service -f
tail -f /home/steam/zomboid-data/logs/zomboid_$(date +%Y%m%d).log

Backup Strategy

Create automated backup script:

sudo tee /home/steam/backup_zomboid.sh > /dev/null <<'EOF'
#!/bin/bash

DATA_DIR="/home/steam/zomboid-data"
BACKUP_DIR="$DATA_DIR/backups"
RETENTION_DAYS=30
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

mkdir -p "$BACKUP_DIR"

# Backup world saves
tar -czf "$BACKUP_DIR/zomboid_backup_${TIMESTAMP}.tar.gz" \
    -C "$DATA_DIR" Saves/ \
    2>/dev/null

if [ $? -eq 0 ]; then
    SIZE=$(du -sh "$BACKUP_DIR/zomboid_backup_${TIMESTAMP}.tar.gz" | awk '{print $1}')
    echo "[$(date)] Backup created: $SIZE"
else
    echo "[$(date)] Backup failed!" >&2
    exit 1
fi

# Cleanup old backups
find "$BACKUP_DIR" -name "zomboid_backup_*.tar.gz" -mtime +${RETENTION_DAYS} -delete
EOF

sudo chmod +x /home/steam/backup_zomboid.sh
sudo chown steam:steam /home/steam/backup_zomboid.sh

Schedule daily backups:

sudo tee -a /var/spool/cron/crontabs/steam > /dev/null <<'EOF'
0 2 * * * /home/steam/backup_zomboid.sh >> /home/steam/zomboid-data/logs/backup.log 2>&1
EOF

Restore backup:

sudo systemctl stop zomboid.service
BACKUP="/home/steam/zomboid-data/backups/zomboid_backup_20240101_020000.tar.gz"
sudo -u steam tar -xzf "$BACKUP" -C /home/steam/zomboid-data/
sudo systemctl start zomboid.service

Monitoring

Create monitoring script:

sudo tee /home/steam/monitor_zomboid.sh > /dev/null <<'EOF'
#!/bin/bash

echo "=== Project Zomboid Server Status ==="
echo ""

# Service status
if systemctl is-active --quiet zomboid.service; then
    echo "✓ Service is running"
else
    echo "✗ Service is NOT running"
    exit 1
fi

# Process info
PID=$(pgrep -f ProjectZomboid64)
if [ ! -z "$PID" ]; then
    MEM=$(ps -p $PID -o rss= | awk '{print $1/1024 " MB"}')
    CPU=$(ps -p $PID -o %cpu= | awk '{print $1 "%"}')
    echo "Memory: $MEM"
    echo "CPU: $CPU"
fi

# Port status
echo ""
if ss -tlnp | grep -q "16261"; then
    echo "✓ Game port 16261 listening"
else
    echo "✗ Game port not listening"
fi

# Disk usage
echo ""
USAGE=$(df -h /home/steam/zomboid-data | awk 'NR==2 {print $5}')
echo "Disk usage: $USAGE"

# Recent errors
echo ""
ERRORS=$(tail -20 /home/steam/zomboid-data/logs/zomboid_*.log 2>/dev/null | grep -i "error\|fatal" | wc -l)
echo "Recent errors: $ERRORS"

# Latest backup
echo ""
LATEST=$(ls -t /home/steam/zomboid-data/backups/zomboid_backup_*.tar.gz 2>/dev/null | head -1)
if [ ! -z "$LATEST" ]; then
    echo "Latest backup: $(basename $LATEST) - $(date -r $LATEST '+%Y-%m-%d %H:%M')"
fi
EOF

sudo chmod +x /home/steam/monitor_zomboid.sh

Update server:

sudo systemctl stop zomboid.service
sudo -u steam /home/steam/steamcmd/steamcmd.sh \
    +force_install_dir /home/steam/zomboid \
    +login anonymous \
    +app_update 380870 \
    +quit
sudo systemctl start zomboid.service

Conclusion

Your Project Zomboid dedicated server is now fully configured with sandbox settings, mod support, and administrative tools. Project Zomboid provides engaging cooperative survival gameplay with flexible configuration for various playstyles.

Key takeaways:

  • Configure sandbox settings to match your community's preferences
  • Use whitelist and banlist for community management
  • Implement regular automated backups
  • Monitor server performance (relatively lightweight)
  • Install mods carefully to avoid conflicts
  • Update server regularly for bug fixes and features
  • Use admin commands to maintain community standards

A well-maintained Project Zomboid server can support years of engaging cooperative zombie survival gameplay.