Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add proton image (fixes #7) #8

Merged
merged 1 commit into from
Jan 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,26 @@ jobs:
with:
image-name: enshrouded-server
image-tag: dev
dockerfile: dockerfiles/Dockerfile
secrets:
CONTAINER_REGISTRY_PASSWORD: ${{ secrets.DOCKER_TOKEN }}
build-wine-staging:
uses: mornedhels/workflow-center-public/.github/workflows/docker-build.yml@main
with:
image-name: enshrouded-server
image-tag: dev-wine-staging
dockerfile: dockerfiles/Dockerfile
build-args: |
WINE_BRANCH=staging
trivy-scan: false
secrets:
CONTAINER_REGISTRY_PASSWORD: ${{ secrets.DOCKER_TOKEN }}
build-proton:
uses: mornedhels/workflow-center-public/.github/workflows/docker-build.yml@main
with:
image-name: enshrouded-server
image-tag: dev-proton
dockerfile: dockerfiles/proton.Dockerfile
trivy-scan: false
secrets:
CONTAINER_REGISTRY_PASSWORD: ${{ secrets.DOCKER_TOKEN }}
17 changes: 15 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,31 @@ on:
concurrency: Release-${{ github.ref }}

jobs:
docker-build:
docker-build-wine:
uses: mornedhels/workflow-center-public/.github/workflows/docker-build.yml@main
with:
image-name: enshrouded-server
dockerfile: dockerfiles/Dockerfile
image-tag: |
${{ github.event.release.tag_name }}
${{ github.event.release.tag_name }}-wine
stable-wine
latest
secrets:
CONTAINER_REGISTRY_PASSWORD: ${{ secrets.DOCKER_TOKEN }}
docker-build-proton:
uses: mornedhels/workflow-center-public/.github/workflows/docker-build.yml@main
with:
image-name: enshrouded-server
dockerfile: dockerfiles/proton.Dockerfile
image-tag: |
${{ github.event.release.tag_name }}-proton
stable-proton
secrets:
CONTAINER_REGISTRY_PASSWORD: ${{ secrets.DOCKER_TOKEN }}
update-readme:
runs-on: ubuntu-latest
needs: [docker-build]
needs: [docker-build-wine,docker-build-proton]
steps:
- uses: actions/checkout@v4
- name: Update Docker Hub Description
Expand Down
17 changes: 12 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,18 @@ see [Enshrouded Docs](https://enshrouded.zendesk.com/hc/en-us/articles/160554414
* STEAM_API_KEY is only needed for the update cron, to check if the server is empty. You can get a key from
[Steam](https://steamcommunity.com/dev/apikey). If not supplied, the check will be skipped.

## Image Tags

| Tag | Virtualization | Description |
|--------------------|----------------|------------------------------|
| `latest` | wine | Latest image based on wine |
| `stable-wine` | wine | Same as latest image |
| `<version>-wine` | wine | Pinned image based on wine |
| `stable-proton` | proton | Latest image based on proton |
| `<version>-proton` | proton | Pinned image based on proton |
| `dev` | wine | Dev build based on wine |
| `dev-proton` | proton | Dev build based on proton |

## Ports (default)

| Port | Description |
Expand All @@ -61,11 +73,6 @@ the environment variables `PUID` and `PGID`.

[Official Docs](https://enshrouded.zendesk.com/hc/en-us/articles/16055628734109-Recommended-Server-Specifications)

* **CPU:** TBD
* **RAM:** TBD
* **Disk:** TBD
* **Docker Host:** TBD

## Usage

### Docker
Expand Down
23 changes: 23 additions & 0 deletions docker-compose-proton.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
version: "3.8"
services:
enshrouded:
build:
context: .
dockerfile: dockerfiles/proton.Dockerfile
args:
WINE_BRANCH: stable
image: mornedhels/enshrouded-server:dev-proton
container_name: enshrouded
hostname: enshrouded
restart: unless-stopped
stop_grace_period: 90s
ports:
- "15636-15637:15636-15637/udp"
volumes:
- ./game:/opt/enshrouded
environment:
- SERVER_NAME=MornedhelsTest
- PUID=4711
- PGID=4711
- UPDATE_CRON=*/30 * * * *
- log_level=50
6 changes: 3 additions & 3 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ services:
enshrouded:
build:
context: .
dockerfile: Dockerfile
dockerfile: dockerfiles/Dockerfile
args:
WINE_BRANCH: staging
image: mornedhels/enshrouded-server:latest
WINE_BRANCH: stable
image: mornedhels/enshrouded-server:dev
container_name: enshrouded
hostname: enshrouded
restart: unless-stopped
Expand Down
4 changes: 2 additions & 2 deletions Dockerfile → dockerfiles/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ RUN mkdir -p /usr/local/etc /var/log/supervisor /var/run/enshrouded /usr/local/e
&& apt autoremove --purge && apt clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

COPY ./supervisord.conf /etc/supervisor/supervisord.conf
COPY --chmod=755 ./scripts/* /usr/local/etc/enshrouded/
COPY ../supervisord.conf /etc/supervisor/supervisord.conf
COPY --chmod=755 ../scripts/default/* ../scripts/wine/* /usr/local/etc/enshrouded/

WORKDIR /usr/local/etc/enshrouded
CMD ["/usr/local/etc/enshrouded/bootstrap"]
Expand Down
44 changes: 44 additions & 0 deletions dockerfiles/proton.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
FROM steamcmd/steamcmd:ubuntu-22@sha256:a41e8440eeb00a7a1babc757a4cdce58cd8864abc4d22f2df18699e57ede0049
LABEL maintainer="[email protected]"

# Install prerequisites
RUN dpkg --add-architecture i386 \
&& apt-get update \
&& DEBIAN_FRONTEND="noninteractive" apt-get install -y --no-install-recommends \
cabextract \
curl \
winbind \
supervisor \
cron \
rsyslog \
jq \
tar \
dbus \
libfreetype6 \
libfreetype6:i386

# Install winetricks (unused)
RUN curl -o /tmp/winetricks https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks \
&& chmod +x /tmp/winetricks && install -m 755 /tmp/winetricks /usr/local/bin/winetricks

# install proton
RUN curl -sLOJ "$(curl -s https://api.github.com/repos/GloriousEggroll/proton-ge-custom/releases/latest | grep browser_download_url | cut -d\" -f4 | grep .tar.gz)" \
&& tar -xzf GE-Proton*.tar.gz -C /usr/local/bin/ --strip-components=1 \
&& rm GE-Proton*.* \
&& rm -f /etc/machine-id \
&& dbus-uuidgen --ensure=/etc/machine-id

# MISC
RUN mkdir -p /usr/local/etc /var/log/supervisor /var/run/enshrouded /usr/local/etc/supervisor/conf.d/ /opt/enshrouded /home/enshrouded/.steam \
&& groupadd -g "${PGID:-4711}" -o enshrouded \
&& useradd -g "${PGID:-4711}" -u "${PUID:-4711}" -o --create-home enshrouded \
&& sed -i '/imklog/s/^/#/' /etc/rsyslog.conf \
&& apt autoremove --purge && apt clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

COPY ../supervisord.conf /etc/supervisor/supervisord.conf
COPY --chmod=755 ../scripts/default/* ../scripts/proton/* /usr/local/etc/enshrouded/

WORKDIR /usr/local/etc/enshrouded
CMD ["/usr/local/etc/enshrouded/bootstrap"]
ENTRYPOINT []
File renamed without changes.
3 changes: 3 additions & 0 deletions scripts/common → scripts/default/common
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ WINEPREFIX=/home/enshrouded/
WINEARCH=win64
WINEPATH=$install_path

# Proton
PROTONPREFIX="$install_path/steamapps/compatdata/$steam_app_id/pfx"

# log levels
debug=50
info=40
Expand Down
File renamed without changes.
110 changes: 110 additions & 0 deletions scripts/proton/enshrouded-bootstrap
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
#!/bin/bash
. "$(dirname "$0")/common"
. "$(dirname "$0")/defaults"

main() {
info "Running enshrouded-bootstrap"
prepareEnshroudedAppFolders
updateOrCreateEnshroudedServerConfig
bootstrapProton

initCrontab
supervisorctl start enshrouded-updater
info "Bootstrap complete"
}

prepareEnshroudedAppFolders() {
mkdir -p "$install_path"
}

bootstrapProton() {
info "bootstrap proton wine"
export WINEPREFIX=$WINEPREFIX
export WINEARCH=$WINEARCH
export WINEPATH=$WINEPATH
export WINEDEBUG=$WINEDEBUG

debug "winecfg"
winecfg -v win11 >/dev/null 2>&1
debug "wineboot"
wineboot -u >/dev/null 2>&1

fixSteamClient

info "proton bootstrap finished"
}

fixSteamClient() {
info "prepare steamclient for proton"
mkdir -p ~/.steam/sdk64/
$steamcmd_path +login anonymous +app_update 1007 +quit
cp ~/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so ~/.steam/sdk64/
}

initCrontab() {
crontab=$(mktemp)

if [ -n "$UPDATE_CRON" ]; then
debug "creating cron for update checks (schedule: $UPDATE_CRON)"
echo "$UPDATE_CRON supervisorctl start enshrouded-updater >/dev/null 2>&1" >>"$crontab"
fi

crontab "$crontab"
rm -f "$crontab"
}

updateOrCreateEnshroudedServerConfig() {
if [[ ! -e ${install_path}/enshrouded_server.json ]]; then
mkdir -p ${install_path}
touch ${install_path}/enshrouded_server.json

# write json to file ${install_path}/enshrouded_server.json

cat >${install_path}/enshrouded_server.json << EOF
{
"name": "Enshrouded Server",
"password": "",
"saveDirectory": "./savegame",
"logDirectory": "./logs",
"ip": "0.0.0.0",
"gamePort": 15636,
"queryPort": 15637,
"slotCount": 16
}
EOF
fi

if [[ -n "$SERVER_NAME" ]]; then
echo "$(jq --arg name "$SERVER_NAME" '.name = $name' ${install_path}/enshrouded_server.json)" > ${install_path}/enshrouded_server.json
fi

if [[ -n "$SERVER_PASSWORD" ]]; then
echo "$(jq --arg password "$SERVER_PASSWORD" '.password = $password' ${install_path}/enshrouded_server.json)" > ${install_path}/enshrouded_server.json
fi

if [[ -n "$SERVER_SAVE_DIR" ]]; then
echo "$(jq --arg saveDirectory "$SERVER_SAVE_DIR" '.saveDirectory = $saveDirectory' ${install_path}/enshrouded_server.json)" > ${install_path}/enshrouded_server.json
fi

if [[ -n "$SERVER_LOG_DIR" ]]; then
echo "$(jq --arg logDirectory "$SERVER_LOG_DIR" '.logDirectory = $logDirectory' ${install_path}/enshrouded_server.json)" > ${install_path}/enshrouded_server.json
fi

if [[ -n "$SERVER_IP" ]]; then
echo "$(jq --arg ip "$SERVER_IP" '.ip = $ip' ${install_path}/enshrouded_server.json)" > ${install_path}/enshrouded_server.json
fi

if [[ -n "$SERVER_PORT" ]]; then
echo "$(jq --argjson gamePort "$SERVER_PORT" '.gamePort = $gamePort' ${install_path}/enshrouded_server.json)" > ${install_path}/enshrouded_server.json
fi

if [[ -n "$SERVER_QUERYPORT" ]]; then
echo "$(jq --argjson queryPort "$SERVER_QUERYPORT" '.queryPort = $queryPort' ${install_path}/enshrouded_server.json)" > ${install_path}/enshrouded_server.json
fi

if [[ -n "$SERVER_SLOT_COUNT" ]]; then
echo "$(jq --argjson slotCount "$SERVER_SLOT_COUNT" '.slotCount = $slotCount' ${install_path}/enshrouded_server.json)" > ${install_path}/enshrouded_server.json
fi
}

main
90 changes: 90 additions & 0 deletions scripts/proton/enshrouded-server
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
#!/bin/bash
. "$(dirname "$0")/common"
. "$(dirname "$0")/defaults"

enshrouded_server_pid=-1
timeout=60
kill_signal=TERM

cd "$install_path" || fatal "Could not cd $install_path"
enshrouded_server="$install_path/$enshrouded_binary_path"

main() {
waitForServerDownload
runServer
}

waitForServerDownload() {
while :; do
if [ -f "$enshrouded_server" ]; then
break
else
debug "enshrouded Server is not yet downloaded - waiting"
sleep 7
fi
done
}

runServer() {
info "Running enshrouded-server"
debug "Server config ServerName:$SERVER_NAME - ServerPort:${SERVER_PORT:-15636} - ServerQueryPort:${SERVER_QUERYPORT:-15637}"

export WINEDEBUG=$WINEDEBUG
export WINEDLLPATH="/usr/local/bin/files/lib64//wine:/usr/local/bin/files/lib//wine"
export LD_LIBRARY_PATH="/usr/local/bin/files/lib64/:/usr/local/bin/files/lib/"
export WINEPREFIX="$install_path/steamapps/compatdata/$steam_app_id/pfx/"
export WINEESYNC="1"
export WINEFSYNC="1"
export WINEDLLOVERRIDES="steam.exe=b;dotnetfx35.exe=b;dotnetfx35setup.exe=b;beclient.dll=b,n;beclient_x64.dll=b,n;d3d11=n;d3d10core=n;d3d9=n;dxgi=n;d3d12=n;d3d12core=n"
export STEAM_COMPAT_CLIENT_INSTALL_PATH="/home/enshrouded/.steam/steam"
export WINE_LARGE_ADDRESS_AWARE="1"
export GST_PLUGIN_SYSTEM_PATH_1_0="/usr/local/bin/files/lib64/gstreamer-1.0:/usr/local/bin/files/lib/gstreamer-1.0"
export WINE_GST_REGISTRY_DIR="$install_path/steamapps/compatdata/$steam_app_id/gstreamer-1.0/"

chmod +x "$enshrouded_server"
/usr/local/bin/files/bin/wine64 "$enshrouded_server" &
enshrouded_server_pid=$!
echo $enshrouded_server_pid >"$enshrouded_server_pidfile"

wait $enshrouded_server_pid
debug "enshrouded-server with PID $enshrouded_server_pid stopped"

cleanup
info "Shutdown complete"
exit 0
}

cleanup() {
clearLock "$enshrouded_server_pidfile"
}

shutdown() {
debug "Received signal to shut down enshrouded-server"
if [ $enshrouded_server_pid -eq -1 ]; then
debug "enshrouded server is not running yet - aborting startup"
exit
fi
info "Shutting down enshrouded server with PID $enshrouded_server_pid"
kill -TERM $enshrouded_server_pid
shutdown_timeout=$(($(date +%s) + timeout))
while [ -d "/proc/$enshrouded_server_pid" ]; do
if [ "$(date +%s)" -gt $shutdown_timeout ]; then
shutdown_timeout=$(($(date +%s) + timeout))
warn "Timeout while waiting for server to shut down - sending SIG$kill_signal to PID $enshrouded_server_pid"
kill -$kill_signal $enshrouded_server_pid
case "$kill_signal" in
INT)
kill_signal=TERM
;;
*)
kill_signal=KILL
;;
esac
fi
debug "Waiting for enshrouded Server with PID $enshrouded_server_pid to shut down"
sleep 6
done
}

trap shutdown SIGINT SIGTERM
main
Loading