Compare commits

...

26 Commits

Author SHA1 Message Date
b6bd0bfd3e Dockerfile aktualisiert 2024-04-19 09:33:41 +02:00
a251a00e5a Dateien nach "scripts" hochladen 2024-04-19 09:32:24 +02:00
6081948728 scripts/start-server.sh aktualisiert 2024-04-19 09:26:32 +02:00
8ddea4eb38 Dockerfile aktualisiert 2024-04-19 09:24:08 +02:00
35546570da Dateien nach "scripts" hochladen 2024-04-19 09:21:10 +02:00
d3ac6481c9 config/ServerConfig_.ini gelöscht 2023-10-24 17:02:29 +02:00
d8445bcc49 Dateien nach "config" hochladen 2023-10-24 17:02:19 +02:00
713a899b2c Update scripts/start-server.sh 2023-07-13 08:29:20 +02:00
05f20eac1e Update scripts/start-server.sh 2023-07-13 08:09:00 +02:00
dcd70dd299 Update Dockerfile 2023-06-14 13:28:06 +02:00
a295ac337d „scripts/start.sh“ ändern 2022-10-25 10:59:28 +02:00
e712070a37 „Dockerfile“ ändern 2022-09-08 08:36:13 +02:00
fc31e10b7c „Dockerfile“ ändern 2022-05-06 09:05:58 +02:00
1cb7ab5f8b „README.md“ ändern 2022-04-18 13:07:46 +02:00
82b45708e5 Merge pull request #19 from Ornias1993/patch-1
ensure group is linked correctly
2022-04-07 16:58:05 +02:00
Kjeld Schouten-Lebbing
27f2c6ee47 Update start.sh 2022-04-07 14:36:32 +02:00
Kjeld Schouten-Lebbing
0fb3b33466 Update scripts/start.sh 2022-04-07 13:45:57 +02:00
Kjeld Schouten-Lebbing
2bcce9f74e Apply suggestions from code review
Co-authored-by: Christoph <christophhummer@gmail.com>
2022-04-07 13:17:32 +02:00
Kjeld Schouten-Lebbing
4f2d323874 shrink code and add clearer logging 2022-04-07 12:31:54 +02:00
Kjeld Schouten-Lebbing
638550d65d Update start.sh 2022-04-07 12:26:18 +02:00
Kjeld Schouten-Lebbing
58135e9a43 Update scripts/start.sh 2022-04-07 00:44:32 +02:00
Kjeld Schouten-Lebbing
5bc5d45ffb Update Dockerfile 2022-04-07 00:43:57 +02:00
Kjeld Schouten-Lebbing
8a1b43d82d Update Dockerfile 2022-04-07 00:43:50 +02:00
Kjeld Schouten-Lebbing
d8faf8d04e Support read-only user-scripts 2022-04-06 21:04:50 +02:00
Kjeld Schouten-Lebbing
6cb4fd6f96 Ensure the GID is actually dynamically assigned to a group as well. 2022-04-06 09:48:52 +02:00
Kjeld Schouten-Lebbing
25688e6709 ensure group is created in Dockerfile
This ensures a group is created inside the container before the entrypoint is triggered, as some container engines might trigger a "group not found" error assigning the GID to said group
2022-04-06 09:44:46 +02:00
6 changed files with 135 additions and 78 deletions

View File

@@ -1,11 +1,16 @@
FROM ich777/debian-baseimage FROM ich777/debian-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 && \ RUN apt-get update && \
apt-get -y install --no-install-recommends lib32gcc-s1 lib32stdc++6 && \ apt-get -y install --no-install-recommends lib32gcc-s1 lib32stdc++6 lib32z1 screen && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*
RUN wget -O /tmp/gotty.tar.gz https://github.com/yudai/gotty/releases/download/v1.0.1/gotty_linux_amd64.tar.gz && \
tar -C /usr/bin/ -xvf /tmp/gotty.tar.gz && \
rm -rf /tmp/gotty.tar.gz
ENV DATA_DIR="/serverdata" ENV DATA_DIR="/serverdata"
ENV STEAMCMD_DIR="${DATA_DIR}/steamcmd" ENV STEAMCMD_DIR="${DATA_DIR}/steamcmd"
ENV SERVER_DIR="${DATA_DIR}/serverfiles" ENV SERVER_DIR="${DATA_DIR}/serverfiles"
@@ -14,11 +19,13 @@ ENV GAME_NAME="template"
ENV GAME_PARAMS="template" ENV GAME_PARAMS="template"
ENV GAME_PORT=27015 ENV GAME_PORT=27015
ENV VALIDATE="" ENV VALIDATE=""
ENV GOTTY_PARAMS="-w --title-format SteamLogin"
ENV LOGIN_TIMEOUT=60
ENV UMASK=000 ENV UMASK=000
ENV UID=99 ENV UID=99
ENV GID=100 ENV GID=100
ENV USERNAME="" ENV USERNAME="steamuser"
ENV PASSWRD="" ENV PASSWRD="steampwd"
ENV USER="steam" ENV USER="steam"
ENV DATA_PERM=770 ENV DATA_PERM=770
@@ -33,4 +40,4 @@ ADD /scripts/ /opt/scripts/
RUN chmod -R 770 /opt/scripts/ RUN chmod -R 770 /opt/scripts/
#Server Start #Server Start
ENTRYPOINT ["/opt/scripts/start.sh"] ENTRYPOINT ["/opt/scripts/start.sh"]

