Compare commits
56 Commits
master
...
lotr-retur
Author | SHA1 | Date | |
---|---|---|---|
84017f14e6 | |||
e195c01542 | |||
68ece2d3a2 | |||
6590476ccb | |||
5c3092af13 | |||
d4a105c6c2 | |||
095aab96c2 | |||
7975bea6c0 | |||
62f9376b71 | |||
c6cdd5d219 | |||
b993aff750 | |||
c47afc4004 | |||
2c5647bec3 | |||
f36ff41c07 | |||
4b4c185144 | |||
8acf4da141 | |||
9e9520843e | |||
1f26a0b6f6 | |||
99526955f3 | |||
b647072e5b | |||
1063f54e01 | |||
c9e739186b | |||
55bcab89ce | |||
966337fc4b | |||
f8a54ab606 | |||
858da29aeb | |||
ba165b8b65 | |||
b3197dabb4 | |||
bd80747663 | |||
a10ea0d4e4 | |||
096b93dcf0 | |||
ea60bf9a6f | |||
9c9b88f426 | |||
82a7371b15 | |||
e91035f770 | |||
4aad192c48 | |||
6d1b2eb5fd | |||
165c6c989e | |||
88b76e6484 | |||
bc859f9a43 | |||
fa79c36fe1 | |||
aadf55bfae | |||
72cae3b72f | |||
3c8727bf07 | |||
ba5cc2eda2 | |||
4b26b7606b | |||
ec025e72fe | |||
ed846924cf | |||
bdbf35c4a8 | |||
26d8027eac | |||
e77a8bcfe6 | |||
ca0c8fefe6
|
|||
e7c87bd8f1
|
|||
2432940e23
|
|||
89598a9710
|
|||
83992eb6cb
|
15
Dockerfile
15
Dockerfile
@@ -1,18 +1,18 @@
|
||||
FROM ich777/debian-baseimage
|
||||
FROM ich777/winehq-baseimage
|
||||
|
||||
LABEL maintainer="admin@minenet.at"
|
||||
LABEL org.opencontainers.image.authors="admin@minenet.at"
|
||||
LABEL org.opencontainers.image.source="https://github.com/ich777/docker-steamcmd-server"
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get -y install --no-install-recommends lib32gcc-s1 lib32stdc++6 && \
|
||||
apt-get -y install lib32gcc-s1 winbind xvfb screen && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
ENV DATA_DIR="/serverdata"
|
||||
ENV STEAMCMD_DIR="${DATA_DIR}/steamcmd"
|
||||
ENV SERVER_DIR="${DATA_DIR}/serverfiles"
|
||||
ENV GAME_ID="template"
|
||||
ENV GAME_NAME="template"
|
||||
ENV GAME_PARAMS="template"
|
||||
ENV GAME_PORT=27015
|
||||
ENV GAME_ID="3349480"
|
||||
ENV GAME_PARAMS=""
|
||||
ENV GAME_PORT=7777
|
||||
ENV VALIDATE=""
|
||||
ENV UMASK=000
|
||||
ENV UID=99
|
||||
@@ -31,6 +31,7 @@ RUN mkdir $DATA_DIR && \
|
||||
|
||||
ADD /scripts/ /opt/scripts/
|
||||
RUN chmod -R 770 /opt/scripts/
|
||||
COPY MoriaServerConfig.ini /opt/MoriaServerConfig.ini
|
||||
|
||||
#Server Start
|
||||
ENTRYPOINT ["/opt/scripts/start.sh"]
|
123
MoriaServerConfig.ini
Normal file
123
MoriaServerConfig.ini
Normal file
@@ -0,0 +1,123 @@
|
||||
; Configuration file for the dedicated server.
|
||||
; Only edit this configuration when the server is offline.
|
||||
; This list may be overwritten when changes are made in-game.
|
||||
|
||||
|
||||
[Main]
|
||||
; If a password is specified, players will need to enter a password to join the server.
|
||||
; Case-sensitive.
|
||||
OptionalPassword="Docker"
|
||||
|
||||
|
||||
[World]
|
||||
; Name of the saved world to load. If it doesn't exist, create it
|
||||
; with the properties defined in the [World.Create] section.
|
||||
Name="Docker Return to Moria"
|
||||
|
||||
; The file name of the world to load. Helpful if you have multiple worlds with the same name.
|
||||
; Note that renaming world files is not currently supported.
|
||||
OptionalWorldFilename=
|
||||
|
||||
|
||||
[World.Create]
|
||||
; World generation parameters, only for newly created worlds.
|
||||
|
||||
; Type of world to create:
|
||||
; * campaign
|
||||
; * sandbox
|
||||
Type=campaign
|
||||
|
||||
; Seed for world generation:
|
||||
; * random - Generates a random seed.
|
||||
; * <integer> - Use the given number.
|
||||
Seed=random
|
||||
|
||||
; Specify world difficulty:
|
||||
; * story: Ideal for players who want to experience the story without much danger.
|
||||
; * solo: Ideal for a single dwarf.
|
||||
; * normal: Ideal for a small company of dwarves.
|
||||
; * hard: Ideal for a large company of dwarves.
|
||||
; * custom: Use customizations for each category of difficulty.
|
||||
Difficulty.Preset=normal
|
||||
|
||||
; Custom difficulty properties, used only if the "Difficulty.Preset" property is set to custom.
|
||||
; Acceptable values are verylow, low, default, high and veryhigh.
|
||||
; The base enemy damage and hit points.
|
||||
Difficulty.Custom.CombatDifficulty=default
|
||||
; How often enemies attack and how many will attack at once.
|
||||
Difficulty.Custom.EnemyAggression=high
|
||||
; The strength of various buffs, speed a dwarf succumbs to despair and
|
||||
; the decay rates of stamina, energy and hunger.
|
||||
Difficulty.Custom.SurvivalDifficulty=default
|
||||
; Volume of ore that drops from each vein.
|
||||
Difficulty.Custom.MiningDrops=default
|
||||
; The drop rates of rewards for defeating orcs and enemies.
|
||||
Difficulty.Custom.WorldDrops=default
|
||||
; How often noisy actions will trigger a horde of orcs.
|
||||
Difficulty.Custom.HordeFrequency=default
|
||||
; How often orcs will target and attack a dwarf base.
|
||||
Difficulty.Custom.SiegeFrequency=default
|
||||
; How often orc and enemy groups spawn.
|
||||
Difficulty.Custom.PatrolFrequency=default
|
||||
|
||||
|
||||
[Host]
|
||||
|
||||
; Local IP address to bind on the server.
|
||||
; Normally leave this empty.
|
||||
; Possible values:
|
||||
; * Empty value for default (bind all adapters.)
|
||||
; * <IPv4> or <IPv6> ... manually specify the IP address.
|
||||
ListenAddress=0.0.0.0
|
||||
|
||||
; Port bound by the server for incoming connections.
|
||||
; You must allow TCP and UDP traffic on your firewall and may need to set up port forwarding.
|
||||
; Possible values:
|
||||
; * -1 ... use the default engine port (7777)
|
||||
; * <integer> ... manually specify the port.
|
||||
ListenPort=7777
|
||||
|
||||
; Host reported to clients. Clients will try to connect it when joining a hosted session.
|
||||
; Normally set this to "auto".
|
||||
; If this machine and all of your friends are playing on a LAN, set this to "local" to avoid having to set up port forwarding.
|
||||
; If there is an issue with automatic detection, you can specify your server's IP address directly.
|
||||
; Possible values:
|
||||
; * auto ... detect public IP address. For public servers or servers behind NAT, proxy,
|
||||
; or in a container with properly configured port mapping or port forwarding.
|
||||
; * local ... automatically detect local IP address. For LAN games and servers with a public IP address.
|
||||
; * <IPv4> or <IPv6> ... manually specify the IP address clients should connect to.
|
||||
AdvertiseAddress=auto
|
||||
|
||||
; Port reported to clients. Clients will try to connect it when joining a hosted session.
|
||||
; Normally leave this empty.
|
||||
; Possible values:
|
||||
; * <empty> ... use the ListenPort. To be used when connecting directly or via port forwarding.
|
||||
; * <integer> ... manually specify the port. To be used when the server
|
||||
; listen port is mapped to a different, exposed port. This is rare.
|
||||
AdvertisePort=
|
||||
|
||||
; If you fail to host on launch, the maximum number of seconds to retry.
|
||||
InitialConnectionRetryTime=120
|
||||
|
||||
; If your hosted session drops, the maximum number of seconds to try to rehost.
|
||||
AfterDisconnectionRetryTime=600
|
||||
|
||||
|
||||
[Console]
|
||||
; Open the console window so you can type commands. (true or false)
|
||||
; Note: To close the app, you will need to kill the process in Windows Task Manager.
|
||||
Enabled=true
|
||||
|
||||
|
||||
[Performance]
|
||||
; Frames per second to tick the server.
|
||||
; Typically leave this at 60. Higher values are unlikely to improve a dedicated server.
|
||||
; If your server uses too much CPU, you might try 30 fps instead.
|
||||
ServerFPS=60
|
||||
; Maximum number of areas to keep loaded at once, a number between 4 and 32.
|
||||
; This number greatly impacts memory, CPU usage and bandwidth.
|
||||
; The default is 12 loaded areas, which generally supports 8 player sessions well.
|
||||
; If you wish to improve performance, reducing to 8 loaded areas supports 4 player sessions very well.
|
||||
; Increasing this number above 12 may decrease the number of loading walls you see,
|
||||
; at the cost of much higher memory and CPU usage, as more enemies will need to be simulated to fill those areas.
|
||||
LoadedAreaLimit=12
|
51
README.md
51
README.md
@@ -1,50 +1,45 @@
|
||||
# SteamCMD in Docker optimized for Unraid
|
||||
This Docker will download and install SteamCMD and the according game that is pulled via specifying the Tag.
|
||||
This Docker will download and install SteamCMD. It will also install LOTR:Return to Moria and run it.
|
||||
|
||||
**Please see the different Tags/Branches which games are available.**
|
||||
Initial server configuration:
|
||||
**Servername:** Docker Return to Moria **Password:** Docker
|
||||
|
||||
## Example Env params for CS:Source
|
||||
**Configuration:** You'll find the configuration file in the main directory for the container: MoriaServerConfig.ini
|
||||
|
||||
**Save Path:** The path for your game saves is: .../returntomoria/Moria/Saved
|
||||
|
||||
**ATTENTION:** First startup can take very long since it downloads the gameserver files and it also installs the runtimes which can take quite some time!
|
||||
|
||||
Update Notice: Simply restart the container if a newer version of the game is available.
|
||||
|
||||
## Example Env params
|
||||
| Name | Value | Example |
|
||||
| --- | --- | --- |
|
||||
| STEAMCMD_DIR | Folder for SteamCMD | /serverdata/steamcmd |
|
||||
| SERVER_DIR | Folder for gamefile | /serverdata/serverfiles |
|
||||
| GAME_ID | The GAME_ID that the container downloads at startup. If you want to install a static or beta version of the game change the value to: '232330 -beta YOURBRANCH' (without quotes, replace YOURBRANCH with the branch or version you want to install). | 232330 |
|
||||
| GAME_NAME | SRCDS gamename | cstrike |
|
||||
| GAME_PARAMS | Values to start the server | -secure +maxplayers 32 +map de_dust2 |
|
||||
| GAME_ID | The GAME_ID that the container downloads at startup. If you want to install a static or beta version of the game change the value to: '3349480 -beta YOURBRANCH' (without quotes, replace YOURBRANCH with the branch or version you want to install). | 3349480 |
|
||||
| GAME_PARAMS | Values to start the server | *empty* |
|
||||
| UID | User Identifier | 99 |
|
||||
| GID | Group Identifier | 100 |
|
||||
| GAME_PORT | Port the server will be running on | 27015 |
|
||||
| VALIDATE | Validates the game data | true |
|
||||
| GAME_PORT | Port the server will be running on | 7777 |
|
||||
| VALIDATE | Validates the game data | false |
|
||||
| USERNAME | Leave blank for anonymous login | blank |
|
||||
| PASSWRD | Leave blank for anonymous login | blank |
|
||||
|
||||
**ATTENTION: You have to disable Steam Guard for games that require authentication, but not all games need Steam credentials, Steam recommends to create a seperate account for dedicated servers **
|
||||
|
||||
>**NOTE** GAME_ID values can be found [here](https://developer.valvesoftware.com/wiki/Dedicated_Servers_List)
|
||||
|
||||
> And for GAME_NAME there is no list, so a quick search should give you the result
|
||||
|
||||
## Run example for CS:Source
|
||||
## Run example
|
||||
```
|
||||
docker run --name CSSource -d \
|
||||
-p 27015:27015 -p 27015:27015/udp \
|
||||
--env 'GAME_ID=232330' \
|
||||
--env 'GAME_NAME=cstrike' \
|
||||
--env 'GAME_PORT=27015' \
|
||||
--env 'GAME_PARAMS=-secure +maxplayers 32 +map de_dust2' \
|
||||
docker run --name ReturnToMoria -d \
|
||||
-p 7777:7777/udp \
|
||||
--env 'GAME_ID=3349480' \
|
||||
--env 'UID=99' \
|
||||
--env 'GID=100' \
|
||||
--volume /mnt/user/appdata/steamcmd:/serverdata/steamcmd \
|
||||
--volume /mnt/user/appdata/cstrikesource:/serverdata/serverfiles \
|
||||
ich777/steamcmd:latest
|
||||
--volume /path/to/steamcmd:/serverdata/steamcmd \
|
||||
--volume /path/to/returntomoria:/serverdata/serverfiles \
|
||||
ich777/steamcmd:lotr-returntomoria
|
||||
```
|
||||
>**NOTE** port 26900 is the port for vac, in case of multiple servers make sure these are not the same
|
||||
|
||||
|
||||
This Docker was mainly edited for better use with Unraid, if you don't use Unraid you should definitely try it!
|
||||
|
||||
|
||||
This Docker is forked from mattieserver, thank you for this wonderfull Docker.
|
||||
|
||||
|
||||
#### Support Thread: https://forums.unraid.net/topic/79530-support-ich777-gameserver-dockers/
|
@@ -1,68 +1,97 @@
|
||||
#!/bin/bash
|
||||
if [ ! -f ${STEAMCMD_DIR}/steamcmd.sh ]; then
|
||||
echo "SteamCMD not found!"
|
||||
wget -q -O ${STEAMCMD_DIR}/steamcmd_linux.tar.gz http://media.steampowered.com/client/steamcmd_linux.tar.gz
|
||||
tar --directory ${STEAMCMD_DIR} -xvzf /serverdata/steamcmd/steamcmd_linux.tar.gz
|
||||
rm ${STEAMCMD_DIR}/steamcmd_linux.tar.gz
|
||||
echo "SteamCMD not found!"
|
||||
wget -q -O ${STEAMCMD_DIR}/steamcmd_linux.tar.gz http://media.steampowered.com/client/steamcmd_linux.tar.gz
|
||||
tar --directory ${STEAMCMD_DIR} -xvzf /serverdata/steamcmd/steamcmd_linux.tar.gz
|
||||
rm ${STEAMCMD_DIR}/steamcmd_linux.tar.gz
|
||||
fi
|
||||
|
||||
echo "---Update SteamCMD---"
|
||||
if [ "${USERNAME}" == "" ]; then
|
||||
${STEAMCMD_DIR}/steamcmd.sh \
|
||||
+login anonymous \
|
||||
+quit
|
||||
${STEAMCMD_DIR}/steamcmd.sh \
|
||||
+login anonymous \
|
||||
+quit
|
||||
else
|
||||
${STEAMCMD_DIR}/steamcmd.sh \
|
||||
+login ${USERNAME} ${PASSWRD} \
|
||||
+quit
|
||||
${STEAMCMD_DIR}/steamcmd.sh \
|
||||
+login ${USERNAME} ${PASSWRD} \
|
||||
+quit
|
||||
fi
|
||||
|
||||
echo "---Update Server---"
|
||||
if [ "${USERNAME}" == "" ]; then
|
||||
if [ "${VALIDATE}" == "true" ]; then
|
||||
echo "---Validating installation---"
|
||||
${STEAMCMD_DIR}/steamcmd.sh \
|
||||
+force_install_dir ${SERVER_DIR} \
|
||||
+login anonymous \
|
||||
+app_update ${GAME_ID} validate \
|
||||
+quit
|
||||
else
|
||||
${STEAMCMD_DIR}/steamcmd.sh \
|
||||
+force_install_dir ${SERVER_DIR} \
|
||||
+login anonymous \
|
||||
+app_update ${GAME_ID} \
|
||||
+quit
|
||||
fi
|
||||
if [ "${VALIDATE}" == "true" ]; then
|
||||
echo "---Validating installation---"
|
||||
${STEAMCMD_DIR}/steamcmd.sh \
|
||||
+@sSteamCmdForcePlatformType windows \
|
||||
+force_install_dir ${SERVER_DIR} \
|
||||
+login anonymous \
|
||||
+app_update ${GAME_ID} validate \
|
||||
+quit
|
||||
else
|
||||
${STEAMCMD_DIR}/steamcmd.sh \
|
||||
+@sSteamCmdForcePlatformType windows \
|
||||
+force_install_dir ${SERVER_DIR} \
|
||||
+login anonymous \
|
||||
+app_update ${GAME_ID} \
|
||||
+quit
|
||||
fi
|
||||
else
|
||||
if [ "${VALIDATE}" == "true" ]; then
|
||||
echo "---Validating installation---"
|
||||
${STEAMCMD_DIR}/steamcmd.sh \
|
||||
+force_install_dir ${SERVER_DIR} \
|
||||
+login ${USERNAME} ${PASSWRD} \
|
||||
+app_update ${GAME_ID} validate \
|
||||
+quit
|
||||
else
|
||||
${STEAMCMD_DIR}/steamcmd.sh \
|
||||
+force_install_dir ${SERVER_DIR} \
|
||||
+login ${USERNAME} ${PASSWRD} \
|
||||
+app_update ${GAME_ID} \
|
||||
+quit
|
||||
fi
|
||||
if [ "${VALIDATE}" == "true" ]; then
|
||||
echo "---Validating installation---"
|
||||
${STEAMCMD_DIR}/steamcmd.sh \
|
||||
+@sSteamCmdForcePlatformType windows \
|
||||
+force_install_dir ${SERVER_DIR} \
|
||||
+login ${USERNAME} ${PASSWRD} \
|
||||
+app_update ${GAME_ID} validate \
|
||||
+quit
|
||||
else
|
||||
${STEAMCMD_DIR}/steamcmd.sh \
|
||||
+@sSteamCmdForcePlatformType windows \
|
||||
+force_install_dir ${SERVER_DIR} \
|
||||
+login ${USERNAME} ${PASSWRD} \
|
||||
+app_update ${GAME_ID} \
|
||||
+quit
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "---Prepare Server---"
|
||||
if [ ! -f ${DATA_DIR}/.steam/sdk32/steamclient.so ]; then
|
||||
if [ ! -d ${DATA_DIR}/.steam ]; then
|
||||
mkdir ${DATA_DIR}/.steam
|
||||
fi
|
||||
if [ ! -d ${DATA_DIR}/.steam/sdk32 ]; then
|
||||
mkdir ${DATA_DIR}/.steam/sdk32
|
||||
fi
|
||||
cp -R ${STEAMCMD_DIR}/linux32/* ${DATA_DIR}/.steam/sdk32/
|
||||
export WINEARCH=win64
|
||||
export WINEPREFIX=/serverdata/serverfiles/WINE64
|
||||
export WINEDEBUG=-all
|
||||
echo "---Checking if WINE workdirectory is present---"
|
||||
if [ ! -d ${SERVER_DIR}/WINE64 ]; then
|
||||
echo "---WINE workdirectory not found, creating please wait...---"
|
||||
mkdir ${SERVER_DIR}/WINE64
|
||||
else
|
||||
echo "---WINE workdirectory found---"
|
||||
fi
|
||||
echo "---Checking if WINE is properly installed---"
|
||||
if [ ! -d ${SERVER_DIR}/WINE64/drive_c/windows ]; then
|
||||
echo "---Setting up WINE---"
|
||||
cd ${SERVER_DIR}
|
||||
winecfg > /dev/null 2>&1
|
||||
sleep 15
|
||||
else
|
||||
echo "---WINE properly set up---"
|
||||
fi
|
||||
echo "---Checking for old display lock files---"
|
||||
find /tmp -name ".X99*" -exec rm -f {} \; > /dev/null 2>&1
|
||||
chmod -R ${DATA_PERM} ${DATA_DIR}
|
||||
|
||||
echo "---Looking 'MoriaServerConfig.ini' file is in place---"
|
||||
if [ ! -f ${SERVER_DIR}/MoriaServerConfig.ini ]; then
|
||||
echo "---'MoriaServerConfig.ini' not found, copying template...---"
|
||||
cp /opt/MoriaServerConfig.ini ${SERVER_DIR}/MoriaServerConfig.ini
|
||||
else
|
||||
echo "---'MoriaServerConfig.ini' found---"
|
||||
fi
|
||||
|
||||
echo "---Server ready---"
|
||||
|
||||
echo "---Start Server---"
|
||||
cd ${SERVER_DIR}
|
||||
${SERVER_DIR}/srcds_run -game ${GAME_NAME} ${GAME_PARAMS} -console +port ${GAME_PORT}
|
||||
if [ ! -f ${SERVER_DIR}/Moria/Binaries/Win64/MoriaServer-Win64-Shipping.exe ]; then
|
||||
echo "---Something went wrong, can't find the executable, putting container into sleep mode!---"
|
||||
sleep infinity
|
||||
else
|
||||
xvfb-run --auto-servernum --server-args='-screen 0 640x480x24:32' wine64 ${SERVER_DIR}/Moria/Binaries/Win64/MoriaServer-Win64-Shipping.exe -log ${GAME_PARAMS}
|
||||
fi
|
@@ -1,29 +1,37 @@
|
||||
#!/bin/bash
|
||||
echo "---Checking if UID: ${UID} matches user---"
|
||||
echo "---Ensuring UID: ${UID} matches user---"
|
||||
usermod -u ${UID} ${USER}
|
||||
echo "---Checking if GID: ${GID} matches user---"
|
||||
echo "---Ensuring GID: ${GID} matches user---"
|
||||
groupmod -g ${GID} ${USER} > /dev/null 2>&1 ||:
|
||||
usermod -g ${GID} ${USER}
|
||||
echo "---Setting umask to ${UMASK}---"
|
||||
umask ${UMASK}
|
||||
|
||||
echo "---Checking for optional scripts---"
|
||||
if [ -f /opt/scripts/user.sh ]; then
|
||||
echo "---Found optional script, executing---"
|
||||
chmod +x /opt/scripts/user.sh
|
||||
/opt/scripts/user.sh
|
||||
cp -f /opt/custom/user.sh /opt/scripts/start-user.sh > /dev/null 2>&1 ||:
|
||||
cp -f /opt/scripts/user.sh /opt/scripts/start-user.sh > /dev/null 2>&1 ||:
|
||||
|
||||
if [ -f /opt/scripts/start-user.sh ]; then
|
||||
echo "---Found optional script, executing---"
|
||||
chmod -f +x /opt/scripts/start-user.sh ||:
|
||||
/opt/scripts/start-user.sh || echo "---Optional Script has thrown an Error---"
|
||||
else
|
||||
echo "---No optional script found, continuing---"
|
||||
echo "---No optional script found, continuing---"
|
||||
fi
|
||||
|
||||
echo "---Starting...---"
|
||||
echo "---Taking ownership of data...---"
|
||||
chown -R root:${GID} /opt/scripts
|
||||
chmod -R 750 /opt/scripts
|
||||
chown ${UID}:${GID} /opt/MoriaServerConfig.ini
|
||||
chmod 750 /opt/MoriaServerConfig.ini
|
||||
chown -R ${UID}:${GID} ${DATA_DIR}
|
||||
|
||||
echo "---Starting...---"
|
||||
term_handler() {
|
||||
kill -SIGTERM "$killpid"
|
||||
wait "$killpid" -f 2>/dev/null
|
||||
kill -SIGINT $(pidof MoriaServer-Win64-Shipping.exe)
|
||||
tail --pid=$(pidof MoriaServer-Win64-Shipping.exe) -f 2>/dev/null
|
||||
exit 143;
|
||||
|
||||
}
|
||||
|
||||
trap 'kill ${!}; term_handler' SIGTERM
|
||||
|
Reference in New Issue
Block a user