Compare commits
57 Commits
alienswarm
...
subsistenc
Author | SHA1 | Date | |
---|---|---|---|
fc07f25169 | |||
13aaa04312 | |||
23e17fec2f | |||
2bb938a2b4 | |||
1c1bd04181 | |||
f73fb4a290 | |||
b4862f0a14 | |||
c59417e8aa | |||
d142a452ec | |||
7523f0c102 | |||
75e7b53377 | |||
07bfc75c4e | |||
da4cb0651f | |||
a296a8c61a | |||
557e3ba3d9 | |||
41c7677e8c | |||
fde402da83 | |||
ed117f8d35 | |||
841e6a0a1c | |||
223188f06e | |||
3d30acbc1e | |||
e03219a936 | |||
5c371e6e2e | |||
8d26d2a8d3 | |||
1a5ff66373 | |||
f71d0579ac | |||
f4677a9a01 | |||
e6a855484e | |||
a79dd225be | |||
57b5304696 | |||
8962c5df2d | |||
ebe0ee01ea | |||
5bcdc21483 | |||
40bab7b9a0 | |||
b726a3b03e
|
|||
36e6f11305
|
|||
a9be204119
|
|||
b124516f62
|
|||
86d87928fc
|
|||
5bdb86ded8
|
|||
6cd9b5b54c
|
|||
2afe1361bc
|
|||
fb45a82e61
|
|||
9807db6c0d | |||
f6761c6b63 | |||
387debe4e4 | |||
87b7ec8a85 | |||
1195017c62 | |||
9f1e288a0f | |||
d9dc682430 | |||
196b8d427a | |||
31dea67d67 | |||
0f9edd0979 | |||
4fa86060a3 | |||
cbfca82d8f | |||
ad8381780e | |||
2841ea86cb |
38
Dockerfile
38
Dockerfile
@@ -1,36 +1,38 @@
|
||||
FROM ubuntu
|
||||
FROM ich777/winehq-baseimage
|
||||
|
||||
MAINTAINER ich777
|
||||
LABEL org.opencontainers.image.authors="admin@minenet.at"
|
||||
LABEL org.opencontainers.image.source="https://github.com/ich777/docker-steamcmd-server"
|
||||
|
||||
RUN apt-get update
|
||||
RUN apt-get -y install lib32gcc1 wget wine-stable winbind xvfb screen
|
||||
RUN apt-get update && \
|
||||
apt-get -y install lib32gcc-s1 winbind xvfb screen cabextract && \
|
||||
wget -q -O /usr/bin/winetricks https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks && \
|
||||
chmod +x /usr/bin/winetricks && chown 755 /usr/bin/winetricks && \
|
||||
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_ID=""
|
||||
ENV GAME_PARAMS=""
|
||||
ENV GAME_PORT=27015
|
||||
ENV VALIDATE=""
|
||||
ENV UMASK=000
|
||||
ENV UID=99
|
||||
ENV GID=100
|
||||
ENV USERNAME=""
|
||||
ENV PASSWRD=""
|
||||
ENV USER="steam"
|
||||
ENV DATA_PERM=770
|
||||
|
||||
RUN mkdir $DATA_DIR
|
||||
RUN mkdir $STEAMCMD_DIR
|
||||
RUN mkdir $SERVER_DIR
|
||||
RUN useradd -d $DATA_DIR -s /bin/bash --uid $UID --gid $GID steam
|
||||
RUN chown -R steam $DATA_DIR
|
||||
|
||||
RUN ulimit -n 2048
|
||||
RUN mkdir $DATA_DIR && \
|
||||
mkdir $STEAMCMD_DIR && \
|
||||
mkdir $SERVER_DIR && \
|
||||
useradd -d $DATA_DIR -s /bin/bash $USER && \
|
||||
chown -R $USER $DATA_DIR && \
|
||||
ulimit -n 2048
|
||||
|
||||
ADD /scripts/ /opt/scripts/
|
||||
RUN chmod -R 770 /opt/scripts/
|
||||
RUN chown -R steam /opt/scripts
|
||||
|
||||
USER steam
|
||||
|
||||
#Server Start
|
||||
ENTRYPOINT ["/opt/scripts/start-server.sh"]
|
||||
ENTRYPOINT ["/opt/scripts/start.sh"]
|
43
README.md
43
README.md
@@ -1,45 +1,40 @@
|
||||
# SteamCMD in Docker optimized for Unraid
|
||||
This Docker will download and install SteamCMD. It will also install Counter-Strike: Source and run it. Update Notice: Simply restart the container if a newer version of the game is available.
|
||||
This Docker will download and install SteamCMD. It will also install Subsistence and run it.
|
||||
|
||||
**ATTENTION:** First startup can take very long since it downloads the gameserver files and also installs dotnet45!
|
||||
|
||||
**First Start Notice:** On First startup the container installs dotnet45 and it might seem that the container hangs but please be patient since the installation can take very long on some systems (5 minutes+).
|
||||
|
||||
Update Notice: Simply restart the container if a newer version of the game is available.
|
||||
|
||||
You can also run multiple servers with only one SteamCMD directory!
|
||||
|
||||
## Env params
|
||||
| Name | Value | Example |
|
||||
| --- | --- | --- |
|
||||
| STEAMCMD_DIR | Folder for SteamCMD | /serverdata/steamcmd |
|
||||
| SERVER_DIR | Folder for gamefile | /serverdata/serverfiles |
|
||||
| GAME_ID | SteamID for server | 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: '1362640 -beta YOURBRANCH' (without quotes, replace YOURBRANCH with the branch or version you want to install). | 1362640 |
|
||||
| GAME_PARAMS | Values to start the server, leave empty for none | 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 |
|
||||
| VALIDATE | Validates the game data | blank |
|
||||
| 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, 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
|
||||
```
|
||||
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 Subsistence -d \
|
||||
-p 7777:7777/udp -p 27015:27015/udp \
|
||||
--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/subsistence:/serverdata/serverfiles \
|
||||
ich777/steamcmd:subsistence
|
||||
```
|
||||
>**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,55 +0,0 @@
|
||||
// Dedicated Server Settings.
|
||||
// Server IP address - Note: If you have a router, this address is the internal address, and you need to configure ports forwarding
|
||||
serverIP 0.0.0.0
|
||||
// Steam Communication Port - Note: If you have a router you will need to open this port.
|
||||
serverSteamPort 8766
|
||||
// Game Communication Port - Note: If you have a router you will need to open this port.
|
||||
serverGamePort 27015
|
||||
// Query Communication Port - Note: If you have a router you will need to open this port.
|
||||
serverQueryPort 27016
|
||||
// Server display name
|
||||
serverName The Forest Docker
|
||||
// Maximum number of players
|
||||
serverPlayers 4
|
||||
// Enable VAC (Valve Anti-cheat System at the server. Must be set off or on
|
||||
enableVAC off
|
||||
// Server password. blank means no password
|
||||
serverPassword Docker
|
||||
// Server administration password. blank means no password
|
||||
serverPasswordAdmin adminDocker
|
||||
// Your Steam account name. blank means anonymous
|
||||
serverSteamAccount
|
||||
// Time between server auto saves in minutes - The minumum time is 15 minutes, the default time is 30
|
||||
serverAutoSaveInterval 30
|
||||
// Game difficulty mode. Must be set to Peaceful Normal or Hard
|
||||
difficulty Normal
|
||||
// New or continue a game. Must be set to New or Continue
|
||||
initType Continue
|
||||
// Slot to save the game. Must be set 1 2 3 4 or 5
|
||||
slot 1
|
||||
// Show event log. Must be set off or on
|
||||
showLogs off
|
||||
// Contact email for server admin
|
||||
serverContact email@gmail.com
|
||||
// No enemies
|
||||
veganMode off
|
||||
// No enemies during day time
|
||||
vegetarianMode off
|
||||
// Reset all structure holes when loading a save
|
||||
resetHolesMode off
|
||||
// Regrow 10% of cut down trees when sleeping
|
||||
treeRegrowMode off
|
||||
// Allow building destruction
|
||||
allowBuildingDestruction on
|
||||
// Allow enemies in creative games
|
||||
allowEnemiesCreativeMode off
|
||||
// Allow clients to use the built in debug console
|
||||
allowCheats off
|
||||
// Use full weapon damage values when attacking other players
|
||||
realisticPlayerDamage off
|
||||
// Allows defining a custom folder for save slots, leave empty to use the default location
|
||||
saveFolderPath
|
||||
// Target FPS when no client is connected
|
||||
targetFpsIdle 5
|
||||
// Target FPS when there is at least one client connected
|
||||
targetFpsActive 60
|
4
scripts/start-Xvfb.sh
Normal file
4
scripts/start-Xvfb.sh
Normal file
@@ -0,0 +1,4 @@
|
||||
until Xvfb :99 -screen scrn 640x480x16; do
|
||||
echo "Xvfb server crashed with exit code $?. Respawning.." >&2
|
||||
sleep 1
|
||||
done
|
@@ -1,4 +1,5 @@
|
||||
#!/bin/bash
|
||||
export DISPLAY=:99
|
||||
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
|
||||
@@ -23,15 +24,15 @@ if [ "${USERNAME}" == "" ]; then
|
||||
echo "---Validating installation---"
|
||||
${STEAMCMD_DIR}/steamcmd.sh \
|
||||
+@sSteamCmdForcePlatformType windows \
|
||||
+login anonymous \
|
||||
+force_install_dir ${SERVER_DIR} \
|
||||
+login anonymous \
|
||||
+app_update ${GAME_ID} validate \
|
||||
+quit
|
||||
else
|
||||
${STEAMCMD_DIR}/steamcmd.sh \
|
||||
+@sSteamCmdForcePlatformType windows \
|
||||
+login anonymous \
|
||||
+force_install_dir ${SERVER_DIR} \
|
||||
+login anonymous \
|
||||
+app_update ${GAME_ID} \
|
||||
+quit
|
||||
fi
|
||||
@@ -40,46 +41,79 @@ else
|
||||
echo "---Validating installation---"
|
||||
${STEAMCMD_DIR}/steamcmd.sh \
|
||||
+@sSteamCmdForcePlatformType windows \
|
||||
+login ${USERNAME} ${PASSWRD} \
|
||||
+force_install_dir ${SERVER_DIR} \
|
||||
+login ${USERNAME} ${PASSWRD} \
|
||||
+app_update ${GAME_ID} validate \
|
||||
+quit
|
||||
else
|
||||
${STEAMCMD_DIR}/steamcmd.sh \
|
||||
+@sSteamCmdForcePlatformType windows \
|
||||
+login ${USERNAME} ${PASSWRD} \
|
||||
+force_install_dir ${SERVER_DIR} \
|
||||
+login ${USERNAME} ${PASSWRD} \
|
||||
+app_update ${GAME_ID} \
|
||||
+quit
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "---Prepare Server---"
|
||||
echo "---Checking for 'saves' directory---"
|
||||
if [ ! -d ${SERVER_DIR}/saves ]; then
|
||||
echo "---'saves' not found creating---"
|
||||
mkdir ${SERVER_DIR}/saves
|
||||
fi
|
||||
echo "---Directory 'saves' found!---"
|
||||
|
||||
echo "---Checking for 'config.cfg'---"
|
||||
if [ ! -f ${SERVER_DIR}/config/config.cfg ]; then
|
||||
echo "---'config.cfg' not found downloading---"
|
||||
if [ ! -d ${SERVER_DIR}/config ]; then
|
||||
mkdir ${SERVER_DIR}/config
|
||||
fi
|
||||
cd ${SERVER_DIR}/config
|
||||
wget -qi ${SERVER_DIR}/config/config.cfg https://raw.githubusercontent.com/ich777/docker-steamcmd-server/theforest/config/config.cfg
|
||||
if [ -f ${SERVER_DIR}/config/config.cfg ]; then
|
||||
echo "---'config.cfg' successfully downloaded---"
|
||||
export WINEARCH=win64
|
||||
export WINEPREFIX=/serverdata/serverfiles/WINE64
|
||||
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 "---Something went wrong, can't download 'config.cfg'---"
|
||||
sleep infinity
|
||||
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
|
||||
chmod -R 770 ${DATA_DIR}
|
||||
echo "---Checking if dotnet45 is installed---"
|
||||
if [ ! -f ${SERVER_DIR}/dotnet45 ]; then
|
||||
echo "---dotnet45 not installed, please wait installing...---"
|
||||
find /tmp -name ".X99*" -exec rm -f {} \; > /dev/null 2>&1
|
||||
/opt/scripts/start-Xvfb.sh 2>/dev/null &
|
||||
echo "---...this can take some time...---"
|
||||
sleep 5
|
||||
/usr/bin/winetricks -q dotnet45 2>/dev/null
|
||||
wine64 ${SERVER_DIR}/Binaries/Win64/UDK.exe server coldmap1?steamsockets >/dev/null 2&>1 &
|
||||
sleep 10
|
||||
kill $(pidof UDK.exe)
|
||||
kill $(pidof Xvfb)
|
||||
sed -i "/^Password=/c\Password=Docker" ${SERVER_DIR}/UDKGame/Config/UDKDedServerSettings.ini
|
||||
sed -i "/^AdminPassword=/c\AdminPassword=adminDocker" ${SERVER_DIR}/UDKGame/Config/UDKDedServerSettings.ini
|
||||
sed -i "/^ServerName=/c\ServerName=Subsistence Docker" ${SERVER_DIR}/UDKGame/Config/UDKDedServerSettings.ini
|
||||
sed -i "/^ServerDescription=/c\ServerDescription=Subsistence running in Docker" ${SERVER_DIR}/UDKGame/Config/UDKDedServerSettings.ini
|
||||
sed -i "/^HostedByName=/c\HostedByName=Unraid" ${SERVER_DIR}/UDKGame/Config/UDKDedServerSettings.ini
|
||||
touch ${SERVER_DIR}/dotnet45
|
||||
echo "---Installation from dotnet45 finished!---"
|
||||
else
|
||||
echo "---dotnet45 found! Continuing...---"
|
||||
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 "---Server ready---"
|
||||
|
||||
echo "---Starting Xvfb server---"
|
||||
screen -S Xvfb -L -Logfile ${SERVER_DIR}/XvfbLog.0 -d -m /opt/scripts/start-Xvfb.sh
|
||||
sleep 5
|
||||
|
||||
echo "---Start Server---"
|
||||
cd ${SERVER_DIR}
|
||||
xvfb-run --auto-servernum --server-args='-screen 0 640x480x24:32' wine ${SERVER_DIR}/TheForestDedicatedServer.exe -batchmode -dedicated -savefolderpath "${SERVER_DIR}/saves/" -configfilepath "${SERVER_DIR}/config/config.cfg" ${GAME_PARAMS}
|
||||
if [ ! -f ${SERVER_DIR}/Binaries/Win64/UDK.exe ]; then
|
||||
echo "---Something went wrong, can't find the executable, putting container into sleep mode!---"
|
||||
sleep infinity
|
||||
else
|
||||
cd ${SERVER_DIR}/Binaries/Win64
|
||||
screen -S UDK -d -m wine64 ${SERVER_DIR}/Binaries/Win64/UDK.exe server coldmap1?steamsockets -log ${GAME_PARAMS}
|
||||
sleep 2
|
||||
/opt/scripts/start-watchdog.sh &
|
||||
tail -n 9999 -f ${SERVER_DIR}/UDKGame/Logs/Launch.log
|
||||
fi
|
8
scripts/start-watchdog.sh
Normal file
8
scripts/start-watchdog.sh
Normal file
@@ -0,0 +1,8 @@
|
||||
#!/bin/bash
|
||||
killpid="$(pidof UDK.exe)"
|
||||
while true
|
||||
do
|
||||
tail --pid=$killpid -f /dev/null
|
||||
kill "$(pidof tail)"
|
||||
exit 0
|
||||
done
|
41
scripts/start.sh
Normal file
41
scripts/start.sh
Normal file
@@ -0,0 +1,41 @@
|
||||
#!/bin/bash
|
||||
echo "---Ensuring UID: ${UID} matches user---"
|
||||
usermod -u ${UID} ${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---"
|
||||
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---"
|
||||
fi
|
||||
|
||||
echo "---Taking ownership of data...---"
|
||||
chown -R root:${GID} /opt/scripts
|
||||
chmod -R 750 /opt/scripts
|
||||
chown -R ${UID}:${GID} ${DATA_DIR}
|
||||
|
||||
echo "---Starting...---"
|
||||
term_handler() {
|
||||
kill -SIGINT $(pidof UDK.exe)
|
||||
tail --pid=$(pidof UDK.exe) -f 2>/dev/null
|
||||
exit 143;
|
||||
}
|
||||
|
||||
trap 'kill ${!}; term_handler' SIGTERM
|
||||
su ${USER} -c "/opt/scripts/start-server.sh" &
|
||||
killpid="$!"
|
||||
while true
|
||||
do
|
||||
wait $killpid
|
||||
exit 0;
|
||||
done
|
Reference in New Issue
Block a user