Project Zomboid es un juego de supervivencia cooperativo cuyo servidor dedicado se distribuye gratis a través de Steam (app ID 380870). En este tutorial instalarás el servidor con SteamCMD en Ubuntu 24.04, lo configurarás con los archivos servertest.ini y servertest_SandboxVars.lua, añadirás mods del Steam Workshop y lo dejarás funcionando como servicio systemd que guarda la partida al detenerse, con copias de seguridad diarias.

Requisitos previos

  • Un servidor con Ubuntu 24.04 LTS de 64 bits, por ejemplo un VPS de CubePath.
  • Un usuario no root con privilegios sudo.
  • Al menos 2 núcleos y 4 GB de RAM para unos 8 jugadores; cuenta con 8 GB o más si vas a tener muchos jugadores o mods.
  • Unos 10 GB libres en disco para el servidor y las partidas.
  • Los puertos UDP 16261 y 16262 accesibles desde Internet.

Paso 1: Instalar SteamCMD

SteamCMD es el cliente de línea de comandos de Steam que descarga y actualiza servidores dedicados. En Ubuntu está en el repositorio multiverse y necesita la arquitectura de 32 bits:

sudo add-apt-repository multiverse
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install steamcmd

Durante la instalación aparece el acuerdo de licencia de Steam: selecciona Aceptar para continuar. El ejecutable queda en /usr/games/steamcmd.

Paso 2: Crear un usuario dedicado

El servidor no debe ejecutarse como root. Crea un usuario de sistema steam con su propio directorio personal, donde vivirán tanto el servidor como las partidas:

sudo useradd --create-home --shell /bin/bash steam

Comprueba que el usuario existe:

id steam
uid=1001(steam) gid=1001(steam) groups=1001(steam)

Paso 3: Descargar el servidor de Project Zomboid

Descarga el servidor en /home/steam/pzserver con una sesión anónima; no hace falta tener el juego en tu cuenta. +force_install_dir debe ir antes de +login:

sudo -u steam /usr/games/steamcmd +force_install_dir /home/steam/pzserver +login anonymous +app_update 380870 validate +quit

La primera ejecución también actualiza SteamCMD, así que tarda unos minutos. Al terminar verás:

Success! App '380870' fully installed.

Comprueba que está el script de arranque:

ls /home/steam/pzserver/start-server.sh

Paso 4: Primer arranque y contraseña de administrador

El primer arranque genera los archivos de configuración y pide la contraseña del usuario admin del servidor, así que hazlo de forma interactiva. Abre una sesión como el usuario steam:

sudo -u steam -i
cd ~/pzserver
./start-server.sh

Cuando aparezca Enter new administrator password:, escribe una contraseña robusta y confírmala. Espera a que el log muestre una línea parecida a esta:

LOG  : Network  , ... > *** SERVER STARTED ****

Escribe quit en la consola para detenerlo de forma ordenada y vuelve a tu usuario con exit. Los archivos generados quedan en /home/steam/Zomboid/Server/:

sudo ls /home/steam/Zomboid/Server/
servertest.ini  servertest_SandboxVars.lua  servertest_spawnregions.lua

servertest es el nombre de servidor por defecto. Si quieres varios mundos, arranca con -servername otro_nombre y se crearán archivos con ese prefijo.

Paso 5: Configurar el servidor

servertest.ini contiene los ajustes de red y de administración. Ábrelo como el usuario steam:

sudo -u steam nano /home/steam/Zomboid/Server/servertest.ini

Busca y ajusta estas claves (el archivo tiene muchas más; deja el resto como está):

PublicName=Mi servidor de Project Zomboid
PublicDescription=Servidor cooperativo en Europa
Public=true
MaxPlayers=16
Password=your_server_password
DefaultPort=16261
UDPPort=16262
PVP=false
PauseEmpty=true
SaveWorldEveryMinutes=15
  • Public=true hace que aparezca en la lista pública del juego; con false solo se entra por IP.
  • Password es la contraseña para unirse; déjala vacía para un servidor abierto.
  • PauseEmpty=true detiene el tiempo del mundo cuando no hay nadie conectado.
  • SaveWorldEveryMinutes fuerza guardados periódicos además del que se hace al apagar.

