Hace poco instale un servidor de project zomboid 41.78 para mi y unos amigos asi que aqui dejo una explicación de como lo he hecho.
Requisitos
- steamcmd
- rclon-cli
- Alma linux(aunque como siempre, podéis usar la distribución de vuestra preferencia)
- VPS/Servidor local
Preparación del SO
Instalación de dependencias
Primero instalaremos algunas de las dependencias que necesitaremos mas adelante:
yum install -y glibc.i686 libstdc++.i686
Debido a que siempre uso la instalación mas minima tambien he tenido que instalar el tar
y el wget
,
dnf install tar wget
Creación de un usuario sin privilegios
Primero creamos un usuario llamado pzuser
para que el servidor se ejecute con los minimos permisos posibles,
useradd -m pzuser
Reviso que se ha creado la home,
Y que puedo entrar al usuario,
Configuración de firewalld
Uno de los apartados a preparar es el firewall, yo solo puedo cubrir la parte del sistema operativo, que va a variar dependiendo de la distribución. Depende de donde tengáis el servidor hosteado deberéis abrir los puertos de la plataforma(azure, oci, aws..), o si lo tenéis en casa deberéis hacer ‘port forwarding’ desde el router.
Antes de seguir me gustaría añadir que si estáis en una cgnat(o como se llame) tendréis que pedir que os saquen de ella, o pedir que os abran ellos los puertos. A veces poniendo la máquina en la DMZ puede funcionar, aunque no siempre.
Para que funcione solo necesitaremos abrir dos puertos, también me gusta asegurarme de abrir el del ssh para no quedarme fuera:
sudo firewall-cmd --add-port=22/tcp --permanent
sudo firewall-cmd --add-port=16261/udp --permanent
sudo firewall-cmd --add-port=16262/udp --permanent
Una vez los tengamos añadidos le damos un restart y enable al firewall:
systemctl restart firewalld
systemctl enable firewalld
Comprobaremos que se han añadido correctamente:
firewall-cmd --list-ports
Para comprobar que el firewall ha levantado y no muestra errores:
systemctl status firewalld
“Instalación” steamcmd
Ahora “instalaremos” steamcmd, puesto en comillas porque es un ejecutable. Este apartado es básicamente seguir las instrucciones de la web oficial de steam.
Con el usuario pzuser creamos y entramos a una carpeta llamada Steam:
mkdir ~/Steam && cd ~/Steam
Descargamos y descomprimimos el cliente:
curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxvf -
Si hacemos un ll
veremos que en la carpeta ~/Steam
tenemos los diferentes ficheros,
Esto significa que ya tenemos steamcmd
instalado
Instalación y configuración del servidor pz
Instalación
Lo primero que tenemos que hacer es crear un fichero llamado ‘update_zomboid.txt’, este fichero es un script de steamcmd
para descargar y/o actualizar servidores de juegos.
Este fichero se puede crear donde queráis, siempre y cuando especifiquéis bien la ruta donde irán los archivos del servidor de project zomboid, por facilidad, yo lo he puesto con el resto de los ficheros de steamcmd
dentro de la carpeta ~/Steam
El fichero contendra la siguiente información:
// update_zomboid.txt
//
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once
@NoPromptForPassword 1
force_install_dir /home/pzuser/pzserver/
//for servers which don't need a login
login anonymous
app_update 380870 validate
quit
Al crearlo hay que tener en cuenta de modificar la ruta del servidor project zomboid, para eso tenemos que modificar la línea force_install_dir
. Este paso es importante sobre todo si vuestro usuario se llama diferente al del ejemplo, si se llama pzuser
podéis copiar y pegar el siguiente texto en la terminal y se creará en la ruta adecuada.
cat >$HOME/Steam/update_zomboid.txt <<'EOL'
// update_zomboid.txt
//
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once
@NoPromptForPassword 1
force_install_dir /home/pzuser/pzserver/
//for servers which don't need a login
login anonymous
app_update 380870 validate
quit
EOL
Una vez creado el fichero ~/Steam/update_zomboid.txt
lo ejecutaremos usando steamcmd.sh
indicando el archivo creado con anterioridad:
~/Steam/steamcmd.sh +runscript update_zomboid.txt
Una vez ejecutado empezará a descargar e instalar el servidor en ~/pzserver
:
Una vez haya finalizado el proceso podremos ver que tendremos el servidor en ~/pzserver
:
Asignación de la RAM
Aunque técnicamente ya podemos levantar el servidor, aún falta una configuración importante, asignar la RAM que puede usar. Para hacerlo tenemos que editar el fichero Projectzomboid64.json
que estará en ~/pzserver
y al igual que en Minecraft editaremos el argumento vmArgs
y pondremos la RAM que queremos que pueda usar, dejando siempre RAM para el sistema. Por lo que he estado leyendo y como base general son unos 2 GB para el servidor y unos 500-600 MB por jugador.
Creación de los .ini del servidor de forma gráfica(opcional pero recomendado)
Los .ini
y .lua
son los ficheros de configuración del mapa, en servidor se pueden modificar con un editor de texto una vez se generen con el mapa al levantar el servidor.
En la wiki hay una lista de todas las opciones y que hacen.
La forma más sencilla de crear todos los ficheros necesarios es crearlos en nuestra máquina y con escritorio gráfico y luego subirlos al servidor.
Para crearlos en local abriremos el juego e iremos a HOST
,
Aquí vamos a Manage settings...
,
Y creamos una nueva configuración en Create New Settings
,
En este apartado le ponemos el nombre al mapa, también se puede dejar por defecto,
Y ahora tendremos la configuración en modo gráfico, aquí se pueden modificar los parámetros al gusto sin tener que rebuscar por los ficheros de configuración,
Aunque se puede hacer más adelante, ya que estamos aquí modificaremos las opciones del RCON,
Configuramos el puerto que queramos y una contraseña segura,
Una vez tengamos la configuración a nuestro gusto la guardaremos y veréis que os lleva al siguiente apartado. En Windows los ficheros deberían estar en C:\users\username..
, Igualmente, os indicará la ruta en pantalla.
Cuando vayamos a la ruta indicada veremos tres ficheros de configuración, estos son los que subiremos al servidor,
Una vez copiado los pondremos en la ruta ~/Zomboid/Server
, seguramente la ruta aún no exista por lo que la tendremos que crear:
mkdir -p ~/Zomboid/Server
Una vez creada la ruta ponemos los tres ficheros de configuración en la ruta y vamos al siguiente paso.
Creación del servidor con sus .ini y .lua
IMPORTANTE SI HABÉIS HECHO EL PASO OPCIONAL ANTERIOR: Si habéis realizado el paso anterior ya tendréis la carpeta ~/Zomboid/Server
creada y el nombre que le habéis puesto al servidor tendrá que ir después del -servername
tal y como se indica en el siguiente paso, en caso de que no lo hayáis modificado se llamará servertest.ini y no hará falta añadir-lo, ya que es el nombre por defecto.
Antes de crear el servicio systemd tenemos que crear el mapa y los ficheros de configuración .ini
y .lua
por primera vez, para ello levantaremos el servidor con ‘start-server.sh’, que está en la carpeta ~/pzserver
. Si queremos ponerle un nombre en específico añadiremos -servername NombreServidor
(NombreServidor será el nombre de los .ini
y .lua
), si ya están creados, pondremos ese nombre, por ejemplo, si el fichero se llama pztuto.ini
añadiremos -servername pztuto
.
En caso de que hayáis dejado todos los nombres por defecto, no será necesario añadirlo,
Si se ha cambiado en nombre:
sh ~/pzserver/start-server.sh -servername NombreServidor
Si se ha dejado el nombre por defecto:
sh ~/pzserver/start-server.sh
Durante la creación veremos que nos pedirá una contraseña de administrador, le ponemos una cualquiera que sea segura, a mí nunca me la ha vuelto a pedir, y eso que he movido el servidor a otras máquinas, la verdad es que no se para qué sirve, pero guardadla por si acaso.
Una vez puesta la contraseña esperamos a que se inicie, por norma general lo sabremos cuando veamos el Discord disabled
y/o el Server Steam ID
y acto y seguido 4 o 5 líneas,
Ahora ya podemos comprobar que se puede entrar al servidor, una vez comprobado que podemos entrar lo paramos con el comando quit
en la consola.
Si ahora vamos a la home del usuario veremos que se ha creado la carpeta Zomboid
,
Dentro de esta carpeta ter todo lo relacionado con las configuraciones del servidor y el mapa, las dos más importantes son:
- Mapa:
~/Zomboid/Saves/Multiplayer/
- Configuraciones:
~/Zomboid/Server/
Si vamos a la wiki oficial veremos para qué sirve cada fichero y que opciones se tienen que modificar para dejar el servidor a nuestro gusto. Si habéis hecho el paso opcional no hará falta entrar a ninguno de los ficheros de configuración.
Si modificáis alguna opción después de crear el mapa y no siendo estrictamente necesario, a mí me gusta eliminar el mapa que se ha creado durante el primer inicio, que estará en ~/Zomboid/Saves/Multiplayer/
. Sobre todo si se ha modificado alguna opción que modifique la generación del mapa.
Configuración de las herramientas de administración
Aunque administrar el servidor con rcon y systemd seguramente sea de las opciones más ‘enrevesadas’ creo que al final es de las mejores para automatizar tareas, y que una vez está todo configurado, es de las más fáciles de administrar.
En el caso de que sepáis usar herramientas como tmux o screen podéis iniciar el servidor con esas herramientas y saltaros los siguientes pasos :).
Configuración rcon
Con rcon podremos mandar comandos al servidor, yo normalmente solo lo uso localmentem ya que el servidor queda en segundo plano gracias a systemd
.
Para configurarlo tendremos que ir al .ini del servidor que está situado en ~/Zomboid/Server/ServerName.ini
y dentro del fichero buscar las dos líneas de la imagen:
- RCONPort=
- RCONPassword=
Si habéis hecho el paso opcional veréis que ya esta el puerto y la contraseña, en caso contario solo estará el puerto, lo podéis dejar por defecto o poner otro. La contraseña la que queráis, pero sí lo dejáis accesible de forma remota aseguraos de poner una contraseña segura,
Una vez puesto puerto y contraseña nos descargaremos un cliente rcon, yo suelo usar rcon-cli. Lo descargamos, descomprimimos en la home del sistema y le ponemos como nombre ‘rcon’
Una vez hecho probaremos que funciona usando el siguiente comando:
~/rcon/rcon -a 127.0.0.1:27015 -p 1234 "quit"
En el primer argumento -a
pondremos ip + puerto, en segundo -p
es donde ira la contraseña y seguidamente la orden que le queremos mandar entre " "
, como será para parar el servidor ponemos “quit” pero se puede usar para cualquiera de los comandos de administrador y lo necesitaremos usar, ya que no tenemos la consola accesible.
Rechazará la conexión, pero eso significa que funciona,
En el caso de que diga que el programa no existe o de un error de permisos revisad que la ruta está bien escrita y que disponéis de permisos de ejecución.
Configuración de systemd
Para configurar systemd haremos un ‘script’ con una linea que basicamente servira para systemd lo use y pare el servidor.
Creamos carpeta:
mkdir ~/scripts
Creamos script con la orden quit
, aquí es importante que en -p
pongáis vuestra contraseña del rcon o no funcionara,
cat >$HOME/scripts/stop.sh <<'EOL'
#!/bin/bash
~/rcon/rcon -a 127.0.0.1:27015 -p 1234 "quit"
EOL
Probamos a ejecutarlo para ver que los permisos del script están bien:
sh ~/scripts/stop.sh
Debería volver a dar el error de ‘connection refused’,
Una vez hecho crearemos la carpeta donde ira el .service
del systemd del usuario:
mkdir -p ~/.config/systemd/user
Seguidamente, crearemos el .service
en el directorio ~/.config/systemd/user
en este paso solo tenéis que aseguraros de que las rutas están correctas, sobre todo la del script si no lo habéis dejado en el mismo sitio, por lo demás debería ser copiar y pegar:
cat > ~/.config/systemd/user/zomboid.service <<'EOL'
[Unit]
Description=Project Zomboid Server
After=network.target
[Service]
PrivateTmp=true
Type=simple
WorkingDirectory=/home/$USER/pzserver
ExecStart=/bin/sh /home/$USER/pzserver/start-server.sh -servername pzuser
ExecStop=/bin/sh /home/$USER/scripts/stop.sh
KillSignal=SIGCONT
[Install]
WantedBy=multi-user.target
EOL
Una vez creado el .service
recargamos los demonios del systemd con:
systemctl --user daemon-reload
En este paso habrá dos opciones, o que funcione, o que nos dé el siguiente error:
Sí nos da el error, tendremos que hacer dos cosas. La primera es añadir las dos siguientes lineas al final del fichero ~/.bashrc
del usuario que lo va a ejecutar todo
export XDG_RUNTIME_DIR="/run/user/$UID"
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
Una vez añadidas, entramos al usuario root o con un usuario administrador y ejecutaremos la siguiente linea, donde pzuser
sera el nombre de usuario que ejecuta el servidor, si me estáis copiando todo no tendréis que cambiar nada:
loginctl enable-linger pzuser
Una vez hecho volvemos al usuario sin privilegios y volvemos a recargar el demonio:
systemctl --user daemon-reload
Ya no dará error y podremos hacer un start
y un status
para levantar el servidor pz:
systemctl --user start zomboid && systemctl --user status zomboid
Para que el servidor levanta con la máquina en caso de un reinicio le haremos un enable
.
systemctl --user start zomboid && systemctl --user status zomboid
Una vez finalizados todos los pasos ya podremos entrar al servidor a jugar.
Revisión de logs
La revisión de log la haremos desde ~/Zomboid/Logs
, usando el DebugLog
que es log de la consola principal,
Si le hacemos un tail -f ~/Zomboid/Logs/29-03-24_22-25-06_DebugLog-server.txt
podremos ver como va, también podemos hacer tail -f ~/Zomboid/Logs/*_DebugLog-server.txt
, ya que el nombre de los logs va cambiando y así siempre cogemos el último que esté usando.
El formato es de fecha, día y año, y lo irá ordenando por días. También veréis que va creando más ficheros de logs, cada uno para una cosa distinta.
Os adjunto una captura de un servidor que lleva funcionando más o menos un mes y algo para que veáis que otros logs crea y como los ordena por días.
Ahora quedaría disfrutar :)