View File

@@ -14,16 +14,10 @@ This Docker will download and install SteamCMD and the according game that is pu
| UID | User Identifier | 99 | | UID | User Identifier | 99 |
| GID | Group Identifier | 100 | | GID | Group Identifier | 100 |
| GAME_PORT | Port the server will be running on | 27015 | | 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 | | USERNAME | Leave blank for anonymous login | blank |
| PASSWRD | 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 for CS:Source
``` ```
docker run --name CSSource -d \ docker run --name CSSource -d \
@@ -34,17 +28,13 @@ docker run --name CSSource -d \
--env 'GAME_PARAMS=-secure +maxplayers 32 +map de_dust2' \ --env 'GAME_PARAMS=-secure +maxplayers 32 +map de_dust2' \
--env 'UID=99' \ --env 'UID=99' \
--env 'GID=100' \ --env 'GID=100' \
--volume /mnt/user/appdata/steamcmd:/serverdata/steamcmd \ --volume /path/to/steamcmd:/serverdata/steamcmd \
--volume /mnt/user/appdata/cstrikesource:/serverdata/serverfiles \ --volume /path/to/cstrikesource:/serverdata/serverfiles \
ich777/steamcmd:latest ich777/steamcmd:latest
``` ```
>**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 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. This Docker is forked from mattieserver, thank you for this wonderfull Docker.
#### Support Thread: https://forums.unraid.net/topic/79530-support-ich777-gameserver-dockers/ #### Support Thread: https://forums.unraid.net/topic/79530-support-ich777-gameserver-dockers/

9
scripts/start-gotty.sh Normal file
View File

@@ -0,0 +1,9 @@
#!/bin/bash
TERM=linux gotty ${GOTTY_PARAMS} screen -xS steamcmd &
killpid="$(pgrep screen)"
while true
do
tail --pid=$killpid -f /dev/null
kill "$(pidof gotty)"
exit 0
done

View File

