diff --git a/.github/workflows/games.yml b/.github/workflows/games.yml index f0ab6cd..a6e4a38 100644 --- a/.github/workflows/games.yml +++ b/.github/workflows/games.yml @@ -18,6 +18,7 @@ jobs: game: - altv - arma3 + - dayz - mohaa - samp - source diff --git a/README.md b/README.md index 98b78c1..2cfa90c 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,8 @@ is tagged correctly. * `ghcr.io/parkervcp/games:altv` * [`arma3`](/games/arma3) * `ghcr.io/parkervcp/games:arma3` +* [`dayz`](/games/dayz) + * `ghcr.io/parkervcp/games:dayz` * [`mohaa`](games/mohaa) * `ghcr.io/pterodactyl/games:mohaa` * [`samp`](/games/samp) diff --git a/bot/bastion/Dockerfile b/bot/bastion/Dockerfile index 18390f3..00d5508 100644 --- a/bot/bastion/Dockerfile +++ b/bot/bastion/Dockerfile @@ -1,7 +1,7 @@ -FROM node:14-buster +FROM --platform=$TARGETOS/$TARGETARCH node:14-buster LABEL author="Michael Parker" maintainer="parker@pterodactyl.io" - ## install mongo +## install mongo RUN wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | apt-key add - \ && echo "deb http://repo.mongodb.org/apt/debian buster/mongodb-org/4.2 main" | tee /etc/apt/sources.list.d/mongodb-org-4.2.list \ && apt update \ diff --git a/bot/parkertron/Dockerfile b/bot/parkertron/Dockerfile index d87f516..87fc60a 100644 --- a/bot/parkertron/Dockerfile +++ b/bot/parkertron/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.9 +FROM --platform=$TARGETOS/$TARGETARCH alpine:3.9 LABEL author="Michael Parker" maintainer="parker@pterodactyl.io" diff --git a/bot/red/Dockerfile b/bot/red/Dockerfile index 29cf0a9..92f9d98 100644 --- a/bot/red/Dockerfile +++ b/bot/red/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.8-slim +FROM --platform=$TARGETOS/$TARGETARCH python:3.8-slim LABEL author="Michael Parker" maintainer="parker@pterodactyl.io" diff --git a/bot/sinusbot/Dockerfile b/bot/sinusbot/Dockerfile index bbc4a92..63afc17 100644 --- a/bot/sinusbot/Dockerfile +++ b/bot/sinusbot/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:18.04 +FROM --platform=$TARGETOS/$TARGETARCH ubuntu:18.04 LABEL maintainer="ki2007 " version="1.0" diff --git a/cassandra/java11_python3/Dockerfile b/cassandra/java11_python3/Dockerfile index 785ad40..4f5ddb3 100644 --- a/cassandra/java11_python3/Dockerfile +++ b/cassandra/java11_python3/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM adoptopenjdk/openjdk11:alpine-jre +FROM --platform=$TARGETOS/$TARGETARCH adoptopenjdk/openjdk11:alpine-jre LABEL author="Pascal Zarrad" maintainer="p.zarrad@outlook.de" diff --git a/cassandra/java8_python2/Dockerfile b/cassandra/java8_python2/Dockerfile index 1c8260c..32770f4 100644 --- a/cassandra/java8_python2/Dockerfile +++ b/cassandra/java8_python2/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM adoptopenjdk/openjdk8:alpine-jre +FROM --platform=$TARGETOS/$TARGETARCH adoptopenjdk/openjdk8:alpine-jre LABEL author="Pascal Zarrad" maintainer="p.zarrad@outlook.de" diff --git a/dotnet/2.1/Dockerfile b/dotnet/2.1/Dockerfile index f85a2c4..440f50b 100644 --- a/dotnet/2.1/Dockerfile +++ b/dotnet/2.1/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM ghcr.io/parkervcp/yolks:debian +FROM --platform=$TARGETOS/$TARGETARCH ghcr.io/parkervcp/yolks:debian LABEL author="Torsten Widmann" maintainer="info@goover.de" diff --git a/dotnet/3.1/Dockerfile b/dotnet/3.1/Dockerfile index 1dae74c..f655e82 100644 --- a/dotnet/3.1/Dockerfile +++ b/dotnet/3.1/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM ghcr.io/parkervcp/yolks:debian +FROM --platform=$TARGETOS/$TARGETARCH ghcr.io/parkervcp/yolks:debian LABEL author="Torsten Widmann" maintainer="info@goover.de" diff --git a/dotnet/5/Dockerfile b/dotnet/5/Dockerfile index 934d73e..2fe9f19 100644 --- a/dotnet/5/Dockerfile +++ b/dotnet/5/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM ghcr.io/parkervcp/yolks:debian +FROM --platform=$TARGETOS/$TARGETARCH ghcr.io/parkervcp/yolks:debian LABEL author="Torsten Widmann" maintainer="info@goover.de" diff --git a/dotnet/6/Dockerfile b/dotnet/6/Dockerfile index 38307bd..7880a3e 100644 --- a/dotnet/6/Dockerfile +++ b/dotnet/6/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM ghcr.io/parkervcp/yolks:debian +FROM --platform=$TARGETOS/$TARGETARCH ghcr.io/parkervcp/yolks:debian LABEL author="Torsten Widmann" maintainer="info@goover.de" diff --git a/erlang/22/Dockerfile b/erlang/22/Dockerfile index ca64333..c391152 100644 --- a/erlang/22/Dockerfile +++ b/erlang/22/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM erlang:22-alpine +FROM --platform=$TARGETOS/$TARGETARCH erlang:22-alpine LABEL author="Pascal Zarrad" maintainer="p.zarrad@outlook.de" diff --git a/erlang/23/Dockerfile b/erlang/23/Dockerfile index 2349293..10d4cd1 100644 --- a/erlang/23/Dockerfile +++ b/erlang/23/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM erlang:23-alpine +FROM --platform=$TARGETOS/$TARGETARCH erlang:23-alpine LABEL author="Pascal Zarrad" maintainer="p.zarrad@outlook.de" diff --git a/erlang/24/Dockerfile b/erlang/24/Dockerfile index fff015f..ea47ef4 100644 --- a/erlang/24/Dockerfile +++ b/erlang/24/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM erlang:24-alpine +FROM --platform=$TARGETOS/$TARGETARCH erlang:24-alpine LABEL author="Pascal Zarrad" maintainer="p.zarrad@outlook.de" diff --git a/games/altv/Dockerfile b/games/altv/Dockerfile index a71b4ca..1126862 100644 --- a/games/altv/Dockerfile +++ b/games/altv/Dockerfile @@ -1,7 +1,7 @@ # ---------------------------------- # Environment: debian # ---------------------------------- -FROM node:16-bullseye +FROM --platform=$TARGETOS/$TARGETARCH node:16-bullseye LABEL author="goover" maintainer="info@goover.de" @@ -19,7 +19,7 @@ RUN wget https://packages.microsoft.com/config/debian/11/packages-microsoft- && dpkg -i packages-microsoft-prod.deb \ && apt update -y \ && apt install -y dotnet-sdk-5.0 dotnet-sdk-6.0 libgdiplus - + RUN update-locale lang=en_US.UTF-8 \ && dpkg-reconfigure --frontend noninteractive locales diff --git a/games/arma3/Dockerfile b/games/arma3/Dockerfile index 49ec2a8..82ba373 100644 --- a/games/arma3/Dockerfile +++ b/games/arma3/Dockerfile @@ -1,29 +1,51 @@ -FROM ubuntu:20.04 +FROM --platform=$TARGETOS/$TARGETARCH debian:stable-slim LABEL author="David Wolfe (Red-Thirten)" maintainer="rehlmgaming@gmail.com" -ENV DEBIAN_FRONTEND noninteractive -ENV USER_NAME container -ENV NSS_WRAPPER_PASSWD /tmp/passwd -ENV NSS_WRAPPER_GROUP /tmp/group -# Install Dependencies +LABEL org.opencontainers.image.source="https://github.com/parkervcp/yolks" +LABEL org.opencontainers.image.licenses=MIT + +## Update base packages and install dependencies +ENV DEBIAN_FRONTEND=noninteractive RUN dpkg --add-architecture i386 \ && apt-get update \ && apt-get upgrade -y \ - && apt-get install -y libgcc-10-dev libstdc++-10-dev libtinfo5 lib64z1 libcurl3-gnutls \ - && apt-get install -y libnss-wrapper gettext-base tar curl gcc g++ libc6 libtbb2 lib32z1 lib32gcc1 lib32stdc++6 libsdl2-2.0-0 libsdl2-2.0-0:i386 libtbb2:i386 lib32stdc++6 libtinfo5:i386 libncurses5:i386 libcurl3-gnutls:i386 tzdata \ - && useradd -m -d /home/container -s /bin/bash container \ - && touch ${NSS_WRAPPER_PASSWD} ${NSS_WRAPPER_GROUP} \ + && apt-get install -y \ + curl \ + tzdata \ + locales \ + iproute2 \ + gettext-base \ + ca-certificates \ + libssl-dev \ + lib32gcc-s1 \ + libsdl2-2.0-0 \ + libsdl2-2.0-0:i386 \ + libstdc++6 \ + libstdc++6:i386 \ + lib32stdc++6 \ + libnss-wrapper \ + libnss-wrapper:i386 \ + libtbb2 \ + libtbb2:i386 + +## Configure locale +RUN update-locale lang=en_US.UTF-8 \ + && dpkg-reconfigure --frontend noninteractive locales + +## Prepare NSS Wrapper for the entrypoint as a workaround for Arma 3 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 HOME /home/container +ENV USER=container HOME=/home/container WORKDIR /home/container -COPY ./libnss_wrapper.so /libnss_wrapper.so -COPY ./libnss_wrapper_x64.so /libnss_wrapper_x64.so +## Copy over and execute entrypoint.sh COPY ./entrypoint.sh /entrypoint.sh -CMD ["/bin/bash", "/entrypoint.sh"] +CMD [ "/bin/bash", "/entrypoint.sh" ] diff --git a/games/arma3/entrypoint.sh b/games/arma3/entrypoint.sh index d01b9a4..b9925d4 100644 --- a/games/arma3/entrypoint.sh +++ b/games/arma3/entrypoint.sh @@ -2,8 +2,8 @@ ## File: Pterodactyl Arma 3 Image - entrypoint.sh ## Author: David Wolfe (Red-Thirten) -## Contributors: Aussie Server Hosts (https://aussieserverhosts.com/) -## Date: 2021/07/13 +## Contributors: Aussie Server Hosts (https://aussieserverhosts.com/), Stephen White (SilK) +## Date: 2022/05/22 ## License: MIT License ## === CONSTANTS === @@ -167,12 +167,15 @@ function RemoveDuplicates { #[Input: str - Output: printf of new str] # === ENTRYPOINT START === +# Wait for the container to fully initialize +sleep 1 + # Set environment variable that holds the Internal Docker IP INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') export INTERNAL_IP -cd /home/container -sleep 1 +# Switch to the container's working directory +cd /home/container || exit 1 # Check for old eggs if [[ -z ${VALIDATE_SERVER} ]]; then # VALIDATE_SERVER was not in the previous version @@ -350,15 +353,15 @@ if [[ ! -f ./basic.cfg ]]; then curl -sSL ${BASIC_URL} -o ./basic.cfg fi -# $NSS_WRAPPER_PASSWD and $NSS_WRAPPER_GROUP have been set by the Dockerfile +# 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} -if [[ ${SERVER_BINARY} == *"x64"* ]]; then # Check which libnss_wrapper architecture to run, based off the server binary name - export LD_PRELOAD=/libnss_wrapper_x64.so +if [[ ${SERVER_BINARY} == *"x64"* ]]; then # Check which libnss-wrapper architecture to run, based off the server binary name + export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libnss_wrapper.so else - export LD_PRELOAD=/libnss_wrapper.so + export LD_PRELOAD=/usr/lib/i386-linux-gnu/libnss_wrapper.so fi # Replace Startup Variables diff --git a/games/arma3/libnss_wrapper.so b/games/arma3/libnss_wrapper.so deleted file mode 100644 index 8f32e83..0000000 Binary files a/games/arma3/libnss_wrapper.so and /dev/null differ diff --git a/games/arma3/libnss_wrapper_x64.so b/games/arma3/libnss_wrapper_x64.so deleted file mode 100644 index 8f7438a..0000000 Binary files a/games/arma3/libnss_wrapper_x64.so and /dev/null differ diff --git a/games/arma3/passwd.template b/games/arma3/passwd.template index ace1d78..2b0dd45 100644 --- a/games/arma3/passwd.template +++ b/games/arma3/passwd.template @@ -23,4 +23,4 @@ systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false syslog:x:104:108::/home/syslog:/bin/false messagebus:x:106:109::/var/run/dbus:/bin/false bind:x:108:112::/var/cache/bind:/bin/false -${USER_NAME}:x:${USER_ID}:${GROUP_ID}:${USER_NAME}:${HOME}:/bin/bash \ No newline at end of file +${USER}:x:${USER_ID}:${GROUP_ID}:${USER}:${HOME}:/bin/bash \ No newline at end of file diff --git a/games/dayz/Dockerfile b/games/dayz/Dockerfile new file mode 100644 index 0000000..55d074e --- /dev/null +++ b/games/dayz/Dockerfile @@ -0,0 +1,49 @@ +FROM --platform=$BUILDPLATFORM debian:stable-slim + +LABEL author="David Wolfe (Red-Thirten)" maintainer="rehlmgaming@gmail.com" + +LABEL org.opencontainers.image.source="https://github.com/parkervcp/yolks" +LABEL org.opencontainers.image.licenses=MIT + +## Update base packages and install dependencies +ENV DEBIAN_FRONTEND=noninteractive +RUN dpkg --add-architecture i386 \ + && apt update \ + && apt upgrade -y \ + && apt install -y \ + curl \ + tzdata \ + locales \ + iproute2 \ + gettext-base \ + ca-certificates \ + libssl-dev \ + lib32gcc-s1 \ + libsdl2-2.0-0 \ + libsdl2-2.0-0:i386 \ + libstdc++6 \ + libstdc++6:i386 \ + lib32stdc++6 \ + libcap2 \ + libnss-wrapper + +## Configure locale +RUN update-locale lang=en_US.UTF-8 \ + && dpkg-reconfigure --frontend noninteractive locales + +## Prepare NSS Wrapper for the entrypoint as a workaround for Arma 3 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 + +## Copy over and execute entrypoint.sh +COPY ./entrypoint.sh /entrypoint.sh +CMD [ "/bin/bash", "/entrypoint.sh" ] diff --git a/games/dayz/README.md b/games/dayz/README.md new file mode 100644 index 0000000..f13724e --- /dev/null +++ b/games/dayz/README.md @@ -0,0 +1,2 @@ +# DayZ +Docker container designed to run Bohemia Interactive's DayZ dedicated server. diff --git a/games/dayz/entrypoint.sh b/games/dayz/entrypoint.sh new file mode 100644 index 0000000..9460d30 --- /dev/null +++ b/games/dayz/entrypoint.sh @@ -0,0 +1,284 @@ +#!/bin/bash + +## File: Pterodactyl DayZ SA Image - entrypoint.sh +## Author: David Wolfe (Red-Thirten) +## Contributors: Aussie Server Hosts (https://aussieserverhosts.com/) +## Date: 2022/05/22 +## License: MIT License + +## === CONSTANTS === +STEAMCMD_DIR="./steamcmd" # SteamCMD's directory containing steamcmd.sh +STEAMCMD_LOG="${STEAMCMD_DIR}/steamcmd.log" # Log file for SteamCMD +GAME_ID=221100 # SteamCMD ID for the DayZ SA GAME (not server). Only used for Workshop mod downloads. + +# Color Codes +CYAN='\033[0;36m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +NC='\033[0m' # No Color + +## === ENVIRONMENT VARS === +# STARTUP, STARTUP_PARAMS, STEAM_USER, STEAM_PASS, SERVER_BINARY, MOD_FILE, MODIFICATIONS, SERVERMODS, UPDATE_SERVER, VALIDATE_SERVER, MODS_LOWERCASE, STEAMCMD_EXTRA_FLAGS, STEAMCMD_APPID, SERVER_PASSWORD, STEAMCMD_ATTEMPTS, DISABLE_MOD_UPDATES + +## === GLOBAL VARS === +# validateServer, extraFlags, updateAttempt, modifiedStartup, allMods, CLIENT_MODS + +## === DEFINE FUNCTIONS === + +# Runs SteamCMD with specified variables and performs error handling. +function RunSteamCMD { #[Input: int server=0 mod=1; int id] + # Clear previous SteamCMD log + if [[ -f "${STEAMCMD_LOG}" ]]; then + rm -f "${STEAMCMD_LOG:?}" + fi + + updateAttempt=0 + while (( $updateAttempt < $STEAMCMD_ATTEMPTS )); do # Loop for specified number of attempts + # Increment attempt counter + updateAttempt=$((updateAttempt+1)) + + if (( $updateAttempt > 1 )); then # Notify if not first attempt + echo -e "\t${YELLOW}Re-Attempting download/update in 3 seconds...${NC} (Attempt ${CYAN}${updateAttempt}${NC} of ${CYAN}${STEAMCMD_ATTEMPTS}${NC})\n" + sleep 3 + fi + + # Check if updating server or mod + if [[ $1 == 0 ]]; then # Server + ${STEAMCMD_DIR}/steamcmd.sh +force_install_dir /home/container "+login \"${STEAM_USER}\" \"${STEAM_PASS}\"" +app_update $2 $extraFlags $validateServer +quit | tee -a "${STEAMCMD_LOG}" + else # Mod + ${STEAMCMD_DIR}/steamcmd.sh "+login \"${STEAM_USER}\" \"${STEAM_PASS}\"" +workshop_download_item $GAME_ID $2 +quit | tee -a "${STEAMCMD_LOG}" + fi + + # Error checking for SteamCMD + steamcmdExitCode=${PIPESTATUS[0]} + if [[ -n $(grep -i "error\|failed" "${STEAMCMD_LOG}" | grep -iv "setlocal\|SDL") ]]; then # Catch errors (ignore setlocale and SDL warnings) + # Soft errors + if [[ -n $(grep -i "Timeout downloading item" "${STEAMCMD_LOG}") ]]; then # Mod download timeout + echo -e "\n${YELLOW}[UPDATE]: ${NC}Timeout downloading Steam Workshop mod: \"${CYAN}${modName}${NC}\" (${CYAN}${2}${NC})" + echo -e "\t(This is expected for particularly large mods)" + elif [[ -n $(grep -i "0x402\|0x6\|0x602" "${STEAMCMD_LOG}") ]]; then # Connection issue with Steam + echo -e "\n${YELLOW}[UPDATE]: ${NC}Connection issue with Steam servers." + echo -e "\t(Steam servers may currently be down, or a connection cannot be made reliably)" + # Hard errors + elif [[ -n $(grep -i "Password check for AppId" "${STEAMCMD_LOG}") ]]; then # Incorrect beta branch password + echo -e "\n${RED}[UPDATE]: ${YELLOW}Incorrect password given for beta branch. ${CYAN}Skipping download...${NC}" + echo -e "\t(Check your \"[ADVANCED] EXTRA FLAGS FOR STEAMCMD\" startup parameter)" + break + # Fatal errors + elif [[ -n $(grep -i "Invalid Password\|two-factor\|No subscription" "${STEAMCMD_LOG}") ]]; then # Wrong username/password, Steam Guard is turned on, or host is using anonymous account + echo -e "\n${RED}[UPDATE]: Cannot login to Steam - Improperly configured account and/or credentials" + echo -e "\t${YELLOW}Please contact your administrator/host and give them the following message:${NC}" + echo -e "\t${CYAN}Your Egg, or your client's server, is not configured with valid Steam credentials.${NC}" + echo -e "\t${CYAN}Either the username/password is wrong, or Steam Guard is not properly configured\n\taccording to this egg's documentation/README.${NC}\n" + exit 1 + elif [[ -n $(grep -i "Download item" "${STEAMCMD_LOG}") ]]; then # Steam account does not own base game for mod downloads, or unknown + echo -e "\n${RED}[UPDATE]: Cannot download mod - Download failed" + echo -e "\t${YELLOW}While unknown, this error is likely due to your host's Steam account not owning the base game.${NC}" + echo -e "\t${YELLOW}(Please contact your administrator/host if this issue persists)${NC}\n" + exit 1 + elif [[ -n $(grep -i "0x202\|0x212" "${STEAMCMD_LOG}") ]]; then # Not enough disk space + echo -e "\n${RED}[UPDATE]: Unable to complete download - Not enough storage" + echo -e "\t${YELLOW}You have run out of your allotted disk space.${NC}" + echo -e "\t${YELLOW}Please contact your administrator/host for potential storage upgrades.${NC}\n" + exit 1 + elif [[ -n $(grep -i "0x606" "${STEAMCMD_LOG}") ]]; then # Disk write failure + echo -e "\n${RED}[UPDATE]: Unable to complete download - Disk write failure" + echo -e "\t${YELLOW}This is normally caused by directory permissions issues,\n\tbut could be a more serious hardware issue.${NC}" + echo -e "\t${YELLOW}(Please contact your administrator/host if this issue persists)${NC}\n" + exit 1 + else # Unknown caught error + echo -e "\n${RED}[UPDATE]: ${YELLOW}An unknown error has occurred with SteamCMD. ${CYAN}Skipping download...${NC}" + echo -e "\t(Please contact your administrator/host if this issue persists)" + break + fi + elif [[ $steamcmdExitCode != 0 ]]; then # Unknown fatal error + echo -e "\n${RED}[UPDATE]: SteamCMD has crashed for an unknown reason!${NC} (Exit code: ${CYAN}${steamcmdExitCode}${NC})" + echo -e "\t${YELLOW}(Please contact your administrator/host for support)${NC}\n" + exit $steamcmdExitCode + else # Success! + if [[ $1 == 0 ]]; then # Server + echo -e "\n${GREEN}[UPDATE]: Game server is up to date!${NC}" + else # Mod + # Move the downloaded mod to the root directory, and replace existing mod if needed + mkdir -p ./@$2 + rm -rf ./@$2/* + mv -f ./Steam/steamapps/workshop/content/$GAME_ID/$2/* ./@$2 + rm -d ./Steam/steamapps/workshop/content/$GAME_ID/$2 + # Make the mods contents all lowercase + ModsLowercase @$2 + # Move any .bikey's to the keys directory + echo -e "\tMoving any mod ${CYAN}.bikey${NC} files to the ${CYAN}~/keys/${NC} folder..." + find ./@$2 -name "*.bikey" -type f -exec cp {} ./keys \; + echo -e "${GREEN}[UPDATE]: Mod download/update successful!${NC}" + fi + break + fi + if (( $updateAttempt == $STEAMCMD_ATTEMPTS )); then # Notify if failed last attempt + if [[ $1 == 0 ]]; then # Server + echo -e "\t${RED}Final attempt made! ${YELLOW}Unable to complete game server update. ${CYAN}Skipping...${NC}" + echo -e "\t(Please try again at a later time)" + sleep 3 + else # Mod + echo -e "\t${RED}Final attempt made! ${YELLOW}Unable to complete mod download/update. ${CYAN}Skipping...${NC}" + echo -e "\t(You may try again later, or manually upload this mod to your server via SFTP)" + sleep 3 + fi + fi + done +} + +# Takes a directory (string) as input, and recursively makes all files & folders lowercase. +function ModsLowercase { + echo -e "\n\tMaking mod ${CYAN}$1${NC} files/folders lowercase..." + for SRC in `find ./$1 -depth` + do + DST=`dirname "${SRC}"`/`basename "${SRC}" | tr '[A-Z]' '[a-z]'` + if [ "${SRC}" != "${DST}" ] + then + [ ! -e "${DST}" ] && mv -T "${SRC}" "${DST}" + fi + done +} + +# Removes duplicate items from a semicolon delimited string +function RemoveDuplicates { #[Input: str - Output: printf of new str] + if [[ -n $1 ]]; then # If nothing to compare, skip to prevent extra semicolon being returned + echo $1 | sed -e 's/;/\n/g' | sort -u | xargs printf '%s;' + fi +} + +## === ENTRYPOINT START === + +# Wait for the container to fully initialize +sleep 1 + +# Set environment variable that holds the Internal Docker IP +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP + +# Switch to the container's working directory +cd /home/container || exit 1 + +# Collect and parse all specified mods +if [[ -n ${MODIFICATIONS} ]] && [[ ${MODIFICATIONS} != *\; ]]; then # Add manually specified mods to the client-side mods list, while checking for trailing semicolon + CLIENT_MODS="${MODIFICATIONS};" +else + CLIENT_MODS=${MODIFICATIONS} +fi +# If the mod list file exists and is valid, parse and add mods to the client-side mods list +if [[ -f ${MOD_FILE} ]] && [[ -n "$(cat ${MOD_FILE} | grep 'Created by DayZ Launcher')" ]]; then + CLIENT_MODS+=$(cat ${MOD_FILE} | grep 'id=' | cut -d'=' -f3 | cut -d'"' -f1 | xargs printf '@%s;') +elif [[ -n "${MOD_FILE}" ]]; then # If MOD_FILE is not null, warn user file is missing or invalid + echo -e "\n${YELLOW}[STARTUP_WARN]: DayZ Modlist file \"${CYAN}${MOD_FILE}${YELLOW}\" could not be found, or is invalid!${NC}" + echo -e "\tEnsure your uploaded modlist's file name matches your Startup Parameter." + echo -e "\tOnly files exported from a DayZ Launcher are permitted." + if [[ -n "${CLIENT_MODS}" ]]; then + echo -e "\t${CYAN}Reverting to the manual mod list...${NC}" + fi +fi +# Add server mods to the master mods list, while checking for trailing semicolon +if [[ -n ${SERVERMODS} ]] && [[ ${SERVERMODS} != *\; ]]; then + allMods="${SERVERMODS};" +else + allMods=${SERVERMODS} +fi +allMods+=$CLIENT_MODS # Add all client-side mods to the master mod list +CLIENT_MODS=$(RemoveDuplicates ${CLIENT_MODS}) # Remove duplicate mods from CLIENT_MODS, if present +allMods=$(RemoveDuplicates ${allMods}) # Remove duplicate mods from allMods, if present +allMods=$(echo $allMods | sed -e 's/;/ /g') # Convert from string to array + +# Update everything (server and mods), if specified +if [[ ${UPDATE_SERVER} == 1 ]]; then + echo -e "\n${GREEN}[STARTUP]: ${CYAN}Starting checks for all updates...${NC}" + echo -e "(It is okay to ignore any \"SDL\" errors during this process)\n" + + ## Update game server + echo -e "${GREEN}[UPDATE]:${NC} Checking for game server updates with App ID: ${CYAN}${STEAMCMD_APPID}${NC}..." + + if [[ ${VALIDATE_SERVER} == 1 ]]; then # Validate will be added as a parameter if specified + echo -e "\t${CYAN}File validation enabled.${NC} (This may take extra time to complete)" + validateServer="validate" + else + validateServer="" + fi + + # Determine what extra flags should be set + if [[ -n ${STEAMCMD_EXTRA_FLAGS} ]]; then + echo -e "\t(${YELLOW}Advanced${NC}) Extra SteamCMD flags specified: ${CYAN}${STEAMCMD_EXTRA_FLAGS}${NC}\n" + extraFlags=${STEAMCMD_EXTRA_FLAGS} + else + echo -e "" + extraFlags="" + fi + + RunSteamCMD 0 ${STEAMCMD_APPID} + + ## Update mods + if [[ -n $allMods ]] && [[ ${DISABLE_MOD_UPDATES} != 1 ]]; then + echo -e "\n${GREEN}[UPDATE]:${NC} Checking all ${CYAN}Steam Workshop mods${NC} for updates..." + for modID in $(echo $allMods | sed -e 's/@//g') + do + if [[ $modID =~ ^[0-9]+$ ]]; then # Only check mods that are in ID-form + # Get mod's latest update in epoch time from its Steam Workshop changelog page + latestUpdate=$(curl -sL https://steamcommunity.com/sharedfiles/filedetails/changelog/$modID | grep '

