From 83a39f510d678fd491d47222c5f21d62cca59013 Mon Sep 17 00:00:00 2001 From: gOOvER Date: Fri, 15 Dec 2023 16:50:44 +0100 Subject: [PATCH] add bannerlord image --- .github/workflows/games.yml | 1 + games/bannerlord/Dockerfile | 143 +++++++++++++++++++++++++++++++++ games/bannerlord/entrypoint.sh | 116 ++++++++++++++++++++++++++ 3 files changed, 260 insertions(+) create mode 100644 games/bannerlord/Dockerfile create mode 100644 games/bannerlord/entrypoint.sh diff --git a/.github/workflows/games.yml b/.github/workflows/games.yml index 9183662..9ac5e13 100644 --- a/.github/workflows/games.yml +++ b/.github/workflows/games.yml @@ -23,6 +23,7 @@ jobs: matrix: game: - altv + - bannerlord - conan - dayz - interstellarrift diff --git a/games/bannerlord/Dockerfile b/games/bannerlord/Dockerfile new file mode 100644 index 0000000..5a30ec8 --- /dev/null +++ b/games/bannerlord/Dockerfile @@ -0,0 +1,143 @@ +FROM --platform=$BUILDPLATFORM debian:bookworm-slim + +LABEL author="Torsten Widmann" maintainer="info@goover.de" +LABEL org.opencontainers.image.source="https://github.com/gOOvER/own-pterodactyl-images" +LABEL org.opencontainers.image.licenses=MIT + +# Update the repository and install needed packages +ARG DEBIAN_FRONTEND=noninteractive +COPY sources.list /etc/apt/sources.list +RUN dpkg --add-architecture i386 +RUN apt update \ + && apt -y upgrade + +RUN apt install -y --install-recommends \ + ca-certificates \ + curl \ + dbus \ + dirmngr \ + g++ \ + gcc \ + gdb \ + gettext \ + git \ + gnupg \ + iproute2 \ + jq \ + locales \ + mesa-utils \ + net-tools \ + netcat-openbsd \ + numactl \ + psmisc \ + python3 \ + python3-dev \ + python3-pip \ + sed \ + speex:i386 \ + tar \ + telnet \ + tini \ + tzdata \ + wget \ + lib32gcc-s1 \ + libgcc-s1 \ + lib32stdc++6 \ + lib32tinfo6 \ + lib32z1 \ + libasound2 \ + libatk1.0-0 \ + libatomic1 \ + libc++-dev \ + libc++1 \ + libc6 \ + libc6:i386 \ + libcurl3-gnutls \ + libcurl3-gnutls:i386 \ + libcurl4-gnutls-dev \ + libcurl4-gnutls-dev:i386 \ + libcurl4 \ + libcurl4:i386 \ + libfontconfig \ + libgcc1 \ + libgconf-2-4 \ + libgdiplus \ + libgtk2.0-0:i386 \ + libjemalloc2 \ + libjemalloc2:i386 \ + libnss3 \ + libnss-wrapper \ + libpangocairo-1.0-0 \ + libpulse-dev \ + libpulse0 \ + libsdl1.2debian \ + libsdl1.2debian:i386 \ + libsdl1.2-compat \ + libsdl1.2-compat:i386 \ + libsdl2-2.0-0 \ + libsdl2-2.0-0:i386 \ + libssl3 \ + libssl3:i386 \ + libstdc++6 \ + libstdc++6:i386 \ + libtcmalloc-minimal4 \ + libtcmalloc-minimal4:i386 \ + libtinfo6:i386 \ + libxcomposite1 \ + libxcursor1 \ + libxdamage1 \ + libxi6 \ + libxrandr2 \ + libxss1 \ + libxtst6 + +## install dotnet to support STEAM dotnet games +RUN apt update -y \ + && apt upgrade -y \ + && wget https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -O packages-microsoft-prod.deb \ + && dpkg -i packages-microsoft-prod.deb \ + && rm packages-microsoft-prod.deb \ + && apt update -y \ + && apt install -y \ + aspnetcore-runtime-6.0 \ + dotnet-sdk-6.0 + +## install Mono +RUN gpg --homedir /tmp --no-default-keyring --keyring /usr/share/keyrings/mono-official-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF +RUN echo "deb [signed-by=/usr/share/keyrings/mono-official-archive-keyring.gpg] https://download.mono-project.com/repo/debian stable-buster main" | tee /etc/apt/sources.list.d/mono-official-stable.list +RUN apt update +RUN apt install -y mono-complete + +## install rcon +RUN cd /tmp/ \ + && curl -sSL https://github.com/gorcon/rcon-cli/releases/download/v0.10.3/rcon-0.10.3-amd64_linux.tar.gz > rcon.tar.gz \ + && tar xvf rcon.tar.gz \ + && mv rcon-0.10.3-amd64_linux/rcon /usr/local/bin/ + +# 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 + +## Prepare NSS Wrapper for the entrypoint as a workaround for games requiring a valid UID +ENV NSS_WRAPPER_PASSWD=/tmp/passwd NSS_WRAPPER_GROUP=/tmp/group +RUN touch ${NSS_WRAPPER_PASSWD} ${NSS_WRAPPER_GROUP} \ + && chgrp 0 ${NSS_WRAPPER_PASSWD} ${NSS_WRAPPER_GROUP} \ + && chmod g+rw ${NSS_WRAPPER_PASSWD} ${NSS_WRAPPER_GROUP} +ADD passwd.template /passwd.template + +## Setup user and working directory +RUN useradd -m -d /home/container -s /bin/bash container +USER container +ENV USER=container HOME=/home/container +WORKDIR /home/container + +# Sets the default stop signal as wings can (currently) only send a kill or generic stop +STOPSIGNAL SIGINT + +COPY --chown=container:container ../entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh +ENTRYPOINT ["/usr/bin/tini", "-g", "--"] +CMD ["/entrypoint.sh"] \ No newline at end of file diff --git a/games/bannerlord/entrypoint.sh b/games/bannerlord/entrypoint.sh new file mode 100644 index 0000000..78695aa --- /dev/null +++ b/games/bannerlord/entrypoint.sh @@ -0,0 +1,116 @@ +#!/bin/bash + +clear +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +# Wait for the container to fully initialize +sleep 1 + +# Default the TZ environment variable to UTC. +TZ=${TZ:-UTC} +export TZ + +# Set environment variable that holds the Internal Docker IP +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP + +# Information output +if [ -f "/usr/local/bin/proton" ]; then + echo -e "${BLUE}-------------------------------------------------${NC}" + echo -e "${RED}SteamCMD Proton Image by gOOvER${NC}" + echo -e "${BLUE}-------------------------------------------------${NC}" + echo -e "${YELLOW}Running on Debian: ${RED} $(cat /etc/debian_version)${NC}" + echo -e "${YELLOW}Current timezone: ${RED} $(cat /etc/timezone)${NC}" + echo -e "${BLUE}-------------------------------------------------${NC}" +else + echo -e "${BLUE}-------------------------------------------------${NC}" + echo -e "${RED}SteamCMD Image by gOOvER${NC}" + echo -e "${BLUE}-------------------------------------------------${NC}" + echo -e "${YELLOW}Running on Debian: ${RED} $(cat /etc/debian_version)${NC}" + echo -e "${YELLOW}Current timezone: ${RED} $(cat /etc/timezone)${NC}" + echo -e "${YELLOW}DotNet Version: ${RED} $(dotnet --version) ${NC}" + echo -e "${BLUE}-------------------------------------------------${NC}" +fi + +# Set environment for Steam Proton +if [ -f "/usr/local/bin/proton" ]; then + if [ ! -z ${SRCDS_APPID} ]; then + mkdir -p /home/container/.steam/steam/steamapps/compatdata/${SRCDS_APPID} + export STEAM_COMPAT_CLIENT_INSTALL_PATH="/home/container/.steam/steam" + export STEAM_COMPAT_DATA_PATH="/home/container/.steam/steam/steamapps/compatdata/${SRCDS_APPID}" + export WINETRICKS="/usr/sbin/winetricks" + + else + echo -e "${BLUE}----------------------------------------------------------------------------------${NC}" + echo -e "${RED}WARNING!!! Proton needs variable SRCDS_APPID, else it will not work. Please add it${NC}" + echo -e "${RED}Server stops now${NC}" + echo -e "${BLUE}----------------------------------------------------------------------------------${NC}" + exit 0 + fi +fi + +# Switch to the container's working directory +cd /home/container || exit 1 + +# writing dotnet infos to file + +dotnetinfo=$(dotnet --info) +echo $dotnetinfo >| dotnet_info.txt + +echo -e "${BLUE}-------------------------------------------------${NC}" +echo -e "${GREEN}Starting Server.... Please wait...${NC}" +echo -e "${BLUE}-------------------------------------------------${NC}" + +## just in case someone removed the defaults. +if [ "${STEAM_USER}" == "" ]; then + echo -e "${BLUE}-------------------------------------------------${NC}" + echo -e "${YELLOW}Steam user is not set. ${NC}" + echo -e "${YELLOW}Using anonymous user.${NC}" + echo -e "${BLUE}-------------------------------------------------${NC}" + STEAM_USER=anonymous + STEAM_PASS="" + STEAM_AUTH="" +else + echo -e "${BLUE}-------------------------------------------------${NC}" + echo -e "${YELLOW}user set to ${STEAM_USER} ${NC}" + echo -e "${BLUE}-------------------------------------------------${NC}" +fi + +## if auto_update is not set or to 1 update +if [ -z ${AUTO_UPDATE} ] || [ "${AUTO_UPDATE}" == "1" ]; then + # Update Source Server + if [ ! -z ${SRCDS_APPID} ]; then + if [ "${STEAM_USER}" == "anonymous" ]; then + ./steamcmd/steamcmd.sh +force_install_dir /home/container +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} $( [[ "${WINDOWS_INSTALL}" == "1" ]] && printf %s '+@sSteamCmdForcePlatformType windows' ) +app_update ${SRCDS_APPID} $( [[ -z ${SRCDS_BETAID} ]] || printf %s "-beta ${SRCDS_BETAID}" ) $( [[ -z ${SRCDS_BETAPASS} ]] || printf %s "-betapassword ${SRCDS_BETAPASS}" ) $( [[ -z ${HLDS_GAME} ]] || printf %s "+app_set_config 90 mod ${HLDS_GAME}" ) $( [[ -z ${VALIDATE} ]] || printf %s "validate" ) +quit + else + numactl --physcpubind=+0 ./steamcmd/steamcmd.sh +force_install_dir /home/container +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} $( [[ "${WINDOWS_INSTALL}" == "1" ]] && printf %s '+@sSteamCmdForcePlatformType windows' ) +app_update ${SRCDS_APPID} $( [[ -z ${SRCDS_BETAID} ]] || printf %s "-beta ${SRCDS_BETAID}" ) $( [[ -z ${SRCDS_BETAPASS} ]] || printf %s "-betapassword ${SRCDS_BETAPASS}" ) $( [[ -z ${HLDS_GAME} ]] || printf %s "+app_set_config 90 mod ${HLDS_GAME}" ) $( [[ -z ${VALIDATE} ]] || printf %s "validate" ) +quit + fi + else + echo -e "${BLUE}-------------------------------------------------${NC}" + echo -e "${YELLOW}No appid set. Starting Server${NC}" + echo -e "${BLUE}-------------------------------------------------${NC}" + fi + +else + echo -e "${BLUE}---------------------------------------------------------------${NC}" + echo -e "${YELLOW}Not updating game server as auto update was set to 0. Starting Server${NC}" + echo -e "${BLUE}---------------------------------------------------------------${NC}" +fi + +# Setup NSS Wrapper for use ($NSS_WRAPPER_PASSWD and $NSS_WRAPPER_GROUP have been set by the Dockerfile) +export USER_ID=$(id -u) +export GROUP_ID=$(id -g) +envsubst < /passwd.template > ${NSS_WRAPPER_PASSWD} + +export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libnss_wrapper.so + +# Replace Startup Variables +MODIFIED_STARTUP=$(echo -e ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g') +echo -e ":/home/container$ ${MODIFIED_STARTUP}" + +# Run the Server +eval ${MODIFIED_STARTUP}