Manage your Project Zomboid dedicated server from one place: server controls, RCON, a live world map, Workshop mods, scheduled restarts, backups, and Discord integration.
At a glance — server status, RCON & PanelBridge connection state, live player activity, host telemetry, disk headroom, the next scheduled maintenance action, console error count, backup readiness, and quick actions. One screen covers 80% of routine admin work.
- What It Does
- Requirements
- Quick Start
- Setup
- PanelBridge
- Remote Access
- Security
- Development
- Community
- Server control — Start, stop, restart, save. Live status and uptime.
- Console — Live log viewer and RCON terminal with command history.
- Scheduling — Recurring restarts, saves, broadcasts with countdown warnings.
- Backups — Manual or scheduled world backups with configurable retention, snapshot preview, and download/upload of the raw archive. Restore takes an automatic safety backup first and warns it can't be undone.
- Roles & permissions — Capability-based access control: three built-in roles (admin, technician, moderator) plus fully custom ones, each granting an explicit subset of the panel's 28 individual capabilities across 12 areas (server lifecycle, RCON, backups, mods, and more).
- Account recovery — Single-use recovery codes, generated in advance from an authenticated admin session, let the admin reset their own password later if they get locked out. Two more paths cover losing access to the panel entirely: a local-only token file, or the
--reset-passwordCLI flag run directly on the server.
- Players — Online list, activity history, kick/ban/unban, access levels, notes and tags.
- World map — Live player positions on Knox County with right-click actions.
- Mod manager — Track Workshop mods and detect updates, decide server membership from your Steam collection, auto-sort load order by declared dependencies, and scan for conflicts. Collection sync adds what's missing without deleting the optional mods you keep on the side.
- Server config — Full INI editor with structured and raw views. Sandbox, spawn points, mod settings — searchable and editable in-browser.
- Events & weather — Rain, storms, blizzards, climate control, time control, sound triggers, zombie management.
- PanelBridge — Server-side Lua mod for actions RCON can't reach: teleport, heal, god mode, character export/import, inventory.
- Discord bot — Slash commands and two-way chat relay.
- Single sign-on (SSO) — OpenID Connect login, with ready-made presets for Google, Authentik, Keycloak, Azure AD, Okta, and Auth0, or any other compliant provider entered by hand. Full discovery + PKCE + state/nonce flow, with a one-click credential test before you commit to it.
- Multi-server — Manage multiple PZ servers from one panel.
- Chunk cleaner — Visual map selector for reclaiming disk space from an aging save: delete individual chunks or drag out a rectangular region, with per-save stats before you commit.
- Auto-update — Checks for new releases, downloads and applies them.
- Project Zomboid dedicated server — Build 41 or Build 42.
- RCON enabled in your server
.ini(RCONPort=27015andRCONPassword=...). - Network access between the panel and the PZ server (same machine, same LAN, or reachable IP).
- For PanelBridge features:
DoLuaChecksum=falsein the server.ini. curlfor World Map build detection (Docker, Windows, and macOS already have it; a bare-metal Linux tarball install might not). Without it, the map still works — it just falls back to a fixed build and stops tracking new Project Zomboid map releases, which Debug > World Map will flag.
The packaged binary includes its own runtime — no Node.js, Python, or Java install needed on the panel host.
Choose where the panel runs. It can run beside the game server, in Docker, or on a separate computer. The panel needs RCON access to the game server; PanelBridge features additionally need its server files or SFTP access.
| Your setup | Use this guide |
|---|---|
| Windows PC or Windows server | Windows |
| Linux PC, VPS, or home server | Linux |
| macOS | macOS |
| Docker or Unraid | Docker and Unraid |
| Indifferent Broccoli hosted server | Indifferent Broccoli |
Download the current package from Releases. The Windows and Linux packages include the panel runtime: no Node.js, Python, or Java installation is needed on the panel host.
- Download and extract
ZomboidControlPanel-windows.zip. - Double-click
Start.bat. - Open
http://localhost:3001. - Create the admin account, then open Servers and add your PZ server.
mkdir zomboid-panel && cd zomboid-panel
tar xzf ZomboidControlPanel-linux.tar.gz
chmod +x start.sh
./start.shOpen http://localhost:3001, create the admin account, then add the PZ server in Servers. Works on Ubuntu 20.04+, Debian 10+, CentOS Stream 8+, Rocky 8+, or anything with glibc 2.28+.
The packaged panel binary supports Windows and Linux. On macOS, run the panel with Docker Desktop or OrbStack:
curl -O https://raw.githubusercontent.com/fpsacha/zomboid-control-panel/main/docker-compose.install.yml
docker compose -f docker-compose.install.yml up -dOpen http://localhost:3001. Add a local or remote PZ server through Servers. Project Zomboid server hosting itself needs Linux or a hosting provider; the panel can still run on your Mac.
For a normal Docker host:
curl -O https://raw.githubusercontent.com/fpsacha/zomboid-control-panel/main/docker-compose.install.yml
docker compose -f docker-compose.install.yml up -dOpen http://localhost:3001. This starts the panel with persistent named volumes.
For Unraid, import docker/unraid/zomboid-panel.xml, then set the PZ install and config/save host paths to match your existing PZ container. The panel's own paths must stay /app/data and /app/logs; see Unraid and Indifferent Broccoli for the four required mappings.
Indifferent Broccoli runs the game server. Run this panel on your Windows PC, Linux host, macOS Docker setup, or Unraid box using one of the guides above.
- In the Indifferent Broccoli panel, enable or note the server's RCON host, port, and password.
- In Zomboid Control Panel, open Servers and add it as a remote server using those RCON details.
- Install
PanelBridge.luathrough the provider's file manager, then setDoLuaChecksum=falsein the server.iniand restart the game server. - In Settings > PanelBridge > Remote connection, enter the SFTP host, port, username, and password supplied by Indifferent Broccoli. Plain FTP will not work.
- Set Remote bridge folder to the remote folder that contains PanelBridge's
status.json,inbox, andoutboxfiles. Click Test SFTP, then Start SFTP bridge. - Optional, but recommended for browser-based configuration editing: set Remote Server folder to the absolute folder containing the server's
.iniand_SandboxVars.luafiles, then click Check folder. - Keep start, stop, restart, and game updates in Indifferent Broccoli's own dashboard. The panel can administer the game through RCON and PanelBridge, but it does not take ownership of a hosted provider's container.
Indifferent Broccoli advertises full file access, mod support, and its own server control panel. Their current Project Zomboid guide is available at Indifferent Broccoli.
For every platform, confirm these in the PZ server .ini before adding it to the panel:
RCONPort=27015
RCONPassword=choose-a-strong-password
DoLuaChecksum=falseUse the actual RCON port and password configured for your server. DoLuaChecksum=false is needed only for PanelBridge features.
The panel-only Docker setup above does not automatically grant access to the PZ install or saves. For config editing, local backups, and PanelBridge file access, use the fully documented docker-compose.yml and configure its bind mounts. The Compose files use named volumes for panel state, so do not replace them with host ./panel-data or ./data mounts unless those directories are owned by UID/GID 1000:1000.
When the panel bind-mounts Project Zomboid folders, set PUID and PGID in
.env to the numeric Linux user and group that own those folders:
PUID=1000
PGID=1000Find the values with id -u and id -g, then restart the panel:
docker compose up -dPUID and PGID apply when the container starts as root, which is the default
for Docker and Docker Compose. If the runtime already pins a non-root user — for
example a Kubernetes pod with runAsUser, runAsGroup, and runAsNonRoot: true
— the entrypoint skips the ownership fix and the privilege drop and runs the
panel as the given user. In that case PUID and PGID are ignored, and the
/app/data and /app/logs volumes must already be writable by that UID/GID.
This works with the published image; rebuilding is not required. The panel
changes ownership only of its own /app/data and /app/logs directories,
never of PZ game or save mounts.
The panel can manage a PZ server in another container. Put both containers on
the same Docker network and set RCON_HOST to the PZ service name, not
127.0.0.1. For PanelBridge features, choose one of these file-access methods:
- Bind-mount the same PZ save directory into the panel and give both containers compatible numeric UID/GID access.
- In Settings → PanelBridge, enable Remote server via SFTP, enter the
PZ host credentials and the absolute bridge folder, for example
/home/pz/Zomboid/Lua/panelbridge/MyServer, then select Test SFTP and Start SFTP bridge.
Shared folders and SFTP enable configuration edits and PanelBridge actions. They do not let the panel start or stop a separate Docker container. Keep PZ lifecycle management in your container manager, unless you deliberately grant the panel Docker socket access.
Use the panel-only image alongside an existing Indifferent Broccoli Project Zomboid container. The two applications have separate persistent state: the panel's own database and logs are not Project Zomboid's data or logs.
| Unraid host path | Panel container path | Purpose |
|---|---|---|
/mnt/user/appdata/zomboid-panel/data |
/app/data |
Panel database, sessions, and backups |
/mnt/user/appdata/zomboid-panel/logs |
/app/logs |
Panel logs |
/mnt/cache/appdata/projectzomboid/data |
/pz-server |
PZ install; use the actual path from the PZ container's template |
/mnt/user/appdata/projectzomboid/config |
/zomboid |
PZ server config, saves, logs, and PanelBridge files |
Do not use /panel-data or /panel-logs: the image never reads those
paths. The panel paths are exactly /app/data and /app/logs.
In Unraid's Docker page, add the four mappings above, set PUID=99 and
PGID=100 (or the owner shown by the PZ container), and use bridge networking.
Set RCON_HOST to the PZ container's name only when both containers share a
user-defined Docker network. Otherwise use the PZ container's fixed LAN IP or
host address and its exposed RCON port. Do not use 127.0.0.1: inside the
panel it means the panel container itself.
After starting the panel, configure the container paths in the wizard or
Settings as /pz-server and /zomboid, never the /mnt/... host paths. For
PanelBridge, the shared /zomboid mount is enough. If your PZ container does
not expose that directory to the panel, use Settings → PanelBridge → Remote
server via SFTP instead.
The panel can monitor and administer the game through RCON, but it cannot start, stop, or automatically update an independently managed Broccoli container. Leave lifecycle and game updates with Unraid/Indifferent Broccoli; the automatic server-update setting is for a PZ process managed by the panel.
A ready-to-import Unraid template is available at
docker/unraid/zomboid-panel.xml. Edit the
two PZ host paths and RCON values before importing it.
If you installed the panel as the bundled zomboid-panel.service, use this install folder in the setup wizard:
/opt/zomboid-panel/data/pzserver
Create it once before opening the wizard:
sudo -u pzuser mkdir -p /opt/zomboid-panel/data/pzserverThe panel also creates /opt/zomboid-panel/data/pzserver_Data for server settings and save data. Leave Custom config location blank unless you have a specific reason to store it elsewhere.
Do not use /opt/pzserver with the bundled service unless you add both /opt/pzserver and /opt/pzserver_Data to ReadWritePaths in zomboid-panel.service, then run sudo systemctl daemon-reload and sudo systemctl restart zomboid-panel.
The image runs the panel only — Project Zomboid itself still has to run somewhere (on the host, in another container, or on a separate machine). The panel reaches it via RCON and via shared filesystem (for PanelBridge).
Pull the prebuilt image:
mkdir -p ~/zomboid-panel && cd ~/zomboid-panel
curl -O https://raw.githubusercontent.com/fpsacha/zomboid-control-panel/main/docker-compose.yml
curl -O https://raw.githubusercontent.com/fpsacha/zomboid-control-panel/main/.env.example
mv .env.example .env
docker compose up -dThen open http://localhost:3001.
Before bringing it up for real, edit docker-compose.yml and uncomment the volume mounts that point at your PZ install and ~/Zomboid folder — the file has two annotated topology examples (PZ on the host vs. PZ on a remote machine). All env vars are documented in .env.example.
Prebuilt images are published to GHCR: ghcr.io/fpsacha/zomboid-panel:latest and :vX.Y.Z. Prefer to build from source? Comment out image: in the compose file and uncomment the build: block.
- Open the panel and create your admin account.
- In Settings, set your server install path and Zomboid data path.
- Configure RCON (host, port
27015, password from your server.ini). - Optionally install PanelBridge for advanced features.
PanelBridge is a server-side Lua drop-in that enables features RCON can't reach — teleport, heal, weather control, character export/import, inventory editing, sound triggers.
There is no client-side component. Players don't install anything. The panel copies PanelBridge.lua into your server's Install/media/lua/server/ folder, then you set DoLuaChecksum=false in the server INI, restart the PZ server, and enable it in Settings → PanelBridge.
For a remote server without a shared filesystem, use the Remote server via SFTP option in the same panel. It syncs the bridge command and result files through a local cache; it does not expose the server's full filesystem to the panel.
If you're running the panel on the same machine as your browser, skip this section.
To access the panel from another machine, allow the origin before first launch:
CORS_ORIGINS=http://YOUR-IP:3001 ./start.shAfter login, save it permanently in Settings → Remote Access so the env var isn't required next time.
For VPS or public-internet deployment, put the panel behind a reverse proxy (nginx or Caddy) with HTTPS, and set HTTPS=true so the panel emits HSTS headers. Don't expose port 3001 directly to the internet.
- JWT authentication on all API routes.
- Capability-based roles: three built-in roles plus custom ones, each granting only the specific actions it needs — a moderator account doesn't get server-wipe just because an admin's does.
- Rate limiting on login, RCON, and destructive operations.
- RCON parameter sanitization to prevent command injection.
- CORS configurable per deployment (LAN auto-allows private IPs, VPS requires explicit origins).
- Recovery codes are single-use, enforced even against two redemption attempts racing each other.
- Password reset via secure token file or
--reset-passwordCLI flag.
npm run install:all
npm run devFrontend at http://localhost:5173, backend at http://localhost:3001.
node build.js --all # Build Windows + Linux binaries
npm test # Run tests- Discord — discord.gg/jHsWJDNmSg for questions, support, and feature ideas.
- Issues — Report bugs or request features on GitHub.
- Changelog — See the latest release notes for what's new.
MIT










