From 6fbb9bf2ada11bdac2e3c66cb68d1b46802be687 Mon Sep 17 00:00:00 2001 From: Daniel Ceregatti Date: Wed, 29 May 2024 02:45:11 -0700 Subject: [PATCH] Add support for two servers. This is a breaking change from before, as it creates new volumes with 1 and 2 in their names, allowing for 3, 4, ..., n. --- .gitignore | 2 +- README.md | 47 +++++++++++++++++++++++---------- docker-compose.yml | 63 +++++++++++++++++++++++++++++++++------------ files/bin/dz-common | 6 ++--- 4 files changed, 84 insertions(+), 34 deletions(-) diff --git a/.gitignore b/.gitignore index 0d7d73e..52906c2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ .idea *.iml -.env +.env* node_modules/ diff --git a/README.md b/README.md index 02e87a2..29fa7c3 100644 --- a/README.md +++ b/README.md @@ -30,12 +30,33 @@ git clone https://ceregatti.org/git/daniel/dayzdockerserver.git cd dayzdockerserver ``` -Create a `.env` file that contains your user id. Usually the `${UID}` shell variable has this: +Create a `.env` file for the web container that contains your user id. Usually the `${UID}` shell variable has this: ```shell echo "export USER_ID=${UID}" | tee .env ``` +Repeat the above for server1, which uses .env1 (and so on): +```shell +echo "export USER_ID=${UID}" | tee .env1 +``` + +But each server must also set its own unique ports: +```shell +echo "export SERVER_PORT=2302" | tee -a .env1 +echo "export RCON_PORT=2303" | tee -a .env1 +echo "export STEAM_PORT=27016" | tee -a .env1 +``` + +Repeat the above for each server you want to run, making sure the ports are unique across all servers: +```shell +echo "export USER_ID=${UID}" | tee .env2 +echo "export SERVER_PORT=2312" | tee -a .env2 +echo "export RCON_PORT=2313" | tee -a .env2 +echo "export STEAM_PORT=27116" | tee -a .env2 + + +```shell Build the Docker images: ```shell @@ -76,7 +97,7 @@ hostname = "Something other than Server Name"; // Server name Install the server config file: ```shell -docker compose run --rm server dz c +docker compose run --rm server1 dz c ``` The maintenance of the config file is a work in progress. The goal is to create a facility for merging changes into the config file and maintain a paper trail of changes. @@ -86,18 +107,18 @@ Launch the stack into the background: docker compose up -d ``` -There will be nothing in mpmissions when the server container starts for the first time. A pristine copy of `dayzOffline.chernarusplus` will be copied from the `mpmission` volume to the server container. This will be the default map. To install other maps, see [Maps](#maps). +There will be nothing in mpmissions when a server container starts for the first time. A pristine copy of `dayzOffline.chernarusplus` will be copied from the `mpmission` volume to the server container. This will be the default map. To install other maps, see [Maps](#maps). To see the server log: ```shell -docker compose logs -f server +docker compose logs -f server1 ``` ## Stopping the server To stop the DayZ server: ```shell -docker compose exec server dz stop +docker compose exec server1 dz stop ``` If it exits cleanly, the container will also stop. Otherwise a crash is presumed and the server will restart. Ideally, the server would always exit cleanly, but... it's DayZ. @@ -126,13 +147,13 @@ A terminal-based RCON client is included: https://github.com/indepth666/py3rcon. The dz script manages what's necessary to configure and run it: ```shell -docker compose exec server dz rcon +docker compose exec server1 dz rcon ``` To reset the RCON password in the Battle Eye configuration file, simply delete it, and a random one will be generated on the next server startup: ```shell -docker compose run --rm server rm serverfiles/battleye/baserver_x64_active* +docker compose run --rm server1 rm serverfiles/battleye/baserver_x64_active* ``` Don't expect much from this RCON at this time. @@ -159,13 +180,13 @@ Don't forget to [bring it back up](#run). To stop the server: ```shell -docker compose exec server dz stop +docker compose exec server1 dz stop ``` The above sends the SIGINT signal to the server process. The server sometimes fails to stop with this signal. It may be necessary to force stop it with the SIGKILL: ```shell -docker compose exec server dz force +docker compose exec server1 dz force ``` When the server exits cleanly, i.e. exit code 0, the container also stops. Otherwise, a crash is presumed, and the server will be automatically restarted. @@ -180,8 +201,8 @@ docker compose down Interactive interface for managing mods. ``` -docker compose exec server dz activate id | add id1 | deactivate id | list | modupdate | remove id -docker compose exec server dz a id | add id1 | d id | l | m | r id +docker compose exec server1 dz activate id | add id1 | deactivate id | list | modupdate | remove id +docker compose exec server1 dz a id | add id1 | d id | l | m | r id ``` Look for mods in the [DayZ Workshop](https://steamcommunity.com/app/221100/workshop/). Browse to one. In its URL will be @@ -232,9 +253,7 @@ This allows access to the server container using exec. You can then start and st ```shell # Go into the server container -docker compose exec shell bash -# Because this is now in the environment and keeping the server from starting, it'd still keep the server from starting unless we unset it -unset DEVELOPMENT +docker compose exec server1 bash # See what the server status is dz s # Start it diff --git a/docker-compose.yml b/docker-compose.yml index 1fdae5d..9e05112 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,18 +1,24 @@ volumes: - # For steamcmd files and resource files used by the scripts + # Only in the web container. + # For steamcmd files and resource files used by the scripts. homedir_main: - # For Steam, for now - homedir_server: + # Shared by all containers. + # Mods. + mods: # Where the server files will be installed serverfiles: - # Server profile files - profiles: # Upstream mission files servermpmissions: + # Server-specific volumes + # For Steam, for now + homedir_server1: + homedir_server2: # Server mission files - mpmissions: - # Mods - mods: + mpmissions1: + mpmissions2: + # Server profile files + profiles1: + profiles2: services: @@ -37,21 +43,23 @@ services: env_file: - .env - server: + server1: build: context: server args: - USER_ID user: ${USER_ID} volumes: - - homedir_server:/home/user + # Common volumes + - ./files:/files + - mods:/mods + - ./server:/server - serverfiles:/serverfiles - servermpmissions:/mpmissions:ro - - mods:/mods - - mpmissions:/serverfiles/mpmissions - - profiles:/profiles - - ./files:/files - - ./server:/server + # Server-specific volumes + - homedir_server1:/home/user + - mpmissions1:/serverfiles/mpmissions + - profiles1:/profiles # To have the server show up in the LAN tab of the DayZ launcher, # it must run under host mode. network_mode: host @@ -77,4 +85,27 @@ services: # soft: -1 # hard: -1 env_file: - - .env + - .env1 + + # Copy and paste this for every other server you want to run, replacing 2 with 3, and so on. + server2: # <-- here + build: + context: server + args: + - USER_ID + user: ${USER_ID} + volumes: + # Common volumes + - ./files:/files + - mods:/mods + - ./server:/server + - serverfiles:/serverfiles + - servermpmissions:/mpmissions:ro + # Server-specific volumes + - homedir_server2:/home/user # <-- here + - mpmissions2:/serverfiles/mpmissions # <-- here + - profiles2:/profiles # <-- here + network_mode: host + restart: no + env_file: + - .env2 # <-- here diff --git a/files/bin/dz-common b/files/bin/dz-common index 2fa8606..1711603 100755 --- a/files/bin/dz-common +++ b/files/bin/dz-common @@ -5,9 +5,9 @@ set -eEa # If you want/need the server and rcon ports to be different, set them here. # The steam query port is set in serverDZ.cfg. -# Server port -port=2302 -rcon_port=2303 +# Server port. Set these in the .env file for the container. +port=${SERVER_PORT} +rcon_port=${RCON_PORT} # Don't change anything else.