diff --git a/voice/mumble/Dockerfile b/voice/mumble/Dockerfile index cfac8183c..84ca88bf7 100644 --- a/voice/mumble/Dockerfile +++ b/voice/mumble/Dockerfile @@ -1,22 +1,40 @@ -FROM --platform=$TARGETOS/$TARGETARCH alpine:edge +FROM --platform=$TARGETOS/$TARGETARCH debian:bookworm-slim AS builder -LABEL author="Michael Parker" maintainer="parker@pterodactyl.io" +# Copy and run the build script +COPY build.sh /build.sh +RUN chmod +x /build.sh +RUN cd / && ./build.sh -LABEL org.opencontainers.image.source="https://github.com/pterodactyl/yolks" -LABEL org.opencontainers.image.licenses=MIT +FROM --platform=$TARGETOS/$TARGETARCH debian:bookworm-slim -## install dependencies -RUN apk add --no-cache murmur tini +# Create necessary directories +RUN mkdir -p /usr/local/bin /usr/local/share/mumble -RUN adduser -D container +# Copy the built Mumble server binary and the latest tag file and the build log from the builder stage +COPY --from=builder /usr/src/mumble/git/build/mumble-server /usr/local/bin/mumble-server +COPY --from=builder /usr/src/mumble/git/build/latest_tag.txt /usr/local/share/mumble/latest_tag.txt +COPY --from=builder /usr/src/mumble/build.log /usr/local/share/mumble/build.log -USER container -ENV USER=container HOME=/home/container +# Install runtime dependencies +RUN apt update \ + && apt -y install curl tar tzdata file ca-certificates sqlite3 iproute2 tini \ + && useradd -m -d /home/container container + +# Needed packages to run the mumble server +RUN apt -y install libqt5sql5 libqt5sql5-sqlite libavahi-compat-libdnssd-dev libqt5dbus5 libzeroc-ice-dev libprotobuf-dev qtbase5-dev qtbase5-dev-tools + +# Set up user and working directory +USER container +ENV USER=container HOME=/home/container WORKDIR /home/container +# Set the stop signal STOPSIGNAL SIGINT -COPY --chown=container:container ./entrypoint.sh /entrypoint.sh -RUN chmod +x /entrypoint.sh -ENTRYPOINT ["/sbin/tini", "-g", "--"] -CMD ["/entrypoint.sh"] +# Copy and set up the entrypoint script +COPY --chown=container:container ./entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +# Define entrypoint and command +ENTRYPOINT ["/usr/bin/tini", "-g", "--"] +CMD ["/entrypoint.sh"] diff --git a/voice/mumble/build.sh b/voice/mumble/build.sh new file mode 100644 index 000000000..f2890083d --- /dev/null +++ b/voice/mumble/build.sh @@ -0,0 +1,155 @@ +#!/bin/bash + +# Mumble compile script. +# Runs on Debian 12 + +LOGFILE="/usr/src/mumble/build.log" + +log() { + echo "$(date +'%Y-%m-%d %H:%M:%S') - $1" | tee -a $LOGFILE +} + +install_dep(){ + log "Installing dependencies..." + apt update && apt -y install \ + build-essential \ + cmake \ + pkg-config \ + qtbase5-dev \ + qtchooser \ + qt5-qmake \ + qtbase5-dev-tools \ + qttools5-dev \ + qttools5-dev-tools \ + libqt5svg5-dev \ + libboost-dev \ + libssl-dev \ + libprotobuf-dev \ + protobuf-compiler \ + libprotoc-dev \ + libcap-dev \ + libxi-dev \ + libasound2-dev \ + libogg-dev \ + libsndfile1-dev \ + libspeechd-dev \ + libavahi-compat-libdnssd-dev \ + libxcb-xinerama0 \ + libzeroc-ice-dev \ + libpoco-dev \ + jq \ + python3 \ + curl \ + git + + if [[ $? -ne 0 ]]; then + log "Failed to install dependencies" + exit 1 + fi + log "Dependencies installed successfully" +} + +# Function to install g++-multilib on amd64 +install_amd64_multilib() { + apt -y install g++-multilib + + if [[ $? -ne 0 ]]; then + log "Failed to install amd multilib dependency" + exit 1 + fi + + log "Multilib AMD64 installed successfully" +} + +# Function to install multilib support on arm64 +install_arm64_multilib() { + apt -y install g++-multilib-x86-64-linux-gnu g++-aarch64-linux-gnu libc6-dev-armhf-cross + + if [[ $? -ne 0 ]]; then + log "Failed to install amd multilib dependency" + exit 1 + fi + + log "Multilib ARM64 installed successfully" +} + +clone_mumble(){ + log "Cloning the Mumble repository..." + + # Create the necessary directories + mkdir -p /usr/src/mumble/git && cd /usr/src/mumble/git + + # Fetch the latest release tag from the GitHub API + LATEST_TAG=$(curl -s "https://api.github.com/repos/mumble-voip/mumble/releases/latest" | jq -r .tag_name) + if [[ $? -ne 0 || -z "$LATEST_TAG" ]]; then + log "Failed to fetch the latest release tag" + exit 1 + fi + echo "The latest tag is: $LATEST_TAG" | tee -a $LOGFILE + + # Clone the repository + echo "Running: git clone --branch \"$LATEST_TAG\" https://github.com/mumble-voip/mumble.git ." + git clone --branch "$LATEST_TAG" https://github.com/mumble-voip/mumble.git . + if [[ $? -ne 0 ]]; then + log "Failed to clone the repository" + exit 1 + fi + + # Clone the submodules + git submodule update --init --recursive + if [[ $? -ne 0 ]]; then + log "Failed to update submodules" + exit 1 + fi + + # Create and navigate to the build directory + mkdir -p build && cd build + + echo "$LATEST_TAG" > latest_tag.txt + + # Run cmake with the specified options + cmake -Dbundled-opus=OFF -Dclient=OFF -Dstatic=ON -DCMAKE_BUILD_TYPE=Release .. + if [[ $? -ne 0 ]]; then + log "CMake configuration failed" + exit 1 + fi + + log "Repository cloned and configured successfully" +} + +build_mumble(){ + log "Building Mumble server..." + + cd /usr/src/mumble/git/build + + echo "Using $(nproc) threads to build Mumble server" | tee -a $LOGFILE + cmake --build . -j $(nproc) + if [[ $? -ne 0 ]]; then + log "Build failed" + exit 1 + fi + + ls -la | tee -a $LOGFILE + log "Build completed successfully" +} + +# Install normal deps +install_dep + +# Detect the architecture +ARCH=$(dpkg --print-architecture) + +# Install ARCH specific deps +if [ "$ARCH" = "amd64" ]; then + echo "Detected architecture: amd64" + install_amd64_multilib +elif [ "$ARCH" = "arm64" ]; then + echo "Detected architecture: arm64" + install_arm64_multilib +else + echo "Unsupported architecture: $ARCH" + exit 1 +fi + +clone_mumble +build_mumble diff --git a/voice/mumble/entrypoint.sh b/voice/mumble/entrypoint.sh index 281b061b6..e7c94f878 100644 --- a/voice/mumble/entrypoint.sh +++ b/voice/mumble/entrypoint.sh @@ -1,4 +1,4 @@ -#!/bin/ash +#!/bin/bash cd /home/container # Make internal Docker IP address available to processes. @@ -6,11 +6,12 @@ INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') export INTERNAL_IP # Print the Muble server version -mumble-server --version +echo -e "Mumble release version:" +cat /usr/local/share/mumble/latest_tag.txt # Replace Startup Variables MODIFIED_STARTUP=$(echo -e $(echo -e ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g')) echo -e ":/home/container$ ${MODIFIED_STARTUP}" # Run the Server -eval ${MODIFIED_STARTUP} +eval ${MODIFIED_STARTUP} \ No newline at end of file