@@ -1,68 +1,100 @@
#!/bin/bash #!/bin/bash
if [ ! -f ${STEAMCMD_DIR}/steamcmd.sh ]; then if [ ! -f ${STEAMCMD_DIR}/steamcmd.sh ]; then
echo "SteamCMD not found!" echo "SteamCMD not found!"
wget -q -O ${STEAMCMD_DIR}/steamcmd_linux.tar.gz http://media.steampowered.com/client/steamcmd_linux.tar.gz 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 tar --directory ${STEAMCMD_DIR} -xvzf /serverdata/steamcmd/steamcmd_linux.tar.gz
rm ${STEAMCMD_DIR}/steamcmd_linux.tar.gz rm ${STEAMCMD_DIR}/steamcmd_linux.tar.gz
fi fi
echo "---Update SteamCMD---" echo "---Update SteamCMD---"
if [ "${USERNAME}" == "" ]; then ${STEAMCMD_DIR}/steamcmd.sh \
${STEAMCMD_DIR}/steamcmd.sh \ +login anonymous \
+login anonymous \ +quit
+quit
else if [[ ! $LOGIN_TIMEOUT =~ ^[0-9]+$ ]]; then
${STEAMCMD_DIR}/steamcmd.sh \ echo "LOGIN_TIMEOUT must be a integer, putting container into sleep mode!"
+login ${USERNAME} ${PASSWRD} \ sleep infinity
+quit
fi fi
echo "---Update Server---" if [ "$LOGIN_TIMEOUT" -gt 0 ]; then
if [ "${USERNAME}" == "" ]; then echo "---Update Server---"
if [ "${VALIDATE}" == "true" ]; then if [ "$LOGIN_TIMEOUT" -lt 5 ]; then
echo "---Validating installation---" echo "LOGIN_TIMEOUT must be greater than 5 seconds, changing to 30!"
${STEAMCMD_DIR}/steamcmd.sh \ LOGIN_TIMEOUT=30
+force_install_dir ${SERVER_DIR} \ fi
+login anonymous \
+app_update ${GAME_ID} validate \ if [ ! -f ~/.screenrc ]; then
+quit echo "defscrollback 30000
bindkey \"^C\" echo 'Blocked. Close this window to exit the terminal.'" > ~/.screenrc
fi
screen -wipe 2&>/dev/null
if [ ! -d ${DATA_DIR}/Steam/logs ]; then
mkdir -p ${DATA_DIR}/Steam/logs
elif [ -f ${DATA_DIR}/Steam/logs/steamcmd.log ]; then
rm -f ${DATA_DIR}/Steam/logs/steamcmd.log
fi
screen -S steamcmd -L -Logfile ${DATA_DIR}/Steam/logs/steamcmd.log -d -m \
${STEAMCMD_DIR}/steamcmd.sh \
+force_install_dir ${SERVER_DIR} \
+login ${USERNAME} ${PASSWRD} \
+app_update ${GAME_ID} \
+quit
sleep 1
/opt/scripts/start-gotty.sh >/dev/null 2>&1 &
echo "+----------------------------------------------------------------------"
echo "| Please connect to the built in SteamCMD web console (not the Docker"
echo "| console) and enter your 2FA token if you have SteamGuard enabled."
echo "|"
echo "| You can close the SteamCMD web console after entering the 2FA token."
echo "+----------------------------------------------------------------------"
echo
echo "Waiting $LOGIN_TIMEOUT seconds for login..."
echo
ELAPSED_TIME=0
while [ $ELAPSED_TIME -lt $LOGIN_TIMEOUT ]; do
if grep -q "Waiting for user info...OK" ${DATA_DIR}/Steam/logs/steamcmd.log; then
echo "Login successfull, continuing, please wait..."
sed -i 's/^Two-factor code:.*/Two-factor code:\*HIDDEN\*/' ${DATA_DIR}/Steam/logs/steamcmd.log
/opt/scripts/start-tail.sh
rm -f ${DATA_DIR}/Steam/logs/steamcmd.log
screen -wipe 2&>/dev/null
LOGINOK="true"
break
else else
${STEAMCMD_DIR}/steamcmd.sh \ sleep 2
+force_install_dir ${SERVER_DIR} \ ((ELAPSED_TIME += 2))
+login anonymous \
+app_update ${GAME_ID} \
+quit
fi fi
done
if [ "$LOGINOK" != "true" ]; then
echo "Login Failed after $LOGIN_TIMEOUT seconds, continuing..."
kill -SIGKILL $(pgrep screen) >/dev/null 2>&1
kill -SIGKILL $(pidof gotty) >/dev/null 2>&1
sed -i 's/^Two-factor code:.*/Two-factor code:\*HIDDEN\*/' ${DATA_DIR}/Steam/logs/steamcmd.log
cat ${DATA_DIR}/Steam/logs/steamcmd.log
rm -f ${DATA_DIR}/Steam/logs/steamcmd.log >/dev/null 2>&1
screen -wipe 2&>/dev/null
fi
else else
if [ "${VALIDATE}" == "true" ]; then echo "LOGIN_TIMEOUT set to 0, Update Server skipped!"
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
fi fi
export USERNAME="secret"
export PASSWRD="secret"
echo "---Prepare Server---" 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/
fi
chmod -R ${DATA_PERM} ${DATA_DIR} chmod -R ${DATA_PERM} ${DATA_DIR}
echo "---Server ready---" echo "---Server ready---"
echo "---Start Server---" echo "---Start Server---"
cd ${SERVER_DIR}
${SERVER_DIR}/srcds_run -game ${GAME_NAME} ${GAME_PARAMS} -console +port ${GAME_PORT} echo
echo "---Putting container into sleep mode zZzZzZzZz---"
sleep infinity

14
scripts/start-tail.sh Normal file
View File

@@ -0,0 +1,14 @@
#!/bin/bash
tail -n 100 -f ${DATA_DIR}/Steam/logs/steamcmd.log
sleep 5
killpid="$(pidof gotty)"
while true
do
if [ -z "$killpid" ]; then
kill $(pidof tail)
exit 0
fi
tail --pid=$killpid -f /dev/null
kill $(pidof tail)
exit 0
done

View File

@@ -1,25 +1,30 @@
#!/bin/bash #!/bin/bash
echo "---Checking if UID: ${UID} matches user---" echo "---Ensuring UID: ${UID} matches user---"
usermod -u ${UID} ${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} usermod -g ${GID} ${USER}
echo "---Setting umask to ${UMASK}---" echo "---Setting umask to ${UMASK}---"
umask ${UMASK} umask ${UMASK}
echo "---Checking for optional scripts---" echo "---Checking for optional scripts---"
if [ -f /opt/scripts/user.sh ]; then cp -f /opt/custom/user.sh /opt/scripts/start-user.sh > /dev/null 2>&1 ||:
echo "---Found optional script, executing---" cp -f /opt/scripts/user.sh /opt/scripts/start-user.sh > /dev/null 2>&1 ||:
chmod +x /opt/scripts/user.sh
/opt/scripts/user.sh 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 else
echo "---No optional script found, continuing---" echo "---No optional script found, continuing---"
fi fi
echo "---Starting...---" echo "---Taking ownership of data...---"
chown -R root:${GID} /opt/scripts chown -R root:${GID} /opt/scripts
chmod -R 750 /opt/scripts chmod -R 750 /opt/scripts
chown -R ${UID}:${GID} ${DATA_DIR} chown -R ${UID}:${GID} ${DATA_DIR}
echo "---Starting...---"
term_handler() { term_handler() {
kill -SIGTERM "$killpid" kill -SIGTERM "$killpid"
wait "$killpid" -f 2>/dev/null wait "$killpid" -f 2>/dev/null
@@ -33,4 +38,4 @@ while true
do do
wait $killpid wait $killpid
exit 0; exit 0;
done done