From 8eed898bd4e50648002640396c257a32dce14fe2 Mon Sep 17 00:00:00 2001 From: Daniel Ceregatti Date: Fri, 25 Mar 2022 18:54:25 -0700 Subject: [PATCH] First working prototype. It "works", but it still segs, which is the problem I was hoping to fix. Bummer. Add the dayzserver from upstream, but a modified version that doesn't do all the tmux stuff. --- Dockerfile | 40 ++++++++++++++++++---- README.md | 20 +++++++++-- dayzserver | 56 ++++++++----------------------- docker-compose.yml | 24 ++++++++++++++ server.sh | 20 +++++++++++ serverDZ.cfg | 82 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 190 insertions(+), 52 deletions(-) create mode 100644 docker-compose.yml create mode 100755 server.sh create mode 100644 serverDZ.cfg diff --git a/Dockerfile b/Dockerfile index f57e81f..4862a5e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,20 +22,46 @@ RUN apt-get update && apt-get -y upgrade && apt-get -y install \ curl \ lib32gcc-s1 \ lib32stdc++6 \ + locales \ psmisc \ wget \ rename +# Set the locale +RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \ + locale-gen +ENV LANG en_US.UTF-8 +ENV LANGUAGE en_US:en +ENV LC_ALL en_US.UTF-8 + # Setup a non-privileged user -RUN groupadd -g 1000 user && \ - useradd -l -u ${USER_ID} -m -g user user +RUN groupadd user && \ + useradd -l -m -g user user -RUN chown user:user /home/user -R +# Add the server script. +# From https://steamcommunity.com/sharedfiles/filedetails/?id=1517338673 +ADD dayzserver /home/user -USER ${USER_ID} +# Add the serverDZ.cfg from the same URL as above +ADD serverDZ.cfg /home/user -WORKDIR /work +# Add our wrapper too +ADD server.sh /home/user -COPY . /home/user +# Make sure the volumes can be written to by the local user +RUN cd /home/user && \ + mkdir -p serverfiles serverprofile Steam steamcmd -CMD ["server.sh"] +# Create the files the dayzserver script expects so we can take charge of populating them +RUN cd /home/user && touch .steamlogin + +RUN cd /home/user && chown user:user /home/user -R + +# Use our non-privileged user +USER user + +# The dayzserver script expects a home directory to itself. +WORKDIR /home/user + +# Run the server. +CMD ["./server.sh"] diff --git a/README.md b/README.md index 447daf7..ea0eb76 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,19 @@ -# dayzdockerserver +# DayZDockerServer -A Linux DayZ server in a Docker container \ No newline at end of file +A Linux DayZ server in a Docker container. + +Edit docker-compose.yml and set the variables: + +``` +- STEAMLOGIN=yourSteamLogin +- SERVERNAME="DayZ on Linux for Linux" +``` +The steam login is necessary as the server files require ownership +of the game. + +Build the container, run it, tail the logs: +``` +docker-compose build +docker-compose up -d +docker-compose logs -f dayzserver +``` \ No newline at end of file diff --git a/dayzserver b/dayzserver index 800cb39..0792c0a 100755 --- a/dayzserver +++ b/dayzserver @@ -35,43 +35,14 @@ fn_checkroot_dayz(){ fi } -fn_checktmux(){ - if [ -n "${TMUX}" ]; then - printf "[ ${red}FAIL${default} ] The Script creates a tmux session when starting the server.\n" - printf "\tIt is not possible to run a tmux session inside another tmux session\n" - exit 1 - fi -} - -fn_checkscreen(){ - if [ -n "${STY}" ]; then - printf "[ ${red}FAIL${default} ] The Script creates a tmux session when starting the server.\n" - printf "\tIt is not possible to run a tmux session inside screen session\n" - exit 1 - fi -} - fn_loadconfig_dayz(){ # default config if [ ! -f "${HOME}/.default.cfg" ]; then wget -P ${HOME}/ -qN https://raw.githubusercontent.com/thelastnoc/dayz-sa_linuxserver/master/script/.default.cfg fi source ${HOME}/.default.cfg - # script config - if [ ! -f "${HOME}/.dayzserver.cfg" ] || [ "$(grep dayzparameter ${HOME}/.dayzserver.cfg)" == "" ]; then - cp ${HOME}/.default.cfg ${HOME}/.dayzserver.cfg - fi - source ${HOME}/.dayzserver.cfg - # hostname/servername - if [ ! -f "${HOME}/serverfiles/serverDZ.cfg" ]; then - wget -P ${HOME}/serverfiles/ -q https://raw.githubusercontent.com/thelastnoc/dayz-sa_linuxserver/master/script/serverDZ.cfg - fi - defaultservername=$(grep -rwi ${HOME}/serverfiles/serverDZ.cfg -e 'EXAMPLE NAME') - if [ "${defaultservername}" != "" ]; then - printf "[ ${magenta}SERVER${default} ] Servername is set on default! 'EXAMPLE NAME'\n\n" - read -p "Enter a new Servername: " servername - sed -i "/hostname/ s/EXAMPLE NAME/${servername}/" "${HOME}/serverfiles/serverDZ.cfg" - fi + cp serverDZ.cfg "${HOME}/serverfiles/serverDZ.cfg" + sed -i "${HOME}/serverfiles/serverDZ.cfg" -e "s/EXAMPLE NAME/${SERVERNAME}/" # battleye config and rconpassword setup if [ ! -f "${HOME}/serverfiles/battleye/beserver_x64.cfg" ]; then wget -P ${HOME}/serverfiles/battleye/ -qN https://raw.githubusercontent.com/thelastnoc/dayz-sa_linuxserver/master/script/beserver_x64.cfg @@ -100,21 +71,22 @@ fn_status_dayz(){ } fn_start_dayz(){ - fn_status_dayz - if [ "${dayzstatus}" == "1" ]; then - printf "[ ${yellow}DayZ${default} ] Server already running.\n" - exit 1 - else +# fn_status_dayz +# if [ "${dayzstatus}" == "1" ]; then +# printf "[ ${yellow}DayZ${default} ] Server already running.\n" +# exit 1 +# else printf "[ ${green}DayZ${default} ] Starting server...\n" sleep 0.5 fn_loadconfig_dayz sleep 0.5 cd ${HOME}/serverfiles - tmux new-session -d -x 23 -y 80 -s $(whoami)-tmux ./DayZServer $dayzparameter "$workshop" - sleep 1 - cd ${HOME} - date > ${HOME}/.dayzlockfile - fi + exec ./DayZServer $dayzparameter "$workshop" +# tmux new-session -d -x 23 -y 80 -s $(whoami)-tmux ./DayZServer $dayzparameter "$workshop" +# sleep 1 +# cd ${HOME} +# date > ${HOME}/.dayzlockfile +# fi } fn_stop_dayz(){ @@ -451,8 +423,6 @@ fn_opt_usage(){ # start functions fn_checkroot_dayz -fn_checktmux -fn_checkscreen getopt=$1 if [ ! -f "${HOME}/steamcmd/steamcmd.sh" ] || [ ! -f "${HOME}/serverfiles/DayZServer" ] && [ "${getopt}" != "cfg" ]; then diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..5de7efa --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,24 @@ +version: "3.9" + +volumes: + steam: + steamcmd: + serverfiles: + serverprofile: + +services: + + dayzserver: + build: . + ports: + - "2302:2302/udp" + - "27016:27016/udp" + volumes: + - steam:/home/user/Steam + - steamcmd:/home/user/steamcmd + - serverfiles:/home/user/serverfiles + - serverprofile:/home/user/serverprofile + environment: + - STEAMLOGIN=anonymous +# Escape any forwardslashes: SERVERNAME="My thing \/ My other thing" + - SERVERNAME=DayZ on Linux for Linux diff --git a/server.sh b/server.sh new file mode 100755 index 0000000..c147c63 --- /dev/null +++ b/server.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +# Make sure we don't start collecting core files +ulimit -c 0 + +# This script will take environment variables and put them into the files the script expects. +if ! grep STEAMLOGIN .steamlogin +then + echo "Setting the STEAMLOGIN..." + echo "steamlogin=${STEAMLOGIN}" > .steamlogin +fi + +# Do something with SERVERNAME="DayZ on Linux for Linux" +if ! grep SERVERNAME serverDZ.cfg +then + echo "Setting the SERVERNAME..." + sed -i serverDZ.cfg -e "s/SERVERNAME/${SERVERNAME}/" +fi + +./dayzserver start || find /home/user -name error.log -exec cat {} \; \ No newline at end of file diff --git a/serverDZ.cfg b/serverDZ.cfg new file mode 100644 index 0000000..991b8fb --- /dev/null +++ b/serverDZ.cfg @@ -0,0 +1,82 @@ +hostname = "EXAMPLE NAME"; // Server name +password = ""; // Password to connect to the server +passwordAdmin = ""; // Password to become a server admin + +maxPlayers = 60; // Maximum amount of players + +verifySignatures = 2; // Verifies .pbos against .bisign files. (only 2 is supported) + +forceSameBuild = 1; // When enabled, the server will allow the connection only to clients with same the .exe revision as the server (value 0-1) + +disableVoN = 0; // Enable/disable voice over network (value 0-1) +vonCodecQuality = 20; // Voice over network codec quality, the higher the better (values 0-30) + +disable3rdPerson=0; // Toggles the 3rd person view for players (value 0-1) +disableCrosshair=0; // Toggles the cross-hair (value 0-1) + +serverTime="SystemTime"; // Initial in-game time of the server. "SystemTime" means the local time of the machine. Another possibility is to set the time to some value in "YYYY/MM/DD/HH/MM" format, f.e. "2015/4/8/17/23" . +serverTimeAcceleration=12; // Accelerated Time (value 0-24)// This is a time multiplier for in-game time. In this case, the time would move 24 times faster than normal, so an entire day would pass in one hour. +serverTimePersistent=0; // Persistent Time (value 0-1)// The actual server time is saved to storage, so when active, the next server start will use the saved time value. + +guaranteedUpdates=1; // Communication protocol used with game server (use only number 1) + +loginQueueConcurrentPlayers=5; // The number of players concurrently processed during the login process. Should prevent massive performance drop during connection when a lot of people are connecting at the same time. +loginQueueMaxPlayers=500; // The maximum number of players that can wait in login queue + +instanceId = 1; // DayZ server instance id, to identify the number of instances per box and their storage folders with persistence files +lootHistory = 1; // How many persistence history files should be kept by instance, number is looped over during save +storeHouseStateDisabled = false;// Disable houses/doors persistence (value true/false), usable in case of problems with persistence +storageAutoFix = 1; // Checks if the persistence files are corrupted and replaces corrupted ones with empty ones (value 0-1) + +respawnTime = 5; // Sets the respawn delay (in seconds) before the player is able to get a new character on the server, when the previous one is dead + +motd[] = {"line1","line2"}; // Message of the day displayed in the in-game chat +motdInterval = 1; // Time interval (in seconds) between each message + +maxPing= 200; // Max ping value until server kick the user (value in milliseconds) + +timeStampFormat = "Short"; // Format for timestamps in the .rpt file (value Full/Short) +logAverageFps = 1; // Logs the average server FPS (value in seconds), needs to have -dologs launch parameter active +logMemory = 1; // Logs the server memory usage (value in seconds), needs to have the -dologs launch parameter active +logPlayers = 1; // Logs the count of currently connected players (value in seconds), needs to have the -dologs launch parameter active +logFile = "server_console.log";// Saves the server console log to a file in the folder with the other server logs + + +adminLogPlayerHitsOnly = 0; // 1 - log player hits only / 0 - log all hits ( animals/infected ) +adminLogPlacement = 0; // 1 - log placement action ( traps, tents ) +adminLogBuildActions = 0; // 1 - log basebuilding actions ( build, dismantle, destroy ) +adminLogPlayerList = 0; // 1 - log periodic player list with position every 5 minutes + +enableDebugMonitor = 1; // shows info about the character using a debug window in a corner of the screen (value 0-1) + + +steamQueryPort = 2305; // defines Steam query port, should fix the issue with server not being visible in client server browser + +allowFilePatching = 1; // if set to 1 it will enable connection of clients with "-filePatching" launch parameter enabled + +simulatedPlayersBatch = 20; // Set limit of how much players can be simulated per frame (for server performance gain) + +multithreadedReplication = 1; // enables multi-threaded processing of server's replication system + // number of worker threads is derived by settings of jobsystem in dayzSettings.xml by "maxcores" and "reservedcores" parameters (value 0-1) + +networkRangeClose = 20; // network bubble distance for spawn of close objects with items in them (f.i. backpacks), set in meters, default value if not set is 20 +networkRangeNear = 150; // network bubble distance for spawn (despawn +10%) of near inventory items objects, set in meters, default value if not set is 150 +networkRangeFar = 1000; // network bubble distance for spawn (despawn +10%) of far objects (other than inventory items), set in meters, default value if not set is 1000 +networkRangeDistantEffect = 4000; // network bubble distance for spawn of effects (currently only sound effects), set in meters, default value if not set is 4000 + +defaultVisibility=1375; // highest terrain render distance on server (if higher than "viewDistance=" in DayZ client profile, clientside parameter applies) +defaultObjectViewDistance=1375; // highest object render distance on server (if higher than "preferredObjectViewDistance=" in DayZ client profile, clientside parameter applies) + +lightingConfig = 0; // 0 for brighter night, 1 for darker night +disablePersonalLight = 1; // disables personal light for all clients connected to server + +disableBaseDamage = 0; // set to 1 to disable damage/destruction of fence and watchtower +disableContainerDamage = 0; // set to 1 to disable damage/destruction of tents, barrels, wooden crate and seachest + +class Missions +{ + class DayZ + { + template="dayzOffline.chernarusplus"; // Mission to load on server startup. . + }; +};