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
16261y16262accesibles 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.
Notaeste comando instala la rama estable. Si quieres la rama de pruebas que publiquen los desarrolladores, añade
-beta nombre_de_la_ramadespués de380870. Todos los jugadores deben usar la misma versión que el servidor.
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=truehace que aparezca en la lista pública del juego; confalsesolo se entra por IP.Passwordes la contraseña para unirse; déjala vacía para un servidor abierto.PauseEmpty=truedetiene el tiempo del mundo cuando no hay nadie conectado.SaveWorldEveryMinutesfuerza 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
Importantelos cambios en
SandboxVars.luaque afectan a la generación del mundo solo se aplican a zonas del mapa que aún no se han visitado. Ajústalo antes de que empiecen a jugar.
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=truey que los puertos UDP16261-16262está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.OutOfMemoryErroren el log: sube-XmxenProjectZomboid64.jsono reduceMaxPlayersy mods.- Un mod no carga: revisa que el orden de
WorkshopItemsyModses 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.inise 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.