Las reglas de la partida (cantidad de zombis, velocidad del tiempo, pérdida de objetos, etc.) están en servertest_SandboxVars.lua. La forma más segura de generarlo es crear un preset en el editor Sandbox del propio juego y copiar sus valores, porque los nombres de las variables cambian entre versiones. Si lo editas a mano, cambia solo valores de claves existentes, por ejemplo:

sudo -u steam nano /home/steam/Zomboid/Server/servertest_SandboxVars.lua

Asignar memoria a la JVM

El servidor es una aplicación Java y el límite de memoria se define en ProjectZomboid64.json. Abre el archivo:

sudo -u steam nano /home/steam/pzserver/ProjectZomboid64.json

Dentro del array vmArgs localiza el argumento -Xmx y ajústalo a unos 2 GB menos que la RAM total del servidor, por ejemplo en un servidor de 8 GB:

"-Xmx6g",

Este archivo se sobrescribe en cada app_update, así que revísalo después de actualizar.

Paso 6: Abrir los puertos en el firewall

Project Zomboid usa el puerto UDP 16261 para la conexión y la consulta de Steam, y 16262 para el tráfico de los clientes. Permite ambos y SSH antes de activar UFW:

sudo ufw allow OpenSSH
sudo ufw allow 16261:16262/udp
sudo ufw enable

Verifica las reglas:

sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
16261:16262/udp            ALLOW       Anywhere

Paso 7: Crear el servicio systemd

El servidor lee los comandos de administración desde la entrada estándar. Para poder enviárselos cuando corre en segundo plano, y para que guarde la partida al detener el servicio, se usa un FIFO gestionado por un socket de systemd.

Crea la unidad del socket:

sudo nano /etc/systemd/system/zomboid.socket
[Unit]
BindsTo=zomboid.service

[Socket]
ListenFIFO=/home/steam/pzserver/zomboid.control
FileDescriptorName=control
RemoveOnStop=true
SocketMode=0660
SocketUser=steam
SocketGroup=steam

Crea la unidad del servicio:

sudo nano /etc/systemd/system/zomboid.service
[Unit]
Description=Project Zomboid dedicated server
After=network-online.target zomboid.socket
Wants=network-online.target
Requires=zomboid.socket

[Service]
Type=simple
User=steam
Group=steam
WorkingDirectory=/home/steam/pzserver
ExecStart=/bin/sh -c 'exec /home/steam/pzserver/start-server.sh < /home/steam/pzserver/zomboid.control'
ExecStop=/bin/sh -c 'echo save > /home/steam/pzserver/zomboid.control; sleep 15; echo quit > /home/steam/pzserver/zomboid.control'
KillSignal=SIGCONT
TimeoutStopSec=120

[Install]
WantedBy=multi-user.target

ExecStart conecta la entrada estándar del servidor al FIFO que crea el socket, y ExecStop envía save y luego quit al servidor; KillSignal=SIGCONT evita que systemd lo mate antes de que termine de guardar. Si pasado TimeoutStopSec sigue vivo, systemd lo fuerza.

Recarga systemd y arranca el servidor:

sudo systemctl daemon-reload
sudo systemctl enable --now zomboid.service

Comprueba el estado y sigue el log hasta ver SERVER STARTED:

systemctl status zomboid.service
sudo journalctl -u zomboid.service -f

Pulsa Ctrl+C para salir del log. Desde el juego, en Unirse, añade la IP your_server_ip y el puerto 16261 para conectarte.

Enviar comandos a la consola

Escribe en el FIFO como el usuario steam. En la consola del servidor los comandos van sin barra inicial:

echo 'servermsg "Reinicio en 5 minutos"' | sudo -u steam tee /home/steam/pzserver/zomboid.control > /dev/null
echo 'players' | sudo -u steam tee /home/steam/pzserver/zomboid.control > /dev/null
echo 'grantadmin "nombre_jugador"' | sudo -u steam tee /home/steam/pzserver/zomboid.control > /dev/null

La respuesta aparece en journalctl -u zomboid.service. Otros comandos útiles son save, kickuser "nombre", banuser "nombre" y help, que lista todos los disponibles en tu versión.

Paso 8: Añadir mods del Steam Workshop

