From a777dfb888ebfc5975a3904a64ff819227f9785c Mon Sep 17 00:00:00 2001 From: edraft Date: Sun, 14 Jun 2026 10:40:57 +0200 Subject: [PATCH] Unturned rewrite --- .github/workflows/build.yml | 6 +- Dockerfile | 71 +++++++++---------- README.md | 134 +++++++++++------------------------- entrypoint.sh | 26 +++++++ 4 files changed, 101 insertions(+), 136 deletions(-) create mode 100644 entrypoint.sh diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e2764f2..e7ca8c7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,9 +31,9 @@ jobs: - name: Build docker run: | - docker build -t git.sh-edraft.de/sh-edraft.de/garrysmod . - + docker build -t git.sh-edraft.de/sh-edraft.de/unturned . + - name: Push image run: | - docker push git.sh-edraft.de/sh-edraft.de/garrysmod + docker push git.sh-edraft.de/sh-edraft.de/unturned \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 8af3a98..653738f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,46 +1,37 @@ -FROM hackebein/srcds +FROM cm2network/steamcmd:root ENV \ - # App - APPS="4020 -validate -language en,232330 -validate -language en" \ - # - # API - # http://steamcommunity.com/dev/apikey - AUTHKEY="" \ - # - # Public access - # automatic via API - GLSTAPP="4000" \ - # manual - # APPID: 4000 - # http://steamcommunity.com/dev/managegameservers - GLST="" \ - # - # Workshop server download (require API) - WORKSHOP="\${WORKSHOPCOLLECTIONID:-}" \ - # - # Workshop client download (require API) - WORKSHOPDL="" \ + # Server identity + INSTANCEID="Server1" \ + SERVERNAME="Unturned Server" \ + SERVERPASSWORD="" \ + ADMINPASSWORD="" \ + OWNER="0" \ # # Server config - GAME="garrysmod" \ - TICKRATE="66" \ - MAXPLAYERS="16" \ - GAMEMODE="sandbox" \ - GAMETYPE="0" \ - MAP="gm_flatgrass" \ - MAPGROUP="mg_active" \ - CONFIG="server.cfg" \ + MAP="PEI" \ + MAXPLAYERS="8" \ + PERSPECTIVE="Both" \ + PVP="true" \ + PORT="27015" \ + # + # Anti-cheat + VAC="true" \ + EASYANTICHEAT="true" \ + # + # Workshop + WORKSHOP="" \ # # Start parameters - SRCDSPARAMS="\ - -game \${GAME} \ - -tickrate \${TICKRATE} \ - -maxplayers \${MAXPLAYERS} \ - -authkey \${AUTHKEY} \ - +host_workshop_collection \${WORKSHOP} \ - +gamemode \${GAMEMODE} \ - +map \${MAP} \ - +servercfgfile \${CONFIG} \ - \${CUSTOMPARAMETERS} \ - " + CUSTOMPARAMETERS="" + +WORKDIR /home/steam/unturned + +RUN steamcmd +force_install_dir /home/steam/unturned +login anonymous +app_update 1110390 validate +quit + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +EXPOSE 27015/udp 27015/tcp 27016/udp + +ENTRYPOINT ["/entrypoint.sh"] diff --git a/README.md b/README.md index bdc34e0..3a1bced 100644 --- a/README.md +++ b/README.md @@ -1,143 +1,91 @@ -# docker-garrysmod +# docker-unturned -A Docker image for running a [Garry's Mod](https://gmod.facepunch.com/) dedicated server, based on [hackebein/docker-srcds](https://github.com/Hackebein/docker-srcds). - -This repository is a fork of [Hackebein/docker-garrysmod](https://github.com/Hackebein/docker-garrysmod). - -Garry's Mod is a physics sandbox. There aren't any predefined aims or goals. The game gives you the tools and leaves you to play. +A Docker image for running an [Unturned](https://unturned.smartlydressedgames.com/) dedicated server, using SteamCMD. The image is automatically built and pushed to: ```text -git.sh-edraft.de/sh-edraft.de/garrysmod +git.sh-edraft.de/sh-edraft.de/unturned ``` ## Table of Contents - [Quick Start](#quick-start) -- [Enabling the Steam API](#enabling-the-steam-api) -- [Public Listing](#public-listing) -- [Workshop Collections](#workshop-collections) -- [Custom Server Configuration](#custom-server-configuration) -- [Example: Trouble in Terrorist Town (TTT)](#example-trouble-in-terrorist-town-ttt) +- [Server Identity](#server-identity) +- [Workshop Mods](#workshop-mods) +- [Persisting Data](#persisting-data) - [Environment Variables](#environment-variables) -- [Overlay Folder](#overlay-folder) -- [Further Configuration](#further-configuration) ## Quick Start -Start a basic sandbox server on the default port (`27015`): +Start a basic PEI server on the default port (`27015`): ```bash docker run -it \ -p 27015:27015/tcp \ -p 27015:27015/udp \ - git.sh-edraft.de/sh-edraft.de/garrysmod + -p 27016:27016/udp \ + git.sh-edraft.de/sh-edraft.de/unturned ``` -## Enabling the Steam API +## Server Identity -Some features (public server listing, Workshop downloads) require a Steam Web API key. +Set a server name, instance id, password and owner SteamID64: ```bash docker run -it \ -p 27015:27015/tcp \ -p 27015:27015/udp \ - -e "AUTHKEY=..." \ - git.sh-edraft.de/sh-edraft.de/garrysmod + -p 27016:27016/udp \ + -e "INSTANCEID=MyServer" \ + -e "SERVERNAME=My Server" \ + -e "SERVERPASSWORD=secret" \ + -e "ADMINPASSWORD=adminsecret" \ + -e "OWNER=76561198000000000" \ + git.sh-edraft.de/sh-edraft.de/unturned ``` -Get your `AUTHKEY` from . +## Workshop Mods -## Public Listing - -If you've set `AUTHKEY`, your server is automatically listed publicly. Alternatively, you can register a Game Server Login Token (GLST) manually: +Set a space-separated list of Workshop item/collection IDs to subscribe to on startup: ```bash docker run -it \ -p 27015:27015/tcp \ -p 27015:27015/udp \ - -e "GLST=..." \ - git.sh-edraft.de/sh-edraft.de/garrysmod + -p 27016:27016/udp \ + -e "WORKSHOP=123456789 987654321" \ + git.sh-edraft.de/sh-edraft.de/unturned ``` -Get your `GLST` from (App ID: `4000`). +## Persisting Data -## Workshop Collections - -Downloading Workshop content requires `AUTHKEY` to be set. +Mount the `Servers` directory to persist save data, configs and workshop mods across container restarts: ```bash docker run -it \ -p 27015:27015/tcp \ -p 27015:27015/udp \ - -e "AUTHKEY=..." \ - -e "WORKSHOPCOLLECTIONID=..." \ - git.sh-edraft.de/sh-edraft.de/garrysmod + -p 27016:27016/udp \ + -v ./servers:/home/steam/unturned/Servers \ + git.sh-edraft.de/sh-edraft.de/unturned ``` -## Custom Server Configuration - -Mount your own `server.cfg` into the container: - -```bash -docker run -it \ - -p 27015:27015/tcp \ - -p 27015:27015/udp \ - -v ./server.cfg:/opt/steam/garrysmod/cfg/server.cfg \ - git.sh-edraft.de/sh-edraft.de/garrysmod -``` - -## Example: Trouble in Terrorist Town (TTT) - -```bash -# make sure the server.cfg file exists -touch ./server.cfg - -# start the container -docker run -it \ - -p 27015:27015/tcp \ - -p 27015:27015/udp \ - -e "AUTHKEY=..." \ - -e "GAMEMODE=terrortown" \ - -e "MAP=ttt_minecraft_b5" \ - -e "WORKSHOP=843519054" \ - -e "WORKSHOPDL=843519054" \ - -v ./server.cfg:/opt/steam/garrysmod/cfg/server.cfg \ - -v ./overlay:/opt/overlay \ - git.sh-edraft.de/sh-edraft.de/garrysmod -``` - -This uses the [TTT Workshop Collection](https://steamcommunity.com/sharedfiles/filedetails/?id=843519054), downloaded both server-side (`WORKSHOP`) and client-side (`WORKSHOPDL`). - ## Environment Variables | Variable | Description | Default | | --- | --- | --- | -| `AUTHKEY` | Steam Web API key. Required for the public server list and Workshop downloads. Get one at | _(empty)_ | -| `GLST` | Game Server Login Token for public listing. Get one at (App ID `4000`). Not needed if `AUTHKEY` is set | _(empty)_ | -| `GAME` | Game mod directory | `garrysmod` | -| `GAMEMODE` | Gamemode to run on server start | `sandbox` | -| `MAP` | Map to load on server start | `gm_flatgrass` | -| `MAPGROUP` | Map group / map cycle group | `mg_active` | -| `GAMETYPE` | Game type passed to the server | `0` | -| `MAXPLAYERS` | Maximum number of players | `16` | -| `TICKRATE` | Server tickrate. **Note:** changing this is not recommended | `66` | -| `CONFIG` | Server config file, relative to `cfg/`. **Note:** changing this is not recommended | `server.cfg` | -| `WORKSHOP` | Workshop collection ID to download for the server | _(empty)_ | -| `WORKSHOPDL` | Workshop collection ID for clients to download before joining | _(empty)_ | +| `INSTANCEID` | Server instance id, used as the directory name under `Servers/` | `Server1` | +| `SERVERNAME` | Name shown in the server browser | `Unturned Server` | +| `SERVERPASSWORD` | Password required to join the server | _(empty)_ | +| `ADMINPASSWORD` | Password required for admin access | _(empty)_ | +| `OWNER` | SteamID64 of the server owner | `0` | +| `MAP` | Map to load on server start | `PEI` | +| `MAXPLAYERS` | Maximum number of players | `8` | +| `PERSPECTIVE` | Allowed perspectives (`Both`, `First`, `Third`) | `Both` | +| `PVP` | Enable player-vs-player damage | `true` | +| `PORT` | Game port | `27015` | +| `VAC` | Enable Valve Anti-Cheat | `true` | +| `EASYANTICHEAT` | Enable Easy Anti-Cheat | `true` | +| `WORKSHOP` | Space-separated Workshop item/collection IDs to download | _(empty)_ | | `CUSTOMPARAMETERS` | Additional raw command-line parameters appended to the server start command | _(empty)_ | - -## Overlay Folder - -You can use an overlay folder to add or overwrite files provided by Steam (e.g. addons, configs, maps) without rebuilding the image: - -```bash --v ./overlay:/opt/overlay -``` - -See [hackebein/docker-srcds: Overlay folder](https://github.com/Hackebein/docker-srcds#overlay-folder) for details. - -## Further Configuration - -This image inherits all environment variables and options from the parent image. See [hackebein/docker-srcds](https://github.com/Hackebein/docker-srcds) for the full list of available configuration options. diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..e73a298 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -e + +SERVERDIR="/home/steam/unturned/Servers/${INSTANCEID}/Server" +mkdir -p "${SERVERDIR}" + +cat > "${SERVERDIR}/Commands.dat" <> "${SERVERDIR}/Commands.dat" +fi + +cd /home/steam/unturned +exec ./Unturned_Headless.x86_64 -batchmode -nographics -nolog +InstanceId="${INSTANCEID}" ${CUSTOMPARAMETERS}