SS14-Docker-Linux-Server 🚀

Containerized deployment of the Space Station 14 server on Linux.

[![Create and publish a Docker image](https://github.com/LiamAEdwards/SS14-Docker-Linux-Server/actions/workflows/main.yml/badge.svg?branch=main)](https://github.com/LiamAEdwards/SS14-Docker-Linux-Server/actions/workflows/main.yml)
### Overview This project is for those who prefer containerized solutions. It's based on the [official documentation](https://docs.spacestation14.com/en/general-development/setup/server-hosting-tutorial.html) but wraps the [wylab-station-14](https://git.wylab.me/wylab/wylab-station-14) fork in a Docker image that is built from source during the Docker build. ### Building the Image 1. **Clone this repository** ```bash git clone https://git.wylab.me/wylab/WS14-Docker-Linux-Server.git cd WS14-Docker-Linux-Server ``` 2. **Configure your server defaults** Edit `appsettings.yml` and `server_config.toml` with the values you want baked into the image. These files will be copied into `/ss14-default/publish` on first run. 3. **Build the Docker image** ```bash docker build \ --build-arg SOURCE_REPO=https://git.wylab.me/wylab/wylab-station-14.git \ --build-arg SOURCE_REF=master \ --build-arg TARGET_PLATFORM=auto \ -t git.wylab.me/wylab/WS14-Docker-Linux-Server:local . ``` - `SOURCE_REPO` – Git URL of the content repo to compile (defaults to the wylab fork). - `SOURCE_REF` – Branch, tag, or commit to check out (defaults to `master`). - `TARGET_PLATFORM` – Runtime identifier passed to the packaging tool. Use `auto` (default) to match the Docker target platform automatically, or override with `linux-x64`, `linux-arm64`, or `linux-arm` to force an architecture. If you are building on one architecture and running on another (for example, building on x86 and deploying to an ARM board), build with an explicit platform to avoid `exec format error`: ```bash docker buildx build \ --platform linux/arm64 \ --build-arg TARGET_PLATFORM=linux-arm64 \ -t git.wylab.me/wylab/WS14-Docker-Linux-Server:arm64 . ``` The build container clones the selected ref, runs `RUN_THIS.py --quiet` to fetch submodules, and executes `dotnet run --project Content.Packaging server` to generate a release zip that is baked into the final layer. ### Running the Server ```bash docker run -d \ -p 1212:1212/tcp \ -p 1212:1212/udp \ -p 5000:5000/tcp \ -p 5000:5000/udp \ -v /path/on/host:/ss14 \ --name wylab-ss14 \ git.wylab.me/wylab/WS14-Docker-Linux-Server:latest ``` On first start the container copies `/ss14-default` into your mounted volume (if empty) so you can edit configs or upload new builds persistently. You can still wrap the container in Docker Compose if desired: ```yaml version: '3.9' services: ss14-server: image: git.wylab.me/wylab/WS14-Docker-Linux-Server:latest ports: - "1212:1212/tcp" - "1212:1212/udp" - "5000:5000/tcp" - "5000:5000/udp" volumes: - /path/on/host:/ss14 restart: unless-stopped ``` ### CI/CD Two workflows keep this image up to date: 1. **`wylab-station-14/.github/workflows/publish.yml`** - Triggered on pushes to `master`, manual dispatch, or nightly cron. - Checks `https://cdn.wylab.me/fork/wylab/manifest` first; if the current commit already exists on the CDN it exits early. - Uses `actions/cache` to persist `~/.nuget/packages` and `RobustToolbox/bin`, so repeated builds reuse restored packages/engine binaries when the inputs haven’t changed. - Otherwise builds the server/client packages via `Content.Packaging`, uploads them via `Tools/publish_multi_request.py`, and fires a `repository_dispatch` event (`event_type: ss14-package-ready`) to this repo. Required secrets in the wylab-station-14 repo: `PUBLISH_TOKEN`, `DOCKER_TRIGGER_TOKEN`, and (if used) `SECRETS_PRIVATE_KEY`. To send the dispatch, add `DOCKER_TRIGGER_TOKEN` (a PAT with repo access). 2. **`WS14-Docker-Linux-Server/.github/workflows/main.yml`** - Triggered on pushes here, manual dispatch, or the `ss14-package-ready` event. - Resolves the target wylab commit (uses the payload commit if provided). - Logs into `git.wylab.me` and runs `docker manifest inspect` before building; if an image tagged with that commit already exists it skips the build. - Otherwise builds the Docker image with `SOURCE_REF=` and pushes: - `git.wylab.me/wylab/ws14-docker-linux-server:latest` - `git.wylab.me/wylab/ws14-docker-linux-server:` - `git.wylab.me/wylab/ws14-docker-linux-server:` Required secrets here: `REGISTRY_USERNAME` / `REGISTRY_PASSWORD` (credentials for `git.wylab.me`). After the build finishes, Unraid (or any host) can pull: ``` git.wylab.me/wylab/ws14-docker-linux-server:latest ``` Use that string in Unraid’s “Repository” field and map `/ss14` to persistent storage. ---