El servidor descarga los mods por sí mismo al arrancar. Cada mod necesita dos datos que aparecen en su página del Workshop: el Workshop ID (el número de la URL) y el Mod ID (indicado en la descripción, a veces varios por ítem).

Edita servertest.ini con el servicio detenido, porque el servidor reescribe el archivo al apagarse:

sudo systemctl stop zomboid.service
sudo -u steam nano /home/steam/Zomboid/Server/servertest.ini

Rellena las dos claves separando los valores con punto y coma, en el mismo orden:

WorkshopItems=2169435993;2392709985
Mods=modoptions;tsarslib

Los IDs del ejemplo son ilustrativos; usa los de los mods que elijas. Arranca de nuevo y comprueba en el log que se descargan:

sudo systemctl start zomboid.service
sudo journalctl -u zomboid.service | grep -i workshop

Los clientes descargan automáticamente los mismos mods al conectarse.

Paso 9: Actualizar el servidor

Cuando sale una actualización del juego, los clientes no pueden entrar hasta que actualices el servidor. Detén el servicio, actualiza con SteamCMD y vuelve a arrancar:

sudo systemctl stop zomboid.service
sudo -u steam /usr/games/steamcmd +force_install_dir /home/steam/pzserver +login anonymous +app_update 380870 validate +quit
sudo systemctl start zomboid.service

Recuerda volver a ajustar -Xmx en ProjectZomboid64.json si lo habías cambiado.

Paso 10: Programar copias de seguridad

El mundo se guarda en /home/steam/Zomboid/Saves/Multiplayer/servertest y los usuarios y bloqueos en /home/steam/Zomboid/db/servertest.db. Este script fuerza un guardado, espera a que termine y empaqueta el directorio Zomboid completo (incluye también la configuración), conservando 7 días:

sudo nano /usr/local/bin/pz-backup
#!/usr/bin/env bash
set -euo pipefail

src_dir="/home/steam/Zomboid"
dest_dir="/home/steam/backups"
control="/home/steam/pzserver/zomboid.control"

mkdir -p "$dest_dir"

if [[ -p "$control" ]]; then
    echo save > "$control"
    sleep 30
fi

tar -czf "$dest_dir/zomboid-$(date +%F_%H%M).tar.gz" \
    -C "$(dirname "$src_dir")" "$(basename "$src_dir")"

find "$dest_dir" -name 'zomboid-*.tar.gz' -mtime +7 -delete

Hazlo ejecutable y pruébalo como el usuario steam:

sudo chmod 755 /usr/local/bin/pz-backup
sudo -u steam /usr/local/bin/pz-backup
sudo ls -lh /home/steam/backups
-rw-r--r-- 1 steam steam 212M sep 25 04:00 zomboid-2026-09-25_0400.tar.gz

Programa una copia diaria a las 04:00 en el crontab del usuario steam:

sudo crontab -u steam -e
0 4 * * * /usr/local/bin/pz-backup

Guarda también las copias fuera del servidor (por ejemplo, con rsync o rclone a un almacenamiento de objetos) para no perderlas si falla el disco.

Solución de problemas

  • El servidor no aparece en la lista pública: comprueba Public=true y que los puertos UDP 16261-16262 están abiertos. Mientras tanto, prueba a conectar directamente por IP.
  • Los jugadores no pueden entrar tras una actualización del juego: el servidor tiene una versión distinta a la del cliente. Repite el paso 9.
  • java.lang.OutOfMemoryError en el log: sube -Xmx en ProjectZomboid64.json o reduce MaxPlayers y mods.
  • Un mod no carga: revisa que el orden de WorkshopItems y Mods es coherente y que el Mod ID es exactamente el de la página del Workshop. El log indica qué ID no encuentra.
  • Los cambios en servertest.ini se pierden: se editó con el servidor en marcha. Detén el servicio antes de editar.

Conclusión

Tienes un servidor dedicado de Project Zomboid instalado con SteamCMD, configurado, ejecutándose como servicio systemd que guarda al detenerse y con copias de seguridad diarias. A partir de aquí puedes activar la lista blanca (Open=false en servertest.ini) para servidores privados, automatizar las actualizaciones con LinuxGSM o monitorizar el uso de CPU y RAM para dimensionar el servidor según crezca la comunidad.