It seems a lot more people are learning and setting up unraid to host their server. I’ve decided, due to the influx of neophytes, to write a guide to help out.
As a note for any of Ich’s containers, it is best to have them on a cache drive. Any ssd or m.2 will do as they have the quickest read/write speeds.
I am going to take a few liberties and assume you have certain plugins installed on your Unraid server already. The only one that will pertain to this guide is the Community Applications plugin. You will know you have this installed if you see the Apps option on your Unraid menu.
Once you are on your app page, then you’ll search for 7 Days to Die, and for Ich’s container you will see the following:
You will then click the Install button on the right.
You will then see the following screen:
Pictured above is the default configuration of the container template and ports used for the game.
Once you have hit apply at the bottom, the container will start and download your server files. Once that is complete, go to the Docker area on your Unraid menu.
With the release of Alpha 21, you must now add -batchmode -nographics in the GAME_PARAMS field after 294420. If you do not do this the server will not boot.
Once the files are downloaded, you’ll need to setup your serverconfig.xml. First stop the the 7DTD container. Then the next thing to do is to make a copy or serverconfig.xml and rename it to something else. I generally name it in reference to my server name. As an example, if I called my server Zombieland, I would rename the copied serverconfig.xml to zombieland.xml.
From there I would then edit zombieland.xml for all my server settings. Posted below is the serverconfig.xml.
<?xml version="1.0"?>
<ServerSettings>
<!-- GENERAL SERVER SETTINGS -->
<!-- Server representation -->
<property name="ServerName" value="Publicly Displayed Server name"/> <!-- Whatever you want the name of the server to be. -->
<property name="ServerDescription" value="Server Description"/> <!-- Whatever you want the server description to be, will be shown in the server browser. -->
<property name="ServerWebsiteURL" value=""/> <!-- Website URL for the server, will be shown in the serverbrowser as a clickable link -->
<property name="ServerPassword" value=""/> <!-- Password to gain entry to the server -->
<property name="ServerLoginConfirmationText" value="" /> <!-- If set the user will see the message during joining the server and has to confirm it before continuing. For more complex changes to this window you can change the "serverjoinrulesdialog" window in XUi -->
<property name="Region" value="NorthAmericaEast" /> <!-- The region this server is in. Values: NorthAmericaEast, NorthAmericaWest, CentralAmerica, SouthAmerica, Europe, Russia, Asia, MiddleEast, Africa, Oceania -->
<property name="Language" value="English" /> <!-- Primary language for players on this server. Values: Use any language name that you would users expect to search for. Should be the English name of the language, e.g. not "Deutsch" but "German" -->
<!-- Networking -->
<property name="ServerPort" value="26900"/> <!-- Port you want the server to listen on. Keep it in the ranges 26900 to 26905 or 27015 to 27020 if you want PCs on the same LAN to find it as a LAN server. -->
<property name="ServerVisibility" value="2"/> <!-- Visibility of this server: 2 = public, 1 = only shown to friends, 0 = not listed. As you are never friend of a dedicated server setting this to "1" will only work when the first player connects manually by IP. -->
<property name="ServerDisabledNetworkProtocols" value="SteamNetworking"/> <!-- Networking protocols that should not be used. Separated by comma. Possible values: LiteNetLib, SteamNetworking. Dedicated servers should disable SteamNetworking if there is no NAT router in between your users and the server or when port-forwarding is set up correctly -->
<property name="ServerMaxWorldTransferSpeedKiBs" value="512"/> <!-- Maximum (!) speed in kiB/s the world is transferred at to a client on first connect if it does not have the world yet. Maximum is about 1300 kiB/s, even if you set a higher value. -->
<!-- Slots -->
<property name="ServerMaxPlayerCount" value="8"/> <!-- Maximum Concurrent Players -->
<property name="ServerReservedSlots" value="0"/> <!-- Out of the MaxPlayerCount this many slots can only be used by players with a specific permission level -->
<property name="ServerReservedSlotsPermission" value="100"/> <!-- Required permission level to use reserved slots above -->
<property name="ServerAdminSlots" value="0"/> <!-- This many admins can still join even if the server has reached MaxPlayerCount -->
<property name="ServerAdminSlotsPermission" value="0"/> <!-- Required permission level to use the admin slots above -->
<!-- Admin interfaces -->
<property name="ControlPanelEnabled" value="false"/> <!-- Enable/Disable the web control panel -->
<property name="ControlPanelPort" value="8080"/> <!-- Port of the control panel webpage -->
<property name="ControlPanelPassword" value="CHANGEME"/> <!-- Password to gain entry to the control panel -->
<property name="TelnetEnabled" value="true"/> <!-- Enable/Disable the telnet -->
<property name="TelnetPort" value="8081"/> <!-- Port of the telnet server -->
<property name="TelnetPassword" value=""/> <!-- Password to gain entry to telnet interface. If no password is set the server will only listen on the local loopback interface -->
<property name="TelnetFailedLoginLimit" value="10"/> <!-- After this many wrong passwords from a single remote client the client will be blocked from connecting to the Telnet interface -->
<property name="TelnetFailedLoginsBlocktime" value="10"/> <!-- How long will the block persist (in seconds) -->
<property name="TerminalWindowEnabled" value="true"/> <!-- Show a terminal window for log output / command input (Windows only) -->
<!-- Folder and file locations -->
<property name="AdminFileName" value="serveradmin.xml"/> <!-- Server admin file name. Path relative to the SaveGameFolder -->
<!-- <property name="UserDataFolder" value="absolute path" /> --> <!-- Use this to override where the server stores all generated data, including RWG generated worlds. Do not forget to uncomment the entry! -->
<!-- <property name="SaveGameFolder" value="absolute path" /> --> <!-- Use this to only override the save game path. Do not forget to uncomment the entry! -->
<!-- Other technical settings -->
<property name="EACEnabled" value="true"/> <!-- Enables/Disables EasyAntiCheat -->
<property name="HideCommandExecutionLog" value="0"/> <!-- Hide logging of command execution. 0 = show everything, 1 = hide only from Telnet/ControlPanel, 2 = also hide from remote game clients, 3 = hide everything -->
<property name="MaxUncoveredMapChunksPerPlayer" value="131072"/> <!-- Override how many chunks can be uncovered on the ingame map by each player. Resulting max map file size limit per player is (x * 512 Bytes), uncovered area is (x * 256 m²). Default 131072 means max 32 km² can be uncovered at any time -->
<property name="PersistentPlayerProfiles" value="false" /> <!-- If disabled a player can join with any selected profile. If true they will join with the last profile they joined with -->
<!-- GAMEPLAY -->
<!-- World -->
<property name="GameWorld" value="Navezgane"/> <!-- "RWG" (see WorldGenSeed and WorldGenSize options below) or any already existing world name in the Worlds folder (currently shipping with e.g. "Navezgane", "PREGEN01", ...) -->
<property name="WorldGenSeed" value="asdf"/> <!-- If RWG this is the seed for the generation of the new world. If a world with the resulting name already exists it will simply load it -->
<property name="WorldGenSize" value="6144"/> <!-- If RWG this controls the width and height of the created world. It is also used in combination with WorldGenSeed to create the internal RWG seed thus also creating a unique map name even if using the same WorldGenSeed. Has to be a multiple of 2048 between 2048 and 16384, though large map sizes will take long to generate / download / load -->
<property name="GameName" value="My Game"/> <!-- Whatever you want the game name to be. This affects the save game name as well as the seed used when placing decoration (trees etc) in the world. It does not control the generic layout of the world if creating an RWG world -->
<property name="GameMode" value="GameModeSurvival"/> <!-- GameModeSurvival -->
<!-- Difficulty -->
<property name="GameDifficulty" value="2"/> <!-- 0 - 5, 0=easiest, 5=hardest -->
<property name="BlockDamagePlayer" value="100" /> <!-- How much damage do players to blocks (percentage in whole numbers) -->
<property name="BlockDamageAI" value="100" /> <!-- How much damage do AIs to blocks (percentage in whole numbers) -->
<property name="BlockDamageAIBM" value="100" /> <!-- How much damage do AIs during blood moons to blocks (percentage in whole numbers) -->
<property name="XPMultiplier" value="100" /> <!-- XP gain multiplier (percentage in whole numbers) -->
<property name="PlayerSafeZoneLevel" value="5" /> <!-- If a player is less or equal this level he will create a safe zone (no enemies) when spawned -->
<property name="PlayerSafeZoneHours" value="5" /> <!-- Hours in world time this safe zone exists -->
<!-- -->
<property name="BuildCreate" value="false" /> <!-- cheat mode on/off -->
<property name="DayNightLength" value="60" /> <!-- real time minutes per in game day: 60 minutes -->
<property name="DayLightLength" value="18" /> <!-- in game hours the sun shines per day: 18 hours day light per in game day -->
<property name="DropOnDeath" value="1" /> <!-- 0 = nothing, 1 = everything, 2 = toolbelt only, 3 = backpack only, 4 = delete all -->
<property name="DropOnQuit" value="0" /> <!-- 0 = nothing, 1 = everything, 2 = toolbelt only, 3 = backpack only -->
<property name="BedrollDeadZoneSize" value="15" /> <!-- Size (box "radius", so a box with 2 times the given value for each side's length) of bedroll deadzone, no zombies will spawn inside this area, and any cleared sleeper volumes that touch a bedroll deadzone will not spawn after they've been cleared. -->
<property name="BedrollExpiryTime" value="45" /> <!-- Number of real world days a bedroll stays active after owner was last online -->
<!-- Performance related -->
<property name="MaxSpawnedZombies" value="64" /> <!-- This setting covers the entire map. There can only be this many zombies on the entire map at one time. Changing this setting has a huge impact on performance. -->
<property name="MaxSpawnedAnimals" value="50" /> <!-- If your server has a large number of players you can increase this limit to add more wildlife. Animals don't consume as much CPU as zombies. NOTE: That this doesn't cause more animals to spawn arbitrarily: The biome spawning system only spawns a certain number of animals in a given area, but if you have lots of players that are all spread out then you may be hitting the limit and can increase it. -->
<property name="ServerMaxAllowedViewDistance" value="12" /> <!-- Max viewdistance a client may request (6 - 12). High impact on memory usage and performance. -->
<!-- Zombie settings -->
<property name="EnemySpawnMode" value="true" /> <!-- Enable/Disable enemy spawning -->
<property name="EnemyDifficulty" value="0" /> <!-- 0 = Normal, 1 = Feral -->
<property name="ZombieFeralSense" value="0" /> <!-- 0-3 (Off, Day, Night, All) -->
<property name="ZombieMove" value="0" /> <!-- 0-4 (walk, jog, run, sprint, nightmare) -->
<property name="ZombieMoveNight" value="3" /> <!-- 0-4 (walk, jog, run, sprint, nightmare) -->
<property name="ZombieFeralMove" value="3" /> <!-- 0-4 (walk, jog, run, sprint, nightmare) -->
<property name="ZombieBMMove" value="3" /> <!-- 0-4 (walk, jog, run, sprint, nightmare) -->
<property name="BloodMoonFrequency" value="7" /> <!-- What frequency (in days) should a blood moon take place. Set to "0" for no blood moons -->
<property name="BloodMoonRange" value="0" /> <!-- How many days can the actual blood moon day randomly deviate from the above setting. Setting this to 0 makes blood moons happen exactly each Nth day as specified in BloodMoonFrequency -->
<property name="BloodMoonWarning" value="8" /> <!-- The Hour number that the red day number begins on a blood moon day. Setting this to -1 makes the red never show. -->
<property name="BloodMoonEnemyCount" value="8" /> <!-- This is the number of zombies that can be alive (spawned at the same time) at any time PER PLAYER during a blood moon horde, however, MaxSpawnedZombies overrides this number in multiplayer games. Also note that your game stage sets the max number of zombies PER PARTY. Low game stage values can result in lower number of zombies than the BloodMoonEnemyCount setting. Changing this setting has a huge impact on performance. -->
<!-- Loot -->
<property name="LootAbundance" value="100" /> <!-- percentage in whole numbers -->
<property name="LootRespawnDays" value="7" /> <!-- days in whole numbers -->
<property name="AirDropFrequency" value="72"/> <!-- How often airdrop occur in game-hours, 0 == never -->
<property name="AirDropMarker" value="false"/> <!-- Sets if a marker is added to map/compass for air drops. -->
<!-- Multiplayer -->
<property name="PartySharedKillRange" value="100"/> <!-- The distance you must be within to receive party shared kill xp and quest party kill objective credit. -->
<property name="PlayerKillingMode" value="3" /> <!-- Player Killing Settings (0 = No Killing, 1 = Kill Allies Only, 2 = Kill Strangers Only, 3 = Kill Everyone) -->
<!-- Land claim options -->
<property name="LandClaimCount" value="1"/> <!-- Maximum allowed land claims per player. -->
<property name="LandClaimSize" value="41"/> <!-- Size in blocks that is protected by a keystone -->
<property name="LandClaimDeadZone" value="30"/> <!-- Keystones must be this many blocks apart (unless you are friends with the other player) -->
<property name="LandClaimExpiryTime" value="7"/> <!-- The number of real world days a player can be offline before their claims expire and are no longer protected -->
<property name="LandClaimDecayMode" value="0"/> <!-- Controls how offline players land claims decay. 0=Slow (Linear) , 1=Fast (Exponential), 2=None (Full protection until claim is expired). -->
<property name="LandClaimOnlineDurabilityModifier" value="4"/> <!-- How much protected claim area block hardness is increased when a player is online. 0 means infinite (no damage will ever be taken). Default is 4x -->
<property name="LandClaimOfflineDurabilityModifier" value="4"/> <!-- How much protected claim area block hardness is increased when a player is offline. 0 means infinite (no damage will ever be taken). Default is 4x -->
<property name="LandClaimOfflineDelay" value="0"/> <!-- The number of minutes after a player logs out that the land claim area hardness transitions from online to offline. Default is 0 -->
<property name="DynamicMeshEnabled" value="true"/> <!-- Is Dynamic Mesh system enabled -->
<property name="DynamicMeshLandClaimOnly" value="true"/> <!-- Is Dynamic Mesh system only active in player LCB areas -->
<property name="DynamicMeshLandClaimBuffer" value="3"/> <!-- Dynamic Mesh LCB chunk radius -->
<property name="DynamicMeshMaxItemCache" value="3"/> <!-- How many items can be processed concurrently, higher values use more RAM -->
<property name="TwitchServerPermission" value="90"/> <!-- Required permission level to use twitch integration on the server -->
<property name="TwitchBloodMoonAllowed" value="false"/> <!-- If the server allows twitch actions during a blood moon. This could cause server lag with extra zombies being spawned during blood moon. -->
<!-- There are several game settings that you cannot change when starting a new game.
You can use console commands to change at least some of them ingame.
setgamepref BedrollDeadZoneSize 30 -->
</ServerSettings>
Here I will discuss some of the basic server settings:
ServerName This is your Publicly Displayed Server name.
ServerDescription This is a brief description about your server that shows up in the games server browser.
ServerPassword Only fill this in if you want your server to be private and require a password to join.
Region This is the part of the world your server is physically located.
ServerPort This is the game port for the server, by default it is 26900.
ControlPanelEnabled This can generally be set to false as you probably won’t use it. This is a web access to the RCON. Most people who are hosting a server tend to use a server manager instead.
ControlPanelPort The port the control panel utilizes, by default it is 8080.
TelnetEnabled I highly recommend setting this to false. Telnet is another way to connect to your server to run commands. If someone was going to hack your server, this is how they would attempt it first.
TelnetPort The port telnet utilizes, by default it is 8081. If you decide to us telnet, I would recommend using a port other than the default.
GameWorld This is the type of game you are going to run. By default this is set to “Navezgame” which is the static map approximately 6k in size. You can choose “RWG” for Random World Generation. Doing this on the server take some time based on the size of your map. I think an 8k sized map should take around 15 to 20 minutes.
**As an advanced option, I like to generate my map on my client and upload it to the server. If you use this option, the save world will output to “AppData\Roaming\7DaysToDie\GeneratedWorlds” on your windows computer. It will have a name that will include either county or territory. You can rename this to whatever you want.
As an example, I generated a map and it defaulted to “Old Nuxubo Territory.” I rename that to “zombieland.” Under the GameWorld setting, I change “Navezgame” or “RWG” to “zombieland.” and upload the files to the server to “appdata\7dtd\Data\Worlds” directory so the config file can find the world.**
Everything in the serverconfig.xml has a description next to it identifying what it does. I would suggest using Notepad++ to do your editing and downloading the XML Tools plugin. It will make reading and editing xml files much easier.
Now that you’ve finished editing your renamed serverconfig.xml, you need to edit the template of the 7 Days to Die container. Go back to your Docker page on your Unraid server, find your 7 Days to Die container, click the icon, then a drop down menu will appear, click edit.
Clicking Edit will take you back to the containers “settings” or template screen. Once back there, (pictured above), you will look for the Server Config option and then change the name to what you called your new config file. In my instance, I changed it to zombieland.xml. Once you have done that, hit apply at the bottom of the page. This will apply the changes.
Once you’ve made this change you can restart the container (docker) and after a couple of minutes your server should be up and running.
Remember to port forward.
Make sure you have forwarded the ports in your routers firewall so that the server can reach the internet. If you are using default ports, I recommend forwarding a block of 5. So 26900-26905 forwarded in both TCP & UDP.
Changing Ports in the Container or Hosting a Second Server.
So you decided you want to host a second server or do not want to use the default ports. In Ich’s game server containers you need to add a new port in the container and remove the default port.
Here is how you add a new port to the container. Go into the container Edit menu, and at the bottom find and click:
Once you click that you see the following pop up:
Where “Path” is, you will click the drop down and change it to port. Below is the port configuration, filled in with new info.
Once you have the info filled in, hit add. This will add this new port. At this point you will need to remove the original port.
You will need to do this for all the ports you are changing, both for TCP and UDP. The name can be the same name and will not conflict, especially since you will have to delete the original port you are replacing.
Additional Changes for a Second Server.
Along with changing the ports you will need to change the server container Name and directory on where the files will install.
**If you are adding Alloc’s server fixes and/or CPM to your server, you will need to add their ports to the container template (settings) and forward them in your router so they can be accessed via the internet.**