$(find @$modID | head -1 | xargs stat -c%Y) ) ]]; then + # Get the mod's name from the Workshop page as well + modName=$(curl -sL https://steamcommunity.com/sharedfiles/filedetails/changelog/$modID | grep 'workshopItemTitle' | cut -d'>' -f2 | cut -d'<' -f1) + if [[ -z $modName ]]; then # Set default name if unavailable + modName="[NAME UNAVAILABLE]" + fi + if [[ ! -d @$modID ]]; then + echo -e "\n${GREEN}[UPDATE]:${NC} Downloading new Mod: \"${CYAN}${modName}${NC}\" (${CYAN}${modID}${NC})" + else + echo -e "\n${GREEN}[UPDATE]:${NC} Mod update found for: \"${CYAN}${modName}${NC}\" (${CYAN}${modID}${NC})" + fi + if [[ -n $latestUpdate ]] && [[ $latestUpdate =~ ^[0-9]+$ ]]; then # Notify last update date, if valid + echo -e "\tMod was last updated: ${CYAN}$(date -d @${latestUpdate})${NC}" + fi + echo -e "\tAttempting mod update/download via SteamCMD...\n" + RunSteamCMD 1 $modID + fi + fi + done + echo -e "${GREEN}[UPDATE]:${NC} Steam Workshop mod update check ${GREEN}complete${NC}!" + fi +fi + +# Check if specified server binary exists. +if [[ ! -f ./${SERVER_BINARY} ]]; then + echo -e "\n${RED}[STARTUP_ERR]: Specified DayZ server binary could not be found in the root directory!${NC}" + echo -e "${YELLOW}Please do the following to resolve this issue:${NC}" + echo -e "\t${CYAN}- Double check your \"Server Binary\" Startup Variable is correct.${NC}" + echo -e "\t${CYAN}- Ensure your server has properly installed/updated without errors (reinstalling/updating again may help).${NC}" + echo -e "\t${CYAN}- Use the File Manager to check that your specified server binary file is not missing from the root directory.${NC}\n" + exit 1 +fi + +# Make mods lowercase, if specified +if [[ ${MODS_LOWERCASE} == "1" ]]; then + for modDir in $allMods + do + ModsLowercase $modDir + done +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 +modifiedStartup=`eval echo $(echo ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g')` + +# Start the Server +echo -e "\n${GREEN}[STARTUP]:${NC} Starting server with the following startup command:" +echo -e "${CYAN}${modifiedStartup}${NC}\n" +${modifiedStartup} + +if [ $? -ne 0 ]; then + echo -e "\n${RED}PTDL_CONTAINER_ERR: There was an error while attempting to run the start command.${NC}\n" + exit 1 +fi diff --git a/games/dayz/passwd.template b/games/dayz/passwd.template new file mode 100644 index 0000000..2b0dd45 --- /dev/null +++ b/games/dayz/passwd.template @@ -0,0 +1,26 @@ +root:x:0:0:root:/root:/bin/bash +daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin +bin:x:2:2:bin:/bin:/usr/sbin/nologin +sys:x:3:3:sys:/dev:/usr/sbin/nologin +sync:x:4:65534:sync:/bin:/bin/sync +games:x:5:60:games:/usr/games:/usr/sbin/nologin +man:x:6:12:man:/var/cache/man:/usr/sbin/nologin +lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin +mail:x:8:8:mail:/var/mail:/usr/sbin/nologin +news:x:9:9:news:/var/spool/news:/usr/sbin/nologin +uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin +proxy:x:13:13:proxy:/bin:/usr/sbin/nologin +www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin +backup:x:34:34:backup:/var/backups:/usr/sbin/nologin +list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin +irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin +gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin +nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin +systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false +systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false +systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false +systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false +syslog:x:104:108::/home/syslog:/bin/false +messagebus:x:106:109::/var/run/dbus:/bin/false +bind:x:108:112::/var/cache/bind:/bin/false +${USER}:x:${USER_ID}:${GROUP_ID}:${USER}:${HOME}:/bin/bash \ No newline at end of file diff --git a/games/samp/Dockerfile b/games/samp/Dockerfile index e1b5ff4..3ed3929 100644 --- a/games/samp/Dockerfile +++ b/games/samp/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM debian:bullseye-slim +FROM --platform=$TARGETOS/$TARGETARCH debian:bullseye-slim LABEL author="QuintenQVD" maintainer="josdekurk@gmail.com" diff --git a/games/source/Dockerfile b/games/source/Dockerfile index 617a9f6..6feb9ae 100644 --- a/games/source/Dockerfile +++ b/games/source/Dockerfile @@ -20,7 +20,7 @@ # SOFTWARE. # -FROM --platform=$BUILDPLATFORM debian:stable-slim +FROM --platform=$TARGETOS/$TARGETARCH debian:stable-slim LABEL author="Matthew Penner" maintainer="matthew@pterodactyl.io" @@ -37,9 +37,9 @@ RUN dpkg --add-architecture i386 \ ## install rcon RUN cd /tmp/ \ - && curl -sSL https://github.com/gorcon/rcon-cli/releases/download/v0.10.1/rcon-0.10.1-amd64_linux.tar.gz > rcon.tar.gz \ + && curl -sSL https://github.com/gorcon/rcon-cli/releases/download/v0.10.2/rcon-0.10.2-amd64_linux.tar.gz > rcon.tar.gz \ && tar xvf rcon.tar.gz \ - && mv rcon-0.10.1-amd64_linux/rcon /usr/local/bin/ + && mv rcon-0.10.2-amd64_linux/rcon /usr/local/bin/ USER container ENV USER=container HOME=/home/container diff --git a/go/1.14/Dockerfile b/go/1.14/Dockerfile index 105e773..285e36b 100644 --- a/go/1.14/Dockerfile +++ b/go/1.14/Dockerfile @@ -20,7 +20,7 @@ # SOFTWARE. # -FROM --platform=$BUILDPLATFORM golang:1.14-alpine +FROM --platform=$TARGETOS/$TARGETARCH golang:1.14-alpine LABEL author="Matthew Penner" maintainer="matthew@pterodactyl.io" diff --git a/go/1.15/Dockerfile b/go/1.15/Dockerfile index 50a8531..0279ead 100644 --- a/go/1.15/Dockerfile +++ b/go/1.15/Dockerfile @@ -20,7 +20,7 @@ # SOFTWARE. # -FROM --platform=$BUILDPLATFORM golang:1.15-alpine +FROM --platform=$TARGETOS/$TARGETARCH golang:1.15-alpine LABEL author="Matthew Penner" maintainer="matthew@pterodactyl.io" diff --git a/go/1.16/Dockerfile b/go/1.16/Dockerfile index 9855e47..1ab08f3 100644 --- a/go/1.16/Dockerfile +++ b/go/1.16/Dockerfile @@ -20,7 +20,7 @@ # SOFTWARE. # -FROM --platform=$BUILDPLATFORM golang:1.16-alpine +FROM --platform=$TARGETOS/$TARGETARCH golang:1.16-alpine LABEL author="Matthew Penner" maintainer="matthew@pterodactyl.io" diff --git a/installers/alpine/Dockerfile b/installers/alpine/Dockerfile index 0f6b97f..a5b6b81 100644 --- a/installers/alpine/Dockerfile +++ b/installers/alpine/Dockerfile @@ -20,7 +20,7 @@ # SOFTWARE. # -FROM --platform=$BUILDPLATFORM alpine:latest +FROM --platform=$TARGETOS/$TARGETARCH alpine:latest LABEL author="Matthew Penner" maintainer="matthew@pterodactyl.io" diff --git a/installers/debian/Dockerfile b/installers/debian/Dockerfile index e671c61..25168ba 100644 --- a/installers/debian/Dockerfile +++ b/installers/debian/Dockerfile @@ -18,9 +18,9 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -# +# -FROM --platform=$BUILDPLATFORM debian:stable-slim +FROM --platform=$TARGETOS/$TARGETARCH debian:stable-slim LABEL author="Matthew Penner" maintainer="matthew@pterodactyl.io" diff --git a/voice/teaspeak/Dockerfile b/voice/teaspeak/Dockerfile index 809b228..ffa3d3a 100644 --- a/voice/teaspeak/Dockerfile +++ b/voice/teaspeak/Dockerfile @@ -20,7 +20,7 @@ # SOFTWARE. # -FROM --platform=$BUILDPLATFORM debian:stable-slim +FROM --platform=$TARGETOS/$TARGETARCH debian:stable-slim LABEL author="Torsten Widmann" maintainer="info@goover.de" diff --git a/wine/entrypoint.sh b/wine/entrypoint.sh index be33420..2066497 100644 --- a/wine/entrypoint.sh +++ b/wine/entrypoint.sh @@ -65,7 +65,7 @@ if [[ $WINETRICKS_RUN =~ mono ]]; then WINETRICKS_RUN=${WINETRICKS_RUN/mono} if [ ! -f "$WINEPREFIX/mono.msi" ]; then - wget -q -O $WINEPREFIX/mono.msi https://dl.winehq.org/wine/wine-mono/7.1.1/wine-mono-7.1.1-x86.msi + wget -q -O $WINEPREFIX/mono.msi https://dl.winehq.org/wine/wine-mono/7.2.0/wine-mono-7.2.0-x86.msi fi wine msiexec /i $WINEPREFIX/mono.msi /qn /quiet /norestart /log $WINEPREFIX/mono_install.log diff --git a/wine/latest/Dockerfile b/wine/latest/Dockerfile index 7ab8e30..4c47ef7 100644 --- a/wine/latest/Dockerfile +++ b/wine/latest/Dockerfile @@ -1,6 +1,6 @@ -# ---------------------------------- -# Generic Wine 6 image -# ---------------------------------- +# --------------------------------------- +# Generic Wine image based on Wine stable +# --------------------------------------- FROM ghcr.io/parkervcp/yolks:debian LABEL author="Michael Parker" maintainer="parker@pterodactyl.io" @@ -8,7 +8,7 @@ LABEL author="Michael Parker" maintainer="parker@pterodactyl.io" ## install required packages RUN dpkg --add-architecture i386 \ && apt update -y \ - && apt install -y --no-install-recommends gnupg2 software-properties-common libntlm0 winbind xvfb xauth python3 libncurses5:i386 libncurses6:i386 + && apt install -y --no-install-recommends gnupg2 tzdata software-properties-common libntlm0 winbind xvfb xauth python3 libncurses5:i386 libncurses6:i386 # Install winehq-stable and with recommends RUN wget -nc https://dl.winehq.org/wine-builds/winehq.key \