├── .gitattributes ├── .github └── workflows │ └── build.yml ├── .gitignore ├── Dockerfile ├── README.md ├── dev-build └── docker-compose.yml ├── docker-files ├── GeoLite2-Country.mmdb ├── entrypoint.sh ├── patches │ └── keep-me.txt └── zandronum-server.sh └── examples └── multiple-servers ├── configs ├── coop.cfg ├── doom1_maps.cfg ├── doom2_maps.cfg └── global.cfg ├── data ├── pretend_brutal_doom.pk3 ├── pretend_doom.wad ├── pretend_doom2.wad └── pretend_sentinels_lexicon.pk3 └── docker-compose.yml /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | *.sh eol=lf 3 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | # yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json 2 | name: build 3 | 4 | on: [push, pull_request] 5 | 6 | jobs: 7 | build: 8 | runs-on: ubuntu-latest 9 | strategy: 10 | matrix: 11 | # List these here so that they are used as display names in Github Actions Web UI 12 | image_tag_base: [official, tspg] 13 | include: 14 | - repo_url: https://hg.osdn.net/view/zandronum/zandronum-stable 15 | repo_tag: 4178904d7698 # there is no tag for 3.1 16 | image_tag_base: official 17 | image_tag_version: 3.1.0 18 | - repo_url: http://hg.pf.osdn.net/view/d/do/doomjoshuaboy/zatspg-beta 19 | repo_tag: TSPGv26 20 | image_tag_base: tspg 21 | image_tag_version: v26 22 | steps: 23 | - 24 | name: Checkout Source Code 25 | uses: actions/checkout@v2 26 | - 27 | name: Docker QEmu Setup 28 | uses: docker/setup-qemu-action@v1 29 | - 30 | name: Docker Buildx Setup 31 | uses: docker/setup-buildx-action@v1 32 | - 33 | name: Docker Login 34 | uses: docker/login-action@v1 35 | if: github.ref == 'refs/heads/master' 36 | with: 37 | username: ${{ secrets.DOCKER_HUB_USERNAME }} 38 | password: ${{ secrets.DOCKER_HUB_PASSWORD }} 39 | - 40 | name: Docker Build & Push 41 | uses: docker/build-push-action@v2 42 | with: 43 | # Only publish new images when building the master branch 44 | push: ${{ github.ref == 'refs/heads/master' }} 45 | platforms: linux/amd64,linux/arm64 46 | build-args: | 47 | REPO_URL=${{ matrix.repo_url }} 48 | REPO_TAG=${{ matrix.repo_tag }} 49 | tags: | 50 | rcdailey/zandronum-server:${{ matrix.image_tag_base }}-latest 51 | rcdailey/zandronum-server:${{ matrix.image_tag_base }}-${{ matrix.image_tag_version }} 52 | - 53 | name: Update Repository Description 54 | uses: peter-evans/dockerhub-description@v2 55 | if: github.ref == 'refs/heads/master' 56 | env: 57 | DOCKERHUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }} 58 | DOCKERHUB_PASSWORD: ${{ secrets.DOCKER_HUB_PASSWORD }} 59 | DOCKERHUB_REPOSITORY: rcdailey/zandronum-server 60 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.log 2 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Build stage for compiling Zandronum 2 | FROM ubuntu:20.04 AS build 3 | WORKDIR /build 4 | ENV DEBIAN_FRONTEND=noninteractive 5 | RUN true \ 6 | && apt-get update -qq \ 7 | && apt-get install -qq --no-install-recommends \ 8 | ca-certificates \ 9 | mercurial \ 10 | g++ \ 11 | cmake \ 12 | ninja-build \ 13 | libssl-dev \ 14 | libsdl1.2-dev \ 15 | wget \ 16 | patch \ 17 | > /dev/null 18 | 19 | # So we can use bash arrays (default /bin/sh doesn't support this) 20 | SHELL ["/bin/bash", "-c"] 21 | 22 | ARG REPO_URL 23 | ARG REPO_TAG 24 | 25 | # Clone the Repository 26 | RUN true \ 27 | && test -n "$REPO_URL" && test -n "$REPO_TAG" \ 28 | && hg clone "$REPO_URL" -r "$REPO_TAG" zandronum 29 | 30 | WORKDIR /build/zandronum 31 | 32 | # Apply Manual Patches (make sure they are UTF-8 encoded) 33 | COPY docker-files/patches /patches 34 | RUN true \ 35 | && shopt -s nullglob \ 36 | && for p in /patches/*.patch; do patch -p1 < $p; done 37 | 38 | # Build Zandronum 39 | RUN true \ 40 | && cmake -G Ninja -W no-dev \ 41 | -D CMAKE_BUILD_TYPE=Release \ 42 | -D SERVERONLY=1 \ 43 | -D CMAKE_C_FLAGS="-w" \ 44 | -D CMAKE_CXX_FLAGS="-w" \ 45 | . \ 46 | && cmake --build . 47 | 48 | # Install Zandronum 49 | ENV INSTALL_DIR=/usr/local/games/zandronum 50 | COPY docker-files/zandronum-server.sh /usr/local/bin/zandronum-server 51 | RUN true \ 52 | && COPY_PATTERNS=(\ 53 | zandronum-server \ 54 | zandronum.pk3 \ 55 | ) \ 56 | && mkdir -p "$INSTALL_DIR" \ 57 | && cp "${COPY_PATTERNS[@]}" "$INSTALL_DIR/" \ 58 | && bin_path=/usr/local/bin/zandronum-server \ 59 | && chmod a+x $bin_path \ 60 | && sed -i "s|INSTALL_DIR|${INSTALL_DIR}|" $bin_path 61 | 62 | # Install GeoIP.dat 63 | COPY docker-files/GeoLite2-Country.mmdb "$INSTALL_DIR/GeoIP.dat" 64 | 65 | # Final stage for running the zandronum server. 66 | # Copies over everything in /usr/local. 67 | FROM ubuntu:20.04 68 | COPY --from=build /usr/local/ /usr/local/ 69 | RUN true \ 70 | && apt-get update -qq \ 71 | && apt-get install -qq --no-install-recommends \ 72 | tini \ 73 | libssl1.1 \ 74 | libsdl1.2debian \ 75 | gosu \ 76 | > /dev/null \ 77 | && rm -rf /var/lib/apt/lists/* 78 | 79 | # Environment variables used to map host UID/GID to internal 80 | # user used to launch zandronum-server. 81 | ENV ZANDRONUM_UID= \ 82 | ZANDRONUM_GID= 83 | 84 | # Entrypoint 85 | COPY ./docker-files/entrypoint.sh / 86 | RUN chmod +x /entrypoint.sh 87 | ENTRYPOINT ["tini", "--", "/entrypoint.sh"] 88 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Zandronum Server Docker Images 2 | 3 | Host your Zandronum server using Docker! 4 | 5 | * [Docker Hub](https://hub.docker.com/r/rcdailey/zandronum-server) 6 | * [Github Repository](https://github.com/rcdailey/zandronum-server) 7 | 8 | [![Actions Status](https://github.com/rcdailey/zandronum-server/workflows/build/badge.svg)](https://github.com/rcdailey/zandronum-server/actions) 9 | 10 | ## Docker Tags 11 | 12 | There are various versions and forks of Zandronum available. The tags are in a `-` 13 | format. The various distributions are described in the list below. Each distro has a latest tag, in 14 | the format `-latest`. 15 | 16 | * [**Official**](https://osdn.net/projects/zandronum/scm/hg/zandronum-stable)
17 | The unmodified & official version of Zandronum.
18 | Tags: `official-latest`, `official-3.1.0`, etc 19 | * [**TSPG**](https://osdn.net/users/doomjoshuaboy/pf/zatspg-beta/wiki/FrontPage)
20 | A fork of the official Zandronum code base that is used for servers hosted on [The Sentinel's 21 | Playground](https://allfearthesentinel.net/) (TSPG).
22 | Tags: `tspg-latest`, `tspg-v26`, etc 23 | 24 | ## Installation and Usage 25 | 26 | It's recommended to use Docker Compose to configure your Zandronum instance(s). This will allow you 27 | great flexibility over the configuration of your containers. Below is an example that will help get 28 | you started on setting up your own server. There isn't one true way to configure things; there's a 29 | lot of flexibility. But it is easier to start by using this example and then adjusting it as needed. 30 | 31 | ```yml 32 | version: '3.7' 33 | 34 | services: 35 | doom2: 36 | image: rcdailey/zandronum-server:official-latest 37 | restart: always 38 | network_mode: host 39 | command: > 40 | -port 10667 41 | -iwad /data/doom2.wad 42 | -file /data/BD21RC7.pk3 43 | -file /data/mapsofchaos-hc.wad 44 | -file /data/DoomMetalVol4.wad 45 | +exec /configs/global.cfg 46 | +exec /configs/coop.cfg 47 | +exec /configs/doom2.cfg 48 | volumes: 49 | - ./data:/data:ro 50 | - ./configs:/configs:ro 51 | ``` 52 | 53 | Customization of your Zandronum instance will be done through a combination of command arguments and 54 | configuration files. Use the `>` character (as shown above) after the `command:` property to allow 55 | your list of options to be on multiple lines for readability. 56 | 57 | For more examples, see the `examples` directory in this repository. 58 | 59 | ## Networking 60 | 61 | ### Host Networking 62 | 63 | Due to the inflexible nature of how Zandronum's networking code functions, I recommend using `host` 64 | network mode (reflected in my example above). If you prefer more network isolation and would like to 65 | use `bridge` network mode, please read the following section. 66 | 67 | ### Bridge Networking 68 | 69 | If you use `bridge` networking, LAN broadcasting (via `sv_broadcast`) does not work properly. This 70 | is because Zandronum advertises the bound IP address (which is on the docker bridge subnet), which 71 | your LAN subnet will not have direct access to. Other than that, though, everything works. The 72 | sub-sections below go into more detail. 73 | 74 | #### Port Numbers 75 | 76 | Typically with Docker containers, if you want to run multiple instances of a service and run them 77 | each on different ports, you would simply map a different port on the host. However, the way 78 | Zandronum works requires some special configuration. Zandronum reports its own listening port to the 79 | master server. 80 | 81 | Because of this, you *must* specify a different listening port for Zandronum by giving the `-port` 82 | option. Note that this is only a requirement if you plan to run two or more instances of this 83 | container. 84 | 85 | If you change the port, make sure you map that to the host. Using the example above, I used port 86 | `10667` and which you would map to the host by adding the following additional YAML to your 87 | `docker-compose.yml` file: 88 | 89 | ```yml 90 | ports: 91 | - 10667:10667/udp 92 | ``` 93 | 94 | #### IP Address 95 | 96 | It's worth noting that in bridge network mode, the IP address that Zandronum is listening on is 97 | *not* reported to the master server. Actually, the master server will list whatever IP address it 98 | received packets from, which will be your public IP, not the Docker bridge IP. So, no additional 99 | configuration is needed for connecting via master server. 100 | 101 | Do remember, however, that the incorrect IP address is broadcast for LAN games, so if this is 102 | important, please use `host` for your `network_mode:` setting. 103 | 104 | ## PWAD / IWAD Selection 105 | 106 | Put all your WAD files (PWAD + IWAD) in a directory and map that as a volume into the container. You 107 | can put it anywhere. In my case, I mounted my WAD directory to `/data` in the container. 108 | 109 | From there, provide the path to the main IWAD by using the `-iwad` option. Specify the `-file` 110 | argument one or more times to add more PWADs to your server (such as the Brutal Doom mod). Depending 111 | on how you mapped your volumes, you may specify individual PWAD files: 112 | 113 | ```txt 114 | -file /data/mywad.pk3 115 | ``` 116 | 117 | Or you can use wildcards to tell Zandronum to load all PWAD files in that directory: 118 | 119 | ```txt 120 | -file /data/* 121 | ``` 122 | 123 | ## User & Group 124 | 125 | Inside the container, `zandronum-server` runs as user `doomguy` and group `zandronum`. The 126 | corresponding UID and GID is determined by Docker. If you want to have explicit control over either 127 | the UID or GID used inside the container, you can specify the following environment variables. Note 128 | that overriding this behavior is really only useful if you want to properly map file permissions in 129 | your host volumes to the user running in the container. 130 | 131 | * `ZANDRONUM_UID`
132 | The User ID on the *host machine* that will be assigned to the `doomguy` user in the container. 133 | * `ZANDRONUM_GID`
134 | The Group ID on the *host machine* that will be assigned to the `zandronum` group in the 135 | container. 136 | 137 | Note that it is an error to run this image using the `-u`/`--user` argument to `docker run` or the 138 | `user:` property in `docker-compose.yml`. The container *itself* must start as a root user, but the 139 | `zandronum-server` process is started using the local user & group. 140 | 141 | ### Examples 142 | 143 | As an example, you can add the following attributes to the existing YAML example file (shown 144 | earlier) which will assign the `doomguy` user to UID 1000 and GID 1050: 145 | 146 | ```yml 147 | environment: 148 | - ZANDRONUM_UID=1000 149 | - ZANDRONUM_GID=1050 150 | ``` 151 | 152 | Or you can map these to environment variables you defined in your `~/.bashrc`, for example (based on 153 | Ubuntu 18.04): 154 | 155 | ```bash 156 | export UID 157 | export GID="$(id -g)" 158 | ``` 159 | 160 | Which you would use in your `docker-compose.yml` like so: 161 | 162 | ```yml 163 | environment: 164 | - ZANDRONUM_UID=$UID 165 | - ZANDRONUM_GID=$GID 166 | ``` 167 | 168 | ## Configuration Files 169 | 170 | For in-depth configuration, especially related to controlling how gameplay will work on your server, 171 | you should provide configuration files. How you structure these files and how they are named are up 172 | to you. I personally choose the `.cfg` extension. I also like to have my config files mounted in a 173 | different volume and directory than my WAD files, which is why in this example I have a `/configs` 174 | mount (for only `.cfg` files) and a `/data` mount where I keep all my WAD files. 175 | 176 | I'll provide the contents of the config files I used in the above example. Some of these you will 177 | want, such as the master server list configuration. But mostly this is meant to give you some ideas 178 | on how to set up your server. 179 | 180 | ### `/configs/global.cfg` 181 | 182 | This is the configuration I give to *all* of my servers, regardless of their purpose. 183 | 184 | ```txt 185 | set sv_broadcast 0 186 | set sv_updatemaster 1 187 | set sv_enforcemasterbanlist true 188 | set sv_markchatlines true 189 | set masterhostname "master.zandronum.com:15300" 190 | ``` 191 | 192 | ### `/configs/coop.cfg` 193 | 194 | I keep my cooperative gameplay settings in its own config file. This allows me to share these 195 | settings between multiple server instances (I run more than one server from Docker Compose). 196 | 197 | ```txt 198 | set sv_maxplayers 8 199 | set sv_maxclients 8 200 | set sv_unblockplayers 1 201 | set sv_coop_loseinventory 0 202 | set sv_coop_losekeys 0 203 | set sv_coop_loseweapons 0 204 | set sv_coop_loseammo 0 205 | set sv_sharekeys 1 206 | 207 | set skill 3 208 | set cooperative 1 209 | set teamdamage 0 210 | set compatflags 620756992 211 | ``` 212 | 213 | ### `/configs/doom2.cfg` 214 | 215 | This last config is dedicated to just the doom2 service in my `docker-compose.yml`, which represents 216 | a single server instance: 217 | 218 | ```txt 219 | set sv_hostname "This is the DOOM2 Server" 220 | set sv_maprotation true 221 | set sv_randommaprotation 1 222 | set sv_samelevel false 223 | 224 | addmap MAP01 225 | addmap MAP02 226 | addmap MAP03 227 | addmap MAP04 228 | addmap MAP05 229 | ``` 230 | 231 | ## Building the Images 232 | 233 | The `Dockerfile` takes two arguments when you run `docker build` (provided via the `--build-arg` 234 | option): 235 | 236 | * `REPO_URL`
237 | The Mercurial repository URL (HTTPS only) of the Zandronum code base. This can be the official 238 | repo or a compatible fork. 239 | * `REPO_TAG`
240 | The tag in the repository to clone & build. 241 | -------------------------------------------------------------------------------- /dev-build/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | official: 5 | image: rcdailey/zandronum-server:official-local 6 | build: 7 | context: .. 8 | args: 9 | - REPO_URL=https://hg.osdn.net/view/zandronum/zandronum-stable 10 | - REPO_TAG=4178904d7698 11 | 12 | tspg: 13 | image: rcdailey/zandronum-server:tspg-local 14 | build: 15 | context: .. 16 | args: 17 | - REPO_URL=http://hg.pf.osdn.net/view/d/do/doomjoshuaboy/zatspg-beta 18 | - REPO_TAG=TSPGv26 19 | -------------------------------------------------------------------------------- /docker-files/GeoLite2-Country.mmdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rcdailey/zandronum-server/87a5091a79ca913902259618bba5caaeaca5d92c/docker-files/GeoLite2-Country.mmdb -------------------------------------------------------------------------------- /docker-files/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -exu 3 | 4 | # Do not allow container to be started as non-root user 5 | if (( "$(id -u)" != 0 )); then 6 | echo "You must run the container as root. To specify a custom user," 7 | echo "use the ZANDRONUM_UID and ZANDRONUM_GID environment variables" 8 | exit 1 9 | fi 10 | 11 | # Create the group for the server process 12 | [[ -n "$ZANDRONUM_GID" ]] && GID_OPTION="--gid $ZANDRONUM_GID" 13 | groupadd zandronum --force ${GID_OPTION-} 14 | 15 | # Create the user for the server process 16 | [[ -n "$ZANDRONUM_UID" ]] && UID_OPTION="--uid $ZANDRONUM_UID" 17 | useradd doomguy --create-home ${UID_OPTION-} \ 18 | --shell /sbin/nologin \ 19 | --group zandronum \ 20 | || true # Do not fail if user already exists 21 | 22 | # Start the zandronum-server process with local user & group 23 | gosu doomguy:zandronum zandronum-server -host "$@" 24 | -------------------------------------------------------------------------------- /docker-files/patches/keep-me.txt: -------------------------------------------------------------------------------- 1 | This is to force Git to create empty directories. Do not remove. 2 | -------------------------------------------------------------------------------- /docker-files/zandronum-server.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Set the working directory to the Zandronum installation dir. This is so it can find its own files, 4 | # like zandronum.pk3, GeoIP.dat, etc. 5 | cd "INSTALL_DIR" 6 | exec "INSTALL_DIR/zandronum-server" "$@" 7 | -------------------------------------------------------------------------------- /examples/multiple-servers/configs/coop.cfg: -------------------------------------------------------------------------------- 1 | set sv_maxplayers 8 2 | set sv_maxclients 8 3 | set sv_unblockplayers 1 4 | set sv_coop_loseinventory 0 5 | set sv_coop_losekeys 0 6 | set sv_coop_loseweapons 0 7 | set sv_coop_loseammo 0 8 | set sv_sharekeys 1 9 | 10 | set skill 3 11 | set cooperative 1 12 | set teamdamage 0 13 | set compatflags 620756992 14 | -------------------------------------------------------------------------------- /examples/multiple-servers/configs/doom1_maps.cfg: -------------------------------------------------------------------------------- 1 | sv_maprotation true 2 | sv_randommaprotation 1 3 | sv_samelevel false 4 | 5 | addmap E1M1 6 | addmap E1M2 7 | addmap E1M3 8 | addmap E1M4 9 | addmap E1M5 10 | addmap E1M6 11 | addmap E1M7 12 | addmap E1M8 13 | addmap E1M9 14 | addmap E2M1 15 | addmap E2M2 16 | addmap E2M3 17 | addmap E2M4 18 | addmap E2M5 19 | addmap E2M6 20 | addmap E2M7 21 | addmap E2M8 22 | addmap E2M9 23 | addmap E3M1 24 | addmap E3M2 25 | addmap E3M3 26 | addmap E3M4 27 | addmap E3M5 28 | addmap E3M6 29 | addmap E3M7 30 | addmap E3M8 31 | addmap E3M9 32 | addmap E4M1 33 | addmap E4M2 34 | addmap E4M3 35 | addmap E4M4 36 | addmap E4M5 37 | addmap E4M6 38 | addmap E4M7 39 | addmap E4M8 40 | addmap E4M9 41 | -------------------------------------------------------------------------------- /examples/multiple-servers/configs/doom2_maps.cfg: -------------------------------------------------------------------------------- 1 | sv_maprotation true 2 | sv_randommaprotation 1 3 | sv_samelevel false 4 | 5 | addmap MAP01 6 | addmap MAP02 7 | addmap MAP03 8 | addmap MAP04 9 | addmap MAP05 10 | addmap MAP06 11 | addmap MAP07 12 | addmap MAP08 13 | addmap MAP09 14 | addmap MAP10 15 | addmap MAP11 16 | addmap MAP12 17 | addmap MAP13 18 | addmap MAP14 19 | addmap MAP15 20 | addmap MAP16 21 | addmap MAP17 22 | addmap MAP18 23 | addmap MAP19 24 | addmap MAP20 25 | addmap MAP21 26 | addmap MAP22 27 | addmap MAP23 28 | addmap MAP24 29 | addmap MAP25 30 | addmap MAP26 31 | addmap MAP27 32 | addmap MAP28 33 | addmap MAP29 34 | addmap MAP30 35 | addmap MAP31 36 | -------------------------------------------------------------------------------- /examples/multiple-servers/configs/global.cfg: -------------------------------------------------------------------------------- 1 | set sv_broadcast 0 2 | set sv_updatemaster 1 3 | set sv_enforcemasterbanlist true 4 | set sv_rconpassword your_admin_password_here 5 | set sv_markchatlines true 6 | set masterhostname "master.zandronum.com:15300" 7 | -------------------------------------------------------------------------------- /examples/multiple-servers/data/pretend_brutal_doom.pk3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rcdailey/zandronum-server/87a5091a79ca913902259618bba5caaeaca5d92c/examples/multiple-servers/data/pretend_brutal_doom.pk3 -------------------------------------------------------------------------------- /examples/multiple-servers/data/pretend_doom.wad: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rcdailey/zandronum-server/87a5091a79ca913902259618bba5caaeaca5d92c/examples/multiple-servers/data/pretend_doom.wad -------------------------------------------------------------------------------- /examples/multiple-servers/data/pretend_doom2.wad: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rcdailey/zandronum-server/87a5091a79ca913902259618bba5caaeaca5d92c/examples/multiple-servers/data/pretend_doom2.wad -------------------------------------------------------------------------------- /examples/multiple-servers/data/pretend_sentinels_lexicon.pk3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rcdailey/zandronum-server/87a5091a79ca913902259618bba5caaeaca5d92c/examples/multiple-servers/data/pretend_sentinels_lexicon.pk3 -------------------------------------------------------------------------------- /examples/multiple-servers/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | 3 | services: 4 | doom1: 5 | image: rcdailey/zandronum-server:tspg-latest 6 | restart: always 7 | network_mode: host 8 | volumes: 9 | - ./data:/data:ro 10 | - ./configs:/configs:ro 11 | command: > 12 | -port 10666 13 | -iwad /data/pretend_doom.wad 14 | -file /data/pretend_brutal_doom.pk3 15 | +exec /configs/global.cfg 16 | +exec /configs/coop.cfg 17 | +exec /configs/doom1_maps.cfg 18 | +sv_hostname "The Doom 1 Coop Server" 19 | 20 | doom2: 21 | image: rcdailey/zandronum-server:tspg-latest 22 | restart: always 23 | network_mode: host 24 | volumes: 25 | - ./data:/data:ro 26 | - ./configs:/configs:ro 27 | command: > 28 | -port 10667 29 | -iwad /data/pretend_doom2.wad 30 | -file /data/pretend_brutal_doom.pk3 31 | +exec /configs/global.cfg 32 | +exec /configs/coop.cfg 33 | +exec /configs/doom2_maps.cfg 34 | +sv_hostname "The Doom 2 Coop Server" 35 | 36 | lexicon: 37 | image: rcdailey/zandronum-server:tspg-latest 38 | restart: always 39 | network_mode: host 40 | volumes: 41 | - ./data:/data:ro 42 | - ./configs:/configs:ro 43 | command: > 44 | -port 10668 45 | -iwad /data/pretend_doom2.wad 46 | -file /data/pretend_sentinels_lexicon.pk3 47 | +exec /configs/global.cfg 48 | +exec /configs/coop.cfg 49 | +sv_hostname "The Sentinel Lexicon Server" 50 | +map VR 51 | +lexicon_timer_start 60 52 | --------------------------------------------------------------------------------