├── .github └── workflows │ ├── README.md │ ├── master_build_release.yml │ └── pr_build.yml ├── .gitignore ├── .hack ├── build.sh └── test.sh ├── README.md ├── dontstarve ├── Dockerfile ├── data │ └── clusters │ │ └── default │ │ ├── Master │ │ └── server.ini │ │ ├── cluster.ini │ │ └── cluster.ini.example └── run.sh ├── dwarf_fortress ├── Dockerfile ├── README.md └── run.sh ├── factorio ├── Dockerfile ├── README.md ├── configs │ ├── map-gen-settings.json │ ├── map-settings.json │ └── server-settings.json └── run.sh ├── minecraft ├── Dockerfile ├── Dockerfile.paper ├── README.md ├── data │ └── configs │ │ └── server.properties └── run.sh ├── rust ├── .dockerignore ├── Dockerfile ├── data │ └── configs │ │ ├── server.cfg │ │ └── server.example.cfg ├── dev.sh └── run.sh ├── satisfactory ├── Dockerfile ├── README.md ├── config │ ├── ApexDestruction.ini │ ├── Compat.ini │ ├── ControlRig.ini │ ├── DeviceProfiles.ini │ ├── EditorScriptingUtilities.ini │ ├── Engine.ini │ ├── FullBodyIK.ini │ ├── Game.ini │ ├── GameUserSettings.ini │ ├── Hardware.ini │ ├── Input.ini │ ├── MotoSynth.ini │ ├── Niagara.ini │ ├── Paper2D.ini │ ├── PhysXVehicles.ini │ ├── RuntimeOptions.ini │ ├── Scalability.ini │ ├── ServerSettings.ini │ ├── Synthesis.ini │ └── VariantManagerContent.ini └── run.sh ├── steamcmd ├── Dockerfile ├── data │ └── configs │ │ └── configure.sh └── install.sh ├── terraria ├── Dockerfile ├── README.md ├── data │ └── configs │ │ └── serverconfig.txt ├── generate_config.sh └── run.sh ├── valheim ├── Dockerfile ├── README.md └── run.sh └── versions.txt /.github/workflows/README.md: -------------------------------------------------------------------------------- 1 | ## Master Build and Publish Release `master_build_release.yml` 2 | 3 | Builds, tags and pushes to semver tags to docker hub. 4 | 5 | 6 | Only runs on push to mainline with an edit to [`versions.txt`](../../versions.txt). 7 | 8 | 9 | ## PR Build WIP `pr_build.yml` 10 | 11 | Builds images for pull requests against mainline 12 | -------------------------------------------------------------------------------- /.github/workflows/master_build_release.yml: -------------------------------------------------------------------------------- 1 | name: Master Build and Publish Release 2 | 3 | on: 4 | push: 5 | branches: [master] 6 | paths: 7 | - "versions.txt" 8 | jobs: 9 | steamcmd: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v3 13 | - name: Login to Docker Hub 14 | uses: docker/login-action@v2 15 | with: 16 | username: ${{ secrets.DOCKER_USERNAME }} 17 | password: ${{ secrets.DOCKER_PASSWORD }} 18 | - name: Login to GitHub Container Registry 19 | uses: docker/login-action@v2 20 | with: 21 | registry: ghcr.io 22 | username: ${{ github.repository_owner }} 23 | password: ${{ secrets.GITHUB_TOKEN }} 24 | - name: Build SteamCMD 25 | uses: docker/build-push-action@v3 26 | env: 27 | STEAM_USER: anonymous 28 | with: 29 | context: ./steamcmd 30 | platforms: linux/amd64 31 | push: true 32 | tags: | 33 | docker.io/gamenight/steamcmd:latest 34 | docker.io/gamenight/steamcmd:${{ github.sha }} 35 | ghcr.io/${{ github.repository }}/steamcmd:latest 36 | ghcr.io/${{ github.repository }}/steamcmd:${{ github.sha }} 37 | 38 | build-game-servers: 39 | runs-on: ubuntu-latest 40 | needs: [steamcmd] 41 | strategy: 42 | matrix: 43 | game: 44 | - "minecraft" 45 | - "terraria" 46 | - "factorio" 47 | - "dwarf_fortress" 48 | - "valheim" 49 | - "satisfactory" 50 | # - "rust" 51 | # - "dontstarve" 52 | steps: 53 | - uses: actions/checkout@v3 54 | - name: Login to Docker Hub 55 | uses: docker/login-action@v2 56 | with: 57 | username: ${{ secrets.DOCKER_USERNAME }} 58 | password: ${{ secrets.DOCKER_PASSWORD }} 59 | - name: Login to GitHub Container Registry 60 | uses: docker/login-action@v2 61 | with: 62 | registry: ghcr.io 63 | username: ${{ github.repository_owner }} 64 | password: ${{ secrets.GITHUB_TOKEN }} 65 | - name: Build ${{matrix.game}} 66 | uses: docker/build-push-action@v3 67 | env: 68 | STEAM_USER: anonymous 69 | with: 70 | context: ./${{ matrix.game }} 71 | platforms: linux/amd64 72 | push: true 73 | labels: | 74 | org.opencontainers.image.source=https://github.com/adamveld12/gamenight.git 75 | org.opencontainers.image.url=https://github.com/adamveld12/gamenight 76 | org.opencontainers.image.revision=${{ github.sha }} 77 | org.gamenight.game-id=${{ matrix.game }} 78 | org.opencontainers.image.licenses=MIT 79 | org.opencontainers.image.authors=Adam Veldhousen 80 | tags: | 81 | docker.io/gamenight/${{ matrix.game }}:latest 82 | docker.io/gamenight/${{ matrix.game }}:${{ github.sha }} 83 | ghcr.io/${{ github.repository }}/${{ matrix.game }}:latest 84 | ghcr.io/${{ github.repository }}/${{ matrix.game }}:${{ github.sha }} 85 | -------------------------------------------------------------------------------- /.github/workflows/pr_build.yml: -------------------------------------------------------------------------------- 1 | name: PR Build WIP 2 | 3 | on: 4 | pull_request: 5 | branches: [master] 6 | 7 | jobs: 8 | steamcmd: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v2 12 | - name: Build SteamCMD 13 | uses: docker/build-push-action@v3 14 | env: 15 | STEAM_USER: anonymous 16 | with: 17 | context: ./steamcmd 18 | platforms: linux/amd64 19 | push: false 20 | tags: | 21 | docker.io/gamenight/steamcmd:wip-latest 22 | docker.io/gamenight/steamcmd:${{ github.sha }} 23 | ghcr.io/${{ github.repository }}/steamcmd:wip-latest 24 | ghcr.io/${{ github.repository }}/steamcmd:${{ github.sha }} 25 | 26 | build-game-servers: 27 | runs-on: ubuntu-latest 28 | needs: [steamcmd] 29 | strategy: 30 | matrix: 31 | game: 32 | - "minecraft" 33 | - "terraria" 34 | - "factorio" 35 | - "dwarf_fortress" 36 | - "valheim" 37 | - "satisfactory" 38 | # - "rust" 39 | # - "dontstarve" 40 | steps: 41 | - uses: actions/checkout@v2 42 | - name: Check for image changes 43 | uses: getsentry/paths-filter@v2 44 | id: changes 45 | with: 46 | filters: | 47 | src: 48 | - ${{ matrix.game }}/** 49 | - if: steps.changes.outputs.src == 'true' 50 | name: Build ${{ matrix.game }} 51 | env: 52 | STEAM_USER: anonymous 53 | run: | 54 | .hack/build.sh ${{ matrix.game }} WIP 55 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.tar.xz 2 | */data/saves/ -------------------------------------------------------------------------------- /.hack/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | export BRANCH=$GITHUB_REF; 3 | export SHA=$(git rev-parse --short=6 HEAD); 4 | export BUILD_DATE=$(date --iso-8601=minutes) 5 | 6 | if [ ! -z "${DOCKER_PASSWORD}" ]; then 7 | docker login -u adamveld12 -p ${DOCKER_PASSWORD} 8 | fi 9 | 10 | function build() { 11 | local buildDir=$1; 12 | 13 | # WIP = only build 14 | # RELEASE = build and tag with the versions.txt, and then push 15 | local tag_mode=${2:-"WIP"}; 16 | 17 | local imageName="gamenight/${buildDir}"; 18 | 19 | if [ -z "$buildDir" ]; then 20 | echo "No build directory specified"; 21 | exit 1; 22 | fi 23 | 24 | 25 | local version=$(cat "./versions.txt" | grep ${buildDir} | awk '{print $2}'); 26 | 27 | if [ -z "${version}" ]; then 28 | echo "${buildDir} can not be tagged because it is not in the versions.txt file or entry is missing verion."; 29 | exit 0; 30 | fi 31 | 32 | case "$tag_mode" in 33 | "WIP") 34 | local tag="pr-${version}-${SHA}"; 35 | ;; 36 | "RELEASE") 37 | local tag=${version}; 38 | ;; 39 | *) 40 | echo "Unknown tag mode, should be WIP or RELEASE: ${tag_mode}"; 41 | exit 1; 42 | ;; 43 | esac 44 | 45 | echo "Detected ${buildDir} version: ${version}"; 46 | 47 | echo -e "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nBuilding '${imageName}'\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" 48 | docker build --build-arg "STEAM_USER=${STEAM_USER}" --build-arg "STEAM_PASS=${STEAM_PASS}" \ 49 | --build-arg "VERSION=${version}" \ 50 | --label="org.opencontainers.image.created=${BUILD_DATE}" \ 51 | --label="org.opencontainers.image.source=https://github.com/adamveld12/gamenight.git" \ 52 | --label="org.opencontainers.image.url=https://github.com/adamveld12/gamenight" \ 53 | --label="org.opencontainers.image.revision=${SHA}" \ 54 | --label="org.gamenight.version=${tag}" \ 55 | --label="org.gamenight.game-id=${buildDir}" \ 56 | --label="org.opencontainers.image.licenses=MIT" \ 57 | --label="org.opencontainers.image.authors=Adam Veldhousen " \ 58 | -t "${imageName}:${tag}" \ 59 | -t "${imageName}:${SHA}" \ 60 | -t "${imageName}:latest" \ 61 | -t "ghcr.io/${imageName}:${tag}" \ 62 | -t "ghcr.io/${imageName}:${SHA}" \ 63 | -t "ghcr.io/${imageName}:latest" \ 64 | -f "${buildDir}/Dockerfile" \ 65 | ${buildDir}; 66 | 67 | if [ "${tag_mode}" = "RELEASE" ]; then 68 | echo "Releasing ${imageName}:${tag}"; 69 | docker push "${imageName}:${SHA}"; 70 | docker push "${imageName}:latest"; 71 | docker push "${imageName}:${tag}"; 72 | fi; 73 | } 74 | 75 | if ! [ -z "$1" ]; then 76 | build $1 $2; 77 | fi 78 | -------------------------------------------------------------------------------- /.hack/test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ "$2" = "force" ]; then 4 | .hack/build.sh $1; 5 | fi 6 | 7 | docker run -it --rm --name ${1} \ 8 | -v "$PWD/${1}/run.sh:/games/${1}/run.sh:ro" \ 9 | -e PUID=1000 \ 10 | -e PGID=1000 \ 11 | --entrypoint=sh \ 12 | gamenight/${1}:latest; 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Game Night 2 | 3 | [![Master Build Releases](https://github.com/adamveld12/gamenight/actions/workflows/master_build_release.yml/badge.svg)](https://github.com/adamveld12/gamenight/actions/workflows/master_build_release.yml) 4 | 5 | A bunch of containerized dedicated servers for games I play on the reg. 6 | 7 | 8 | | Games | Docs | Dockerhub | 9 | |-|-|-| 10 | | Don't Starve | [README](./dontstarve/README.md) | [![dontstarve](https://img.shields.io/docker/v/gamenight/dontstarve?label=gamenight%2Fdontstarve&sort=date&style=for-the-badge)](https://hub.docker.com/r/gamenight/dontstarve/tags?page=1&ordering=last_updated) | 11 | | Dwarf Fortress | [README](./dwarf_fortress/README.md) | [![dwarf fortress](https://img.shields.io/docker/v/gamenight/dwarf_fortress?label=gamenight%2Fdwarf_fortress&sort=date&style=for-the-badge)](https://hub.docker.com/r/gamenight/dwarf_fortress/tags?page=1&ordering=last_updated) | 12 | | Rust | [README](./rust/README.md) | [![rust](https://img.shields.io/docker/v/gamenight/rust?label=gamenight%2Frust&sort=date&style=for-the-badge)](https://hub.docker.com/r/gamenight/rust/tags?page=1&ordering=last_updated) | 13 | | Valheim | [README](./valheim/README.md) | [![valheim](https://img.shields.io/docker/v/gamenight/valheim?label=gamenight%2Fvalheim&sort=date&style=for-the-badge)](https://hub.docker.com/r/gamenight/valheim/tags?page=1&ordering=last_updated) | 14 | | Satisfatory | [README](./satisfactory/README.md) | [![satisfactory](https://img.shields.io/docker/v/gamenight/satisfactory?label=gamenight%2Fsatisfactory&sort=date&style=for-the-badge)](https://hub.docker.com/r/gamenight/satisfactory/tags?page=1&ordering=last_updated) | 15 | | Factorio | [README](./factorio/README.md) | [![factorio](https://img.shields.io/docker/v/gamenight/factorio?label=gamenight%2Ffactorio&sort=date&style=for-the-badge)](https://hub.docker.com/r/gamenight/factorio/tags?page=1&ordering=last_updated) | 16 | | Minecraft | [README](./minecraft/README.md) | [![minecraft](https://img.shields.io/docker/v/gamenight/minecraft?label=gamenight%2Fminecraft&sort=date&style=for-the-badge)](https://hub.docker.com/r/gamenight/minecraft/tags?page=1&ordering=last_updated) | 17 | | Terraria | [README](./terraria/README.md) | [![terraria](https://img.shields.io/docker/v/gamenight/terraria?label=gamenight%2Fterraria&sort=date&style=for-the-badge)](https://hub.docker.com/r/gamenight/terraria/tags?page=1&ordering=last_updated) | 18 | | SteamCMD | [README](./steamcmd/README.md) | [![steamcmd](https://img.shields.io/docker/v/gamenight/steamcmd?label=gamenight%2Fsteamcmd&sort=date&style=for-the-badge)](https://hub.docker.com/r/gamenight/steamcmd/tags?page=1&ordering=last_updated) | 19 | 20 | - Upcoming Games 21 | - Arma 3 - 233780 22 | - Don't Starve Together - 343050 23 | - Stationeers - 600760 24 | - Project Zomboid - 223250 25 | - Killing Floor - 222860 26 | - Insurgency 27 | 28 | ## How to use 29 | 30 | For the most part all of these follow some a similar pattern: 31 | 32 | ``` 33 | /data 34 | |__configs/ <- server configs go here 35 | |__logs/ <- log files should appear here where necessary, otherwise logs will appear in stdout 36 | |__mods/ <- if the game supports mods, they would go here 37 | |__saves/ <- game saves are made here 38 | /games 39 | |__/ <- executables and game install lives here 40 | ``` 41 | 42 | - There is a linux user and group named after the specified game (IE for Factorio there is a factorio user) 43 | - All of the configuration files should get mounted into `/data/configs` 44 | 45 | - All containers have configs with sane defaults which should allow you to launch them without configuration 46 | 47 | - You should be able to simply run the containers, export the proper ports and everything will run without much else required 48 | 49 | - If you don't have access to config files I've included defaults in the images so you can use them as reference 50 | 51 | 52 | 53 | ## How to develop 54 | 55 | Build an image from a folder with `.hack/build.sh `. 56 | Build and test locally an image from a folder with `.hack/test.sh ` 57 | 58 | ## License 59 | 60 | MIT 61 | -------------------------------------------------------------------------------- /dontstarve/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM gamenight/steamcmd:latest AS download 2 | 3 | ENV APPID=343050 4 | 5 | RUN /home/steam/install.sh 6 | 7 | FROM debian:stable-slim 8 | 9 | USER root 10 | 11 | RUN apt-get update \ 12 | && apt-get install -y libcurl4-gnutls-dev:i386 \ 13 | && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 14 | 15 | RUN useradd -m -s /bin/bash dontstarve \ 16 | && echo "dontstarve:dontstarve" | chpasswd \ 17 | && rm -rf /data/* \ 18 | && chown -R dontstarve:dontstarve /data /home/dontstarve /games/ 19 | 20 | ENV APPID=343050 21 | ENV CLUSTER_NAME=default 22 | ENV SHARD_NAME=Master 23 | 24 | WORKDIR /home/dontstarve 25 | 26 | USER dontstarve 27 | 28 | COPY --chown=donstarve --from=download /games/${APPID}/ /games/${APPID}/ 29 | COPY --chown=dontstarve ./data/ /data/ 30 | COPY --chown=dontstarve ./run.sh /home/dontstarve/run.sh 31 | COPY --chown=dontstarve ./data/clusters/ /data/clusters/ 32 | 33 | EXPOSE 10999/udp 34 | 35 | VOLUME /data 36 | 37 | ENTRYPOINT [ "/home/dontstarve/run.sh"] 38 | -------------------------------------------------------------------------------- /dontstarve/data/clusters/default/Master/server.ini: -------------------------------------------------------------------------------- 1 | [SHARD] 2 | is_master = true 3 | shard_name = master 4 | 5 | [STEAM] 6 | authenticated_port = 8766 7 | master_server_port = 27016 8 | 9 | [NETWORK] 10 | server_port = 109999 11 | 12 | [ACCOUNT] 13 | encode_user_path = true 14 | -------------------------------------------------------------------------------- /dontstarve/data/clusters/default/cluster.ini: -------------------------------------------------------------------------------- 1 | [NETWORK] 2 | cluster_name = Dont Starve Docker 3 | cluster_description = A very nice server 4 | cluster_intention = cooperative 5 | cluster_password = 6 | server_port = 10999 7 | offline_server = true 8 | tick_rate = 15 9 | autosaver_enabled = true 10 | 11 | 12 | [GAMEPLAY] 13 | pvp = false 14 | game_mode = survival 15 | max_players = 6 16 | pause_when_empty = true 17 | server_save_slot = 1..5 18 | vote_kick_enabled = true 19 | 20 | [MISC] 21 | console_enabled = true 22 | 23 | [SHARD] 24 | shard_enabled = false 25 | bind_ip = 127.0.0.1 26 | master_ip = 127.0.0.1 27 | master_port = 10888 28 | cluster_key = 29 | -------------------------------------------------------------------------------- /dontstarve/data/clusters/default/cluster.ini.example: -------------------------------------------------------------------------------- 1 | [MISC] 2 | 3 | max_snapshots 4 | 5 | Default: 6 6 | Maximum number of snapshots to retain. These snapshots are created every time a save occurs, and are available in the “Rollback” tab on the “Host Game” screen. 7 | 8 | 9 | [SHARD] 10 | 11 | shard_enabled 12 | 13 | Default: false 14 | Enable server sharding. This must be set to true for multi-level servers. For single-level servers, it can be omitted. 15 | 16 | 17 | bind_ip 18 | 19 | Overridable in server.ini 20 | Default: 127.0.0.1 21 | Required: If shard_enabled = true and is_master = true 22 | This is the network address the master server will listen on for other shard servers to connect to. Set this to 127.0.0.1 if all of your servers in your cluster are on the same machine, or 0.0.0.0 if the servers in your cluster are on different machines. This only needs to be set for the master server, either in cluster.ini, or the master server's server.ini. 23 | 24 | 25 | master_ip 26 | 27 | Overridable in server.ini 28 | Default: none 29 | Required: If shard_enabled = true and is_master = false 30 | This is the I.P. address that a non-master shard will use when trying to connect to the master shard. If all servers in a cluster are on the same machine, set this to 127.0.0.1 31 | 32 | 33 | master_port 34 | 35 | Overridable in server.ini 36 | Default: 10888 37 | This is UDP port that the master server will listen on, and that a non-master shard will use when trying to connect to the master shard. This should be set to the same value for all shards by having a single entry in cluster.ini, or omitted completely to use the default. 38 | 39 | 40 | cluster_key 41 | 42 | Overridable in server.ini 43 | Default: none 44 | Required if shard_enabled = true 45 | This is a password used to authenticate a slave server to the master. If you are running servers on different machines that need to connect to each other, this value must be the same on each machine. For servers running on the same machine, you can just set this once in cluster.ini. 46 | 47 | 48 | [STEAM] 49 | 50 | steam_group_only 51 | 52 | Default: false 53 | When set to true, the server will only allow connections from players belonging to the steam group listed in the steam_group_id setting. 54 | 55 | 56 | steam_group_id 57 | 58 | Default: 0 59 | Steam group id for steam_group_only / steam_group_admins settings. See here for instructions on finding your steam group id: http://forums.kleientertainment.com/topic/55994-server-admin-associate-your-server-with-a-steam-group/ 60 | 61 | 62 | steam_group_admins 63 | 64 | Default: false 65 | When this is set to true, admins of the steam group specified in steam_group_id will also have admin status on the server. 66 | 67 | 68 | [NETWORK] 69 | 70 | offline_server 71 | 72 | Default: false 73 | Create an offline server. The server will not be listed publicly, and only players on the local network will be able to join, and any steam-related functionality will not work. 74 | 75 | 76 | tick_rate 77 | 78 | Default: 15 79 | This is the number of times per-second that the server sends updates to clients. Increasing this may improve precision, but will result in more network traffic. 80 | 81 | 82 | whitelist_slots 83 | 84 | Default: 0 85 | The number of reserved slots for whitelisted players. To whitelist a player, add their Klei UserId to the whitelist.txt file (Place this file in the same directory as cluster.ini) 86 | 87 | 88 | cluster_password 89 | 90 | Default: none 91 | This is the password that players must enter to join your server. Leave this blank or omit it for no password. 92 | 93 | 94 | cluster_name 95 | 96 | The name for your server cluster. This is the name that will show up in server browser. 97 | 98 | 99 | cluster_description 100 | 101 | Default: empty 102 | Cluster description. This will show up in the server details area on the “Browse Games” screen. 103 | 104 | 105 | lan_only_cluster 106 | 107 | Default: false 108 | When set to true, the server will only accept connections from machines on the same LAN 109 | 110 | 111 | cluster_intention 112 | 113 | Default: Varies, depending on game mode. 114 | The cluster’s playstyle. This field is the equivalent of the “Server Playstyle” field on the “Host Game” screen. Valid values are cooperative, competitive, social, or madness. 115 | 116 | 117 | [GAMEPLAY] 118 | 119 | max_players 120 | 121 | Default: 16 122 | The maximum number of players that may be connected to the cluster at one time. 123 | 124 | 125 | pvp 126 | 127 | Default: false 128 | Enable PVP. 129 | 130 | 131 | game_mode 132 | 133 | Default: survival 134 | The cluster’s game mode. This field is the equivalent of the “Game Mode” field on the “Host Game” screen. Valid values are survival, endless or wilderness 135 | 136 | 137 | pause_when_empty 138 | 139 | Default: false 140 | Pause the server when there are no players connected. 141 | 142 | 143 | vote_kick_enabled 144 | 145 | Default: false 146 | Set to true to enable the “Vote to Kick” feature. 147 | -------------------------------------------------------------------------------- /dontstarve/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd /games/${APPID}/bin; 4 | 5 | export DS_DIR="/data/clusters/${CLUSTER_NAME}"; 6 | 7 | if [ -f "${DS_DIR}/cluster.ini" ]; then 8 | echo "cluster.ini................OK" 9 | else 10 | echo "WARN: NO cluster.ini DETECTED." 11 | fi 12 | 13 | if [ -f "${DS_DIR}/cluster_token.txt" ]; then 14 | echo "cluster_token.txt..........OK" 15 | else 16 | echo "WARN: NO cluster_token.txt DETECTED." 17 | fi 18 | 19 | if [ -f "${DS_DIR}/${SHARD_NAME}/server.ini" ]; then 20 | echo "${SHARD_NAME}/server.ini...OK" 21 | else 22 | echo "WARN: NO ${SHARD_NAME}/server.ini DETECTED." 23 | fi 24 | 25 | exec /games/${APPID}/bin/dontstarve_dedicated_server_nullrenderer \ 26 | -persistent_storage_root /data \ 27 | -conf_dir clusters \ 28 | -disabledatacollection \ 29 | -cluster ${CLUSTER_NAME} \ 30 | -shard ${SHARD_NAME} \ 31 | $@ 32 | -------------------------------------------------------------------------------- /dwarf_fortress/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:9.6-slim 2 | 3 | ARG VERSION=47_05 4 | 5 | ENV VERSION=${VERSION} 6 | ENV LANG=en_US.utf-8 7 | ENV LC_ALL=en_US.utf-8 8 | 9 | RUN apt-get update \ 10 | && apt-get install -y \ 11 | curl \ 12 | tar \ 13 | bzip2 \ 14 | libc6 \ 15 | libgtk2.0-0 \ 16 | libgcc1 \ 17 | libglib2.0-0 \ 18 | libglu1-mesa \ 19 | libopenal1 \ 20 | libsdl-image1.2 \ 21 | libsdl-ttf2.0-0 \ 22 | libstdc++6 \ 23 | locales \ 24 | sed \ 25 | zlib1g \ 26 | && apt-get clean 27 | 28 | RUN mkdir -p /games/ \ 29 | && curl "http://www.bay12games.com/dwarves/df_${VERSION}_linux.tar.bz2" -o /games/df_linux.tar.bz2 \ 30 | && tar -xjf /games/df_linux.tar.bz2 -C /games/ \ 31 | && mv /games/df_linux /games/df \ 32 | && rm -rf /games/df_linux.tar.bz2 /games/df_linux \ 33 | && sed -i 's/\[PRINT_MODE:2D\]/[PRINT_MODE:TEXT]/' /games/df/data/init/init.txt \ 34 | && echo "en_US.UTF-8 UTF-8" > /etc/locale.gen \ 35 | && locale-gen 36 | 37 | WORKDIR /games/df/ 38 | 39 | VOLUME /games/df/data/save 40 | 41 | CMD /games/df/df 42 | -------------------------------------------------------------------------------- /dwarf_fortress/README.md: -------------------------------------------------------------------------------- 1 | # Dwarf Fortress 2 | 3 | Easy, just run it. Saves are `/games/df/data/save`. 4 | -------------------------------------------------------------------------------- /dwarf_fortress/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | docker build --build-arg VERSION=44_12 -t adamveld12/df . 4 | docker run -it --rm adamveld12/df 5 | -------------------------------------------------------------------------------- /factorio/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:latest as builder 2 | 3 | ARG VERSION=stable 4 | ENV VERSION=${VERSION} 5 | 6 | RUN apt-get update && apt-get install -y curl xz-utils tar 7 | 8 | WORKDIR /games 9 | 10 | RUN curl -sSL -N "https://factorio.com/get-download/${VERSION}/headless/linux64" -o /games/factorio.tar.xz \ 11 | && xz -d /games/factorio.tar.xz \ 12 | && tar -xf /games/factorio.tar \ 13 | && rm -rf /games/factorio.tar.xz /games/factorio.tar 14 | 15 | FROM ubuntu:latest as server 16 | 17 | ARG VERSION=stable 18 | ENV VERSION=${VERSION} 19 | ENV PGID=1000 20 | ENV PUID=1000 21 | ENV SAVE_FILE=world 22 | 23 | COPY --from=builder /games/factorio/ /games/factorio/ 24 | COPY ./configs /configs 25 | COPY ./run.sh /games/factorio/ 26 | 27 | WORKDIR /data 28 | 29 | EXPOSE 34197/udp 30 | EXPOSE 34198/udp 31 | 32 | VOLUME /data 33 | 34 | ENTRYPOINT /games/factorio/run.sh 35 | -------------------------------------------------------------------------------- /factorio/README.md: -------------------------------------------------------------------------------- 1 | # Factorio 2 | 3 | Dedicated server for Factorio 4 | 5 | If no save file is found, a new one is generated at startup. 6 | 7 | 8 | ## Environment variables 9 | 10 | - `SAVE_FILE`: Specify the name of the save file in the `/data` directory. Defaults to `world` 11 | - `PUID`: runs the valheim process and sets the `/data,/configs` volumes permissions with this user id. 12 | - `PGID`: runs the valheim process and sets the `/data,/configs` volumes permission with this group id 13 | 14 | ## Ports 15 | 16 | - `34197/udp`: Game port 17 | - `34198/udp`: RCON 18 | 19 | ## Volumes 20 | 21 | - `/data`: game saves 22 | - `/configs`: https://wiki.factorio.com/Multiplayer 23 | - `map-gen-settings.json` 24 | - `map-settings.json` 25 | - `server-settings.json` 26 | -------------------------------------------------------------------------------- /factorio/configs/map-gen-settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "_comment_docs": "https://lua-api.factorio.com/latest/Concepts.html#MapGenSettings", 3 | "terrain_segmentation": 0.5, 4 | "water": "2", 5 | "width": 0, 6 | "height": 0, 7 | "starting_area": "normal", 8 | "peaceful_mode": false, 9 | "autoplace_controls": { 10 | "coal": { "frequency": 1, "size": 2, "richness": 0.5 }, 11 | "copper-ore": { 12 | "frequency": "low", 13 | "size": "normal", 14 | "richness": "high" 15 | }, 16 | "crude-oil": { 17 | "frequency": "normal", 18 | "size": "normal", 19 | "richness": "normal" 20 | }, 21 | "enemy-base": { 22 | "frequency": "normal", 23 | "size": "normal", 24 | "richness": "normal" 25 | }, 26 | "iron-ore": { 27 | "frequency": "normal", 28 | "size": "normal", 29 | "richness": "normal" 30 | }, 31 | "stone": { "frequency": "normal", "size": 0, "richness": "normal" }, 32 | "uranium-ore": { 33 | "frequency": "normal", 34 | "size": "none", 35 | "richness": "normal" 36 | } 37 | }, 38 | "cliff_settings": { 39 | "name": "cliff", 40 | "cliff_elevation_0": 30, 41 | "cliff_elevation_interval": 20, 42 | "richness": 1 43 | }, 44 | "property_expression_names": { 45 | "elevation": "0_16-elevation", 46 | "temperature": "35" 47 | }, 48 | "_comment_seed": "Use null for a random seed, number for a specific seed.", 49 | "seed": null 50 | } 51 | -------------------------------------------------------------------------------- /factorio/configs/map-settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "_comment_docs": "https://lua-api.factorio.com/latest/Concepts.html#MapSettings", 3 | "difficulty_settings": 4 | { 5 | "recipe_difficulty": 0, 6 | "technology_difficulty": 0, 7 | "technology_price_multiplier": 1 8 | }, 9 | "pollution": 10 | { 11 | "enabled": true, 12 | "_comment_min_to_diffuse_1": "these are values for 60 ticks (1 simulated second)", 13 | "_comment_min_to_diffuse_2": "amount that is diffused to neighboring chunk", 14 | "diffusion_ratio":0.02, 15 | "min_to_diffuse":15, 16 | "ageing":1, 17 | "expected_max_per_chunk":7000, 18 | "min_to_show_per_chunk":700, 19 | "min_pollution_to_damage_trees": 3500, 20 | "pollution_with_max_forest_damage": 10000, 21 | "pollution_per_tree_damage": 2000, 22 | "pollution_restored_per_tree_damage": 500, 23 | "max_pollution_to_restore_trees": 1000 24 | }, 25 | "enemy_evolution": 26 | { 27 | "enabled": true, 28 | "time_factor": 0.000004, 29 | "destroy_factor": 0.002, 30 | "pollution_factor": 0.000015 31 | }, 32 | "enemy_expansion": 33 | { 34 | "enabled": true, 35 | "min_base_spacing": 3, 36 | "max_expansion_distance": 7, 37 | "friendly_base_influence_radius": 2, 38 | "enemy_building_influence_radius": 2, 39 | "building_coefficient": 0.1, 40 | "other_base_coefficient": 2.0, 41 | "neighbouring_chunk_coefficient": 0.5, 42 | "neighbouring_base_chunk_coefficient": 0.4, 43 | "max_colliding_tiles_coefficient": 0.9, 44 | "settler_group_min_size": 5, 45 | "settler_group_max_size": 20, 46 | "min_expansion_cooldown": 14400, 47 | "max_expansion_cooldown": 216000 48 | }, 49 | "unit_group": 50 | { 51 | "min_group_gathering_time": 3600, 52 | "max_group_gathering_time": 36000, 53 | "max_wait_time_for_late_members": 7200, 54 | "max_group_radius": 30.0, 55 | "min_group_radius": 5.0, 56 | "max_member_speedup_when_behind": 1.4, 57 | "max_member_slowdown_when_ahead": 0.6, 58 | "max_group_slowdown_factor": 0.3, 59 | "max_group_member_fallback_factor": 3, 60 | "member_disown_distance": 10, 61 | "tick_tolerance_when_member_arrives": 60, 62 | "max_gathering_unit_groups": 30, 63 | "max_unit_group_size": 200 64 | }, 65 | "steering": 66 | { 67 | "default": 68 | { 69 | "radius": 1.2, 70 | "separation_force": 0.005, 71 | "separation_factor": 1.2, 72 | "force_unit_fuzzy_goto_behavior": false 73 | }, 74 | "moving": 75 | { 76 | "radius": 3, 77 | "separation_force": 0.01, 78 | "separation_factor": 3, 79 | "force_unit_fuzzy_goto_behavior": false 80 | } 81 | }, 82 | "path_finder": 83 | { 84 | "fwd2bwd_ratio": 5, 85 | "goal_pressure_ratio": 2, 86 | "max_steps_worked_per_tick": 100, 87 | "use_path_cache": true, 88 | "short_cache_size": 5, 89 | "long_cache_size": 25, 90 | "short_cache_min_cacheable_distance": 10, 91 | "short_cache_min_algo_steps_to_cache": 50, 92 | "long_cache_min_cacheable_distance": 30, 93 | "cache_max_connect_to_cache_steps_multiplier": 100, 94 | "cache_accept_path_start_distance_ratio": 0.2, 95 | "cache_accept_path_end_distance_ratio": 0.15, 96 | "negative_cache_accept_path_start_distance_ratio": 0.3, 97 | "negative_cache_accept_path_end_distance_ratio": 0.3, 98 | "cache_path_start_distance_rating_multiplier": 10, 99 | "cache_path_end_distance_rating_multiplier": 20, 100 | "stale_enemy_with_same_destination_collision_penalty": 30, 101 | "ignore_moving_enemy_collision_distance": 5, 102 | "enemy_with_different_destination_collision_penalty": 30, 103 | "general_entity_collision_penalty": 10, 104 | "general_entity_subsequent_collision_penalty": 3, 105 | "max_clients_to_accept_any_new_request": 10, 106 | "max_clients_to_accept_short_new_request": 100, 107 | "direct_distance_to_consider_short_request": 100, 108 | "short_request_max_steps": 1000, 109 | "short_request_ratio": 0.5, 110 | "min_steps_to_check_path_find_termination": 2000, 111 | "start_to_goal_cost_multiplier_to_terminate_path_find": 500.0 112 | }, 113 | "max_failed_behavior_count": 3 114 | } -------------------------------------------------------------------------------- /factorio/configs/server-settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Factorio Game Server", 3 | "description": "A Factorio Dedicated Server on Docker", 4 | "tags": ["Dedicated"], 5 | "_comment_max_players": "Maximum number of players allowed, admins can join even a full server. 0 means unlimited.", 6 | "max_players": 64, 7 | 8 | "_comment_visibility": ["public: Game will be published on the official Factorio matching server", 9 | "lan: Game will be broadcast on LAN"], 10 | "visibility": 11 | { 12 | "public": true, 13 | "lan": true 14 | }, 15 | 16 | "_comment_credentials": "Your factorio.com login credentials. Required for games with visibility public", 17 | "username": "", 18 | "password": "", 19 | 20 | "_comment_token": "Authentication token. May be used instead of 'password' above.", 21 | "token": "", 22 | 23 | "game_password": "", 24 | 25 | "_comment_require_user_verification": "When set to true, the server will only allow clients that have a valid Factorio.com account", 26 | "require_user_verification": true, 27 | 28 | "_comment_max_upload_in_kilobytes_per_second" : "optional, default value is 0. 0 means unlimited.", 29 | "max_upload_in_kilobytes_per_second": 0, 30 | 31 | "_comment_minimum_latency_in_ticks": "optional one tick is 16ms in default speed, default value is 0. 0 means no minimum.", 32 | "minimum_latency_in_ticks": 0, 33 | 34 | "_comment_ignore_player_limit_for_returning_players": "Players that played on this map already can join even when the max player limit was reached.", 35 | "ignore_player_limit_for_returning_players": false, 36 | 37 | "_comment_allow_commands": "possible values are, true, false and admins-only", 38 | "allow_commands": "admins-only", 39 | 40 | "_comment_autosave_interval": "Autosave interval in minutes", 41 | "autosave_interval": 10, 42 | 43 | "_comment_autosave_slots": "server autosave slots, it is cycled through when the server autosaves.", 44 | "autosave_slots": 5, 45 | 46 | "_comment_afk_autokick_interval": "How many minutes until someone is kicked when doing nothing, 0 for never.", 47 | "afk_autokick_interval": 0, 48 | 49 | "_comment_auto_pause": "Whether should the server be paused when no players are present.", 50 | "auto_pause": true, 51 | 52 | "only_admins_can_pause_the_game": true, 53 | 54 | "_comment_autosave_only_on_server": "Whether autosaves should be saved only on server or also on all connected clients. Default is true.", 55 | "autosave_only_on_server": true, 56 | 57 | "_comment_admins": "List of case insensitive usernames, that will be promoted immediately", 58 | "admins": [] 59 | } 60 | -------------------------------------------------------------------------------- /factorio/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | export GAME_SAVE_PATH=/data/saves/${SAVE_FILE:-world}.zip 3 | 4 | if ! [ -f "${GAME_SAVE_PATH}" ]; then 5 | echo "No save file found, generating save '${GAME_SAVE_PATH}' with settings found in '/configs/{map-gen-settings,map-gen-presets}.json'"; 6 | if [ -f /configs/map-gen-settings.json ]; then 7 | /games/factorio/bin/x64/factorio --create ${GAME_SAVE_PATH} --map-gen-settings /configs/map-gen-settings.json; 8 | else 9 | /games/factorio/bin/x64/factorio --create ${GAME_SAVE_PATH}; 10 | fi 11 | fi 12 | 13 | mkdir -p "/data/logs/"; 14 | mkdir -p "/data/mods/"; 15 | 16 | PUSER=factorio; 17 | if [ -z "$(cat /etc/group | grep ${PGID})" ]; then 18 | addgroup -q --gecos "" --gid ${PGID} ${PUSER}; 19 | fi 20 | 21 | if [ -z "$(cat /etc/passwd | grep ${PUID})" ]; then 22 | adduser -q --gecos "" --uid ${PUID} --gid ${PGID} --disabled-password --disabled-login --no-create-home ${PUSER}; 23 | fi 24 | 25 | chown -R ${PUID}:${PGID} /data; 26 | chown -R ${PUID}:${PGID} /configs; 27 | chown -R ${PUID}:${PGID} /games; 28 | 29 | exec su ${PUSER} -c "echo \"Starting Factorio server\"; \ 30 | /games/factorio/bin/x64/factorio --verbose \ 31 | --start-server \"${GAME_SAVE_PATH}\" \ 32 | --server-id /data/server_id \ 33 | --console-log /data/logs/console.log \ 34 | --mod-directory /data/mods \ 35 | --map-gen-settings /configs/map-gen-settings.json \ 36 | --map-settings /configs/map-settings.json \ 37 | --server-settings /configs/server-settings.json; \ 38 | echo \"Factorio server exited with code \$?\";" 39 | -------------------------------------------------------------------------------- /minecraft/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM openjdk:17-alpine 2 | 3 | ARG VERSION=1.18.2 4 | 5 | ARG MINECRAFT_VERSION_HASH=c8f83c5655308435b3dcf03c06d9fe8740a77469 6 | ENV VERSION=${VERSION} 7 | ENV JAVA_OPTS=-XX:+UseG1GC 8 | ENV PATH=${PATH}:/usr/lib/jvm/default-java/bin 9 | 10 | ENV JVM_MEMORY_SIZE=1024m 11 | ENV PUID=1000 12 | ENV PGID=1000 13 | 14 | ADD https://launcher.mojang.com/v1/objects/${MINECRAFT_VERSION_HASH}/server.jar /games/minecraft/server.jar 15 | 16 | RUN apk add --no-cache --purge sudo 17 | 18 | COPY ./run.sh /games/minecraft/ 19 | COPY ./data/configs/server.properties /configs/server.properties 20 | 21 | EXPOSE 25565 25575 22 | 23 | WORKDIR /data 24 | 25 | VOLUME /data 26 | 27 | ENTRYPOINT /games/minecraft/run.sh 28 | -------------------------------------------------------------------------------- /minecraft/Dockerfile.paper: -------------------------------------------------------------------------------- 1 | FROM openjdk:8-jre-alpine3.7 2 | 3 | LABEL maintainer=adam@vdhsn.com 4 | 5 | ARG version=1.16.5 6 | ARG revision=564 7 | 8 | ENV MINECRAFT_VERSION=${version} 9 | ENV PAPER_VERSION=${version}-${revision} 10 | ENV JAVA_OPTS="-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true" 11 | ENV PATH=${PATH}:/usr/lib/jvm/default-java/bin 12 | ENV JVM_MEMORY_SIZE=1024m 13 | ENV MINECRAFT_PLUGINS="https://github.com/mcMMO-Dev/mcMMO/releases/download/2.0.0/mcMMO.jar" 14 | 15 | 16 | ADD https://papermc.io/api/v2/projects/paper/versions/${MINECRAFT_VERSION}/builds/564/downloads/paper-${MINECRAFT_VERSION}-${revision}.jar /games/minecraft/server.jar 17 | 18 | WORKDIR /data 19 | 20 | RUN addgroup minecraft \ 21 | && adduser -D -G minecraft minecraft \ 22 | && mkdir -p /games/minecraft /data \ 23 | && chown -cR minecraft:minecraft /games /data 24 | 25 | COPY --chown=minecraft:minecraft ./run.sh /games/minecraft/ 26 | COPY --chown=minecraft:minecraft ./data/configs/server.properties /games/minecraft/server.properties.example 27 | 28 | USER minecraft 29 | 30 | EXPOSE 25565 25575 31 | 32 | VOLUME /data 33 | 34 | ENTRYPOINT /games/minecraft/run.sh 35 | -------------------------------------------------------------------------------- /minecraft/README.md: -------------------------------------------------------------------------------- 1 | # Minecraft 2 | 3 | Dedicated server for Minecraft 4 | 5 | Drop your `server.properties` file into `/configs`. 6 | 7 | ``` 8 | docker run -it \ 9 | -e PUID=1000 \ 10 | -e PGID=1000 \ 11 | -v $PWD/data:/data \ 12 | -p 25565:25565 \ 13 | gamenight/minecraft:1.18.1 14 | ``` 15 | 16 | 17 | ## Environment variables 18 | 19 | - `JVM_MEMORY_SIZE=1024m` the memory allocation for the JVM 20 | - `PUID`: runs the minecraft process and sets the `/data` volume permissions with this user id. 21 | - `PGID`: runs the minecraft process and sets the `/data` volume permission with this group id 22 | 23 | ## Ports 24 | 25 | - `25565/tcp`: Game port 26 | - `25575/tcp`: RCON 27 | 28 | ## Volume 29 | 30 | - `/configs/server.properties`: Server properties file, see: https://minecraft.gamepedia.com/Tutorials/Setting_up_a_server#Start_the_Minecraft_server. This file gets copied to `/data/server.properties` at startup 31 | - `/data`: Game saves, logs, plugins etc 32 | -------------------------------------------------------------------------------- /minecraft/data/configs/server.properties: -------------------------------------------------------------------------------- 1 | #Minecraft server properties 2 | #For more info see: https://minecraft.gamepedia.com/Server.properties#Java_Edition_3 3 | server-name=Minecraft Dockerfied 4 | server-port=25565 5 | motd=A Minecraft Server Powered By Docker 6 | level-seed= 7 | generator-settings= 8 | max-world-size=29999984 9 | level-type=DEFAULT 10 | level-name=world 11 | server-ip= 12 | verify-names=false 13 | enable-query=false 14 | query.port=25565 15 | enable-rcon=false 16 | rcon.password= 17 | rcon.port=25575 18 | op-permission-level=4 19 | snooper-enabled=true 20 | white-list=false 21 | gamemode=0 22 | difficulty=1 23 | pvp=true 24 | allow-nether=true 25 | spawn-monsters=true 26 | generate-structures=true 27 | allow-flight=false 28 | max-build-height=256 29 | hardcore=false 30 | spawn-npcs=true 31 | spawn-animals=true 32 | prevent-proxy-connections=false 33 | force-gamemode=false 34 | network-compression-threshold=256 35 | resource-pack-sha1= 36 | online-mode=true 37 | resource-pack= 38 | enable-command-block=false 39 | player-idle-timeout=0 40 | max-players=32 41 | max-tick-time=60000 42 | view-distance=10 -------------------------------------------------------------------------------- /minecraft/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/ash 2 | 3 | cat < /data/eula.txt 4 | #By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula). 5 | eula=true 6 | EOF 7 | 8 | mkdir -p '/data/configs'; 9 | mkdir -p '/data/world'; 10 | mkdir -p '/data/plugins'; 11 | 12 | if [ -f /configs/server.properties ]; then 13 | cp /configs/server.properties /data/server.properties; 14 | fi 15 | 16 | PUSER=minecraft 17 | if [ -z "$(cat /etc/group | grep ${PGID})" ]; then 18 | addgroup -g ${PGID} ${PUSER}; 19 | fi 20 | 21 | if [ -z "$(cat /etc/passwd | grep ${PUID})" ]; then 22 | adduser -u ${PUID} -G ${PUSER} -D -h /data ${PUSER}; 23 | fi 24 | 25 | 26 | chown -R ${PUID}:${PGID} /data; 27 | chown -R ${PUID}:${PGID} /games; 28 | 29 | exec su ${PUSER} -c "java -Xmx${JVM_MEMORY_SIZE} -Xms512m ${JAVA_OPTS} -jar /games/minecraft/server.jar --nogui" 30 | -------------------------------------------------------------------------------- /rust/.dockerignore: -------------------------------------------------------------------------------- 1 | dev.sh 2 | data/saves 3 | 4 | -------------------------------------------------------------------------------- /rust/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM gamenight/steamcmd:1.2.0 2 | 3 | ENV APPID=258550 4 | 5 | RUN /home/steam/install.sh 6 | 7 | USER root 8 | 9 | RUN apt-get update \ 10 | && apt-get install -y \ 11 | libsqlite3-0 \ 12 | libsqlite3-dev \ 13 | libsqlite3-0:i386 \ 14 | && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \ 15 | && useradd -m -s /bin/bash -g steam rust \ 16 | && echo "rust:rust" | chpasswd \ 17 | && chown -R rust /data /home/rust /games 18 | 19 | USER rust 20 | WORKDIR /home/rust 21 | 22 | COPY ./run.sh /home/rust/run.sh 23 | COPY ./data /data 24 | 25 | #UDP:28015 // Gameserver 26 | #TCP:28016 // Serverlist 27 | #TCP:28017 // RC 28 | EXPOSE 28015/udp 28016/tcp 28017/tcp 29 | 30 | VOLUME ["/data/saves", "/data/configs"] 31 | 32 | ENTRYPOINT /home/rust/run.sh 33 | -------------------------------------------------------------------------------- /rust/data/configs/server.cfg: -------------------------------------------------------------------------------- 1 | server.hostname "Rust Dockerfied" 2 | server.description "A Rust server in a Docker container." 3 | server.seed 1296883561 4 | rcon.password "12345" 5 | server.pve true 6 | -------------------------------------------------------------------------------- /rust/data/configs/server.example.cfg: -------------------------------------------------------------------------------- 1 | +bradley.enabled #If set to false (0) it will disable the APC. Default is (1) 2 | +ai.think #If set to False, bears and wolfs are only hostile on attack (True) 3 | +ai.move #If set to False, animals will stop moving (recommended for performance boost) (True) 4 | +ai.sensetime #It's no use to change this value (1) 5 | +ai.frametime #no description (5) 6 | +ai.tickrate #Changes the tickrate of animals (5) 7 | +antihack.enabled #Enables / disables antihack (True) 8 | +antihack.admincheat #Are admins allowed to use their admin cheat (True) 9 | +antihack.objectplacement #Use antihack to verify object placement by players (True) 10 | +antihack.modelstate #Use antihack to verify model state sent by players (True) 11 | +antihack.userlevel #0 = users, 1 = admins, 2 = developers (2) 12 | +antihack.enforcementlevel #What happens if player is above 'antihack.maxviolation' - 0 = no enforcement, 1 = kick, 2 = ban (1) 13 | +antihack.maxdesync #Max allowed client desync, lower value = more false positives (1) 14 | +antihack.relaxationrate #The rate at which violation values go back down (0.1) 15 | +antihack.relaxationpause #The time before violation values go back down (10) 16 | +antihack.maxviolation #Violation value above this results in enforcement (100) 17 | +antihack.noclip_protection #0 = disabled, 1 = ray, 2 = sphere, 3 = curve (3) 18 | +antihack.noclip_reject #Whether or not to reject movement when noclip is detected (True) 19 | +antihack.noclip_penalty #Violation penalty to hand out when noclip is detected (0) 20 | +antihack.noclip_stepsize #Movement curve step size, lower value = less false positives (0.1) 21 | +antihack.noclip_maxsteps #Movement curve max steps, lower value = more false positives (5) 22 | +antihack.speedhack_protection #0 = disabled, 1 = enabled (1) 23 | +antihack.speedhack_reject #Whether or not to reject movement when speedhack is detected (False) 24 | +antihack.speedhack_penalty #Violation penalty to hand out when speedhack is detected (50) 25 | +antihack.speedhack_forgiveness #Speed threshold to assume speedhacking, lower value = more false positives (2) 26 | +antihack.speedhack_deltatime #Time interval to calculate speed in, lower value = more false positives (0.2) 27 | +antihack.speedhack_tickets #Required number of speeding tickets to trigger a violation (15) 28 | +antihack.speedhack_history #Speeding ticket history length (20) 29 | +antihack.flyhack_protection #0 = disabled, 1 = simple, 2 = advanced (2) 30 | +antihack.flyhack_reject #Whether or not to reject movement when flyhack is detected (False) 31 | +antihack.flyhack_penalty #Violation penalty to hand out when flyhack is detected (50) 32 | +antihack.flyhack_forgiveness #Distance threshold to assume flyhacking, lower value = more false positives (2) 33 | +antihack.projectile_protection #0 = disabled, 1 = speed, 2 = speed + entity, 3 = speed + entity + LOS (3) 34 | +antihack.projectile_penalty #Violation penalty to hand out when projectile hack is detected (0) 35 | +antihack.projectile_forgiveness #Projectile speed forgiveness in percent, lower value = more false positives (0.5) 36 | +antihack.projectile_padding #Projectile hit distance padding in meters, lower value = more false positives (5) 37 | +antihack.projectile_serverframes #Projectile server frames to include in delay, lower value = more false positives (2) 38 | +antihack.projectile_clientframes #Projectile client frames to include in delay, lower value = more false positives (2) 39 | +antihack.projectile_tickets #Required number of projectile line of sight tickets to trigger a violation (10) 40 | +antihack.melee_protection #0 = disabled, 1 = initiator, 2 = initiator + target, 3 = initiator + target + LOS (3) 41 | +antihack.melee_penalty #Violation penalty to hand out when melee hack is detected (0) 42 | +antihack.melee_forgiveness #Melee distance forgiveness in percent, lower value = more false positives (0.5) 43 | +antihack.melee_padding #Melee hit distance padding in meters, lower value = more false positives (2) 44 | +antihack.melee_serverframes #Melee server frames to include in delay, lower value = more false positives (2) 45 | +antihack.melee_clientframes #Melee client frames to include in delay, lower value = more false positives (2) 46 | +antihack.melee_tickets #Required number of melee line of sight tickets to trigger a violation (2) 47 | +antihack.eye_protection #0 = disabled, 1 = distance, 2 = distance + LOS (2) 48 | +antihack.eye_penalty #violation penalty to hand out when eye hack is detected (0) 49 | +antihack.debuglevel #0 = silent, 1 = print max violation, 2 = print every violation (1) 50 | +batching.colliders #*EXPERIMENTAL* Rust batches colliders to get around the maximum collider limit. To improve server performance you can unbatch (batching.colliders 0) colliders until they reach 250k. (True) 51 | +batching.collider_vertices #no description (10000) 52 | +batching.collider_submeshes #no description (1) 53 | +batching.verbose #no description (0) 54 | +chat.enabled #Enable or disable chat displaying (True) 55 | +chat.serverlog #Enable or disable chat logging (True) 56 | +construct.frameminutes #How many minutes before a placed frame gets destroyed (30) 57 | +craft.instant #Enable or disable instant crafting (False) 58 | +debug.checktriggers #Debug triggers (False) 59 | +decay.tick #Larger amount increases the applied decay damage to entity. (600) 60 | +decay.scale #1 = normal decay, 0,5 = 50%, 0 = turn decay off (1) 61 | +decay.debug #Debugmode (False) 62 | +env.time #Shows in-game time. If value declared, will change the server time (values: 0 - 24) 63 | +env.day #Displays the day of the month. Pointless to change this value (12) 64 | +env.month #Displays the month. Pointless to change this value (6) 65 | +env.year #Displays the year. Pointless to change this value (2024) 66 | +fps.limit #The maximum number of frames to render per second (256) 67 | +gc.interval #Changes the interval between garbage collects. (-1) 68 | +heli.lifetimeminutes #The amount of time the helicopter is allowed to stay in minutes. (15) 69 | +heli.guns #Enables / disables the helicopters minigun. If set to 0, the helicopter will shoot rockets only. (1) 70 | +heli.bulletdamagescale #Changes the bullet damage of the helicopter. Higher value = more damage (1) 71 | +heli.bulletaccuracy #Changes the accuracy of the bullets. Higher value = less accuracy (2) 72 | +net.visdebug #Turns on debug display of network visibility (False) 73 | +physics.droppedmode #The physics mode that dropped items and corpses should use. good, tempgood or fast. fast + tempgood might cause objects to fall through other objects. (good) 74 | +physics.sendeffects #Send effects to clients when physics objects collide (True) 75 | +physics.bouncethreshold #no description (2) 76 | +physics.sleepthreshold #no description (0.005) 77 | +physics.solveriterationcount #The default solver iteration count permitted for any rigid bodies (default 7). Must be positive (3) 78 | +physics.steps #The amount of physics steps per second (16) 79 | +pool.skins #no description (False) 80 | +sentry.targetall #Target everyone regardless of authorization (False) 81 | +sentry.hostileduration #How long until something is considered hostile after it attacked (120) 82 | +server.ip #Sets the IP of the server. Should be stated in the startup parameters 83 | +server.port #Sets the IP of the server. Should be stated in the startup parameters 84 | +server.maxplayers #Changes the maximum amount of player slots. 85 | +server.hostname #Sets the Servername. example: server.hostname "My Rust Server" 86 | +server.identity #Changes path to your server data. (my_server_identity) 87 | +server.level #Sets the map of the server (Procedural Map) values: Barren, Craggy Island, Hapis, Savas Island 88 | +server.seed #Sets the the map generation seed. 89 | +server.salt #Prints the server.salt 90 | +server.worldsize #Changes the map size (3000). values: 1000 - 8000. 3000 equals 9km². (3000m^2) 91 | +server.saveinterval #Interval between the server saves the map. (300) 92 | +server.secure #Enables / disables Valve Anti Cheat security. (True) 93 | +server.tickrate #Changes the server tickrate. Going higher than 30 is not recommended. (30) 94 | +server.entityrate #Tickrate. Recommended to leave it at 16. (16) 95 | +server.cycletime #no description (500) 96 | +server.official #Only whitelisted server by Facepunch can use this command (False) 97 | +server.globalchat #If set to false, only people within voice range can read each others messages. (True) 98 | +server.stability #If set to false, building blocks will have 100% stability no matter how high you build. (True) 99 | +server.radiation #Disables / enables server radioation (True) 100 | +server.itemdespawn #Time until an item despawn (180) 101 | +server.pve #Enables / disables PvE mode (False) 102 | +server.description #Command used to write a server description. Make \n to make a new line 103 | +server.headerimage #Sets the serverbanner - picture must be 500x256 104 | +server.url #Sets the server 'Webpage' 105 | +server.branch #no description () 106 | +server.eac #Enables / disables Easy Anti Cheat (1) 107 | +server.queriespersecond #no description (2000) 108 | +server.ipqueriespermin #no description (30) 109 | +server.meleedamage #Changes the melee damage in percent - 1 = 100, 0.5 = 50%, 0 = 0% (1) 110 | +server.arrowdamage #Changes the arrow damage in percent - 1 = 100, 0.5 = 50%, 0 = 0% (1) 111 | +server.bulletdamage #Changes the bullet damage in percent - 1 = 100, 0.5 = 50%, 0 = 0% (1) 112 | +server.bleedingdamage #Changes the bleeding damage in percent - 1 = 100, 0.5 = 50%, 0 = 0% (1) 113 | +server.meleearmor #Changes the scale of protection against melee damage from clothing and armor in percent - 1 = 100, 0.5 = 50%, 0 = 0% (1) 114 | +server.arrowarmor #Changes the scale of protection against arrow damage from clothing and armor in percent - 1 = 100, 0.5 = 50%, 0 = 0% (1) 115 | +server.bulletarmor #Changes the scale of protection against bullet damage from clothing and armor in percent - 1 = 100, 0.5 = 50%, 0 = 0% (1) 116 | +server.bleedingarmor #Changes the scale of protection against bleeding damage from clothing and armor in percent - 1 = 100, 0.5 = 50%, 0 = 0% (1) 117 | +server.updatebatch #How many entity updates should we send per loop. Setting this > 1000 might cause lag when a player first joins your server. (128) 118 | +server.planttick #Plants tick every x seconds. This is how many seconds between ticks. (60) 119 | +server.planttickscale #Setting this to 2 will make plants grow, fruit and die two times faster than normal. (1) 120 | +server.respawnresetrange #Distance from sleeping bag to reset other sleeping bags/beds. (50) 121 | +server.maxunack #Max amount of unacknowledged messages before we assume we're congested (4) 122 | +server.maxflood #Max amount of ticks to receive per second before we assume a client is flooding us (1000) 123 | +server.netcache #Use network caching (True) 124 | +server.netcachesize #Informational, the size of the network cache (in bytes) (2214666) 125 | +server.savecachesize #Informational, the size of the save cache (in bytes) (2264944) 126 | +server.combatlogsize #The size of the combat log (100) 127 | +server.idlekick #Number of minutes until idle players are kicked (30) 128 | +server.idlekickmode #0 = no idle kick, 1 = kick if server full, 2 = always kick (1) 129 | +server.idlekickadmins #1 = admins can get idle kicked (0) 130 | +server.maxreceivetime #no description (20) 131 | +server.compression #no description (False) 132 | +server.netlog #no description (False) 133 | +spawn.min_rate #no description (0,2) 134 | +spawn.max_rate #no description (2) 135 | +spawn.min_density #no description (0,2) 136 | +spawn.max_density #no description (2) 137 | +stability.verbose #no description (0) 138 | +stability.strikes #no description (10) 139 | +stability.collapse #no description (0.05) 140 | +stability.accuracy #no description (0.001) 141 | +time.fixeddelta #Fixed delta time in seconds (0.0625) 142 | +time.maxdelta #The minimum amount of times to tick per frame (0.33) 143 | +vis.damage #Turns on debug display of damages (False) 144 | +vis.attack #Turns on debug display of attacks (False) 145 | +vis.protection #Turns on debug display of protection (False) 146 | +vis.weakspots #Turns on debug display of weakspots (False) 147 | +vis.triggers #Show trigger entries (False) 148 | +vis.hitboxes #Turns on debug display of hitboxes (False) 149 | +vis.lineofsight #Turns on debug display of line of sight checks (False) 150 | +xmas.enabled #no description (True) 151 | +xmas.spawnrange #no description (50) 152 | +xmas.giftsperplayer #no description (2) 153 | +rcon.print #If true, rcon commands etc will be printed in the console (False) 154 | +find #Search for a command 155 | +status #Print out currently connected clients 156 | +stats #Print out stats of currently connected clients 157 | +kick #Kicks a player from the server. usage: kick {playername} {reason} example: kick Frank "stop crying" 158 | +kickall #Kicks everyone from the server. 159 | +ban #Permanently bans a player from the server. usage: ban {playername} {reason} example: ban Frank "stop crying" 160 | +moderatorid #( void ) no description 161 | +ownerid #( void ) no description 162 | +removemoderator #( void ) no description 163 | +removeowner #( void ) no description 164 | +banid #( void ) no description 165 | +unban #( void ) no description 166 | +players #Print out currently connected clients etc 167 | +say #Sends a message in chat 168 | +users #Show user info for players on server. 169 | +banlist #List of banned users (sourceds compat) 170 | +banlistex #List of banned users - shows reasons and usernames 171 | +listid #List of banned users, by ID (sourceds compat) 172 | +mutevoice #no description 173 | +unmutevoice #no description 174 | +mutechat #no description 175 | +unmutechat #no description 176 | +playerlist #Get a list of players 177 | +bans #List of banned users 178 | +serverinfo #Get a list of information about the server 179 | +batching.refresh_colliders #no description 180 | +batching.status #no description 181 | +chat.tail #Return the last x lines of the console. Default is 200 182 | +chat.search #Search the console for a particular string 183 | +console.tail #Return the last x lines of the console. Default is 200 184 | +console.search #Search the console for a particular string 185 | +data.export #no description 186 | +flushgroup #Takes you in and out of your current network group, causing you to delete and then download all entities in your PVS again 187 | +breakheld #Break the current held object 188 | +breakitem #Break all the items in your inventory whose name match the passed string 189 | +hurt #Damage yourself 190 | +entity.debug_toggle #no description 191 | +entity.nudge #no description 192 | +entity.create #Create entities, you must be playing in the server, use F1 to open console. Example entity list: http://text-share.com/view/43244684 193 | +env.addtime #Add (in hours) time to spawn choppers / airdrops without changing the server in-game time 194 | +gc.collect #no description 195 | +gc.unload #no description 196 | +global.restart #Restart the server - with x seconds warning. If no seconds given, server restarts after 5 minutes. (300 seconds) 197 | +global.quit #Stops the server and closes the command prompt. 198 | +global.report #no description 199 | +global.objects #no description 200 | +global.textures #no description 201 | +global.colliders #no description 202 | +global.error #no description 203 | +global.queue #no description 204 | +global.sleep #no description 205 | +global.injure #no description 206 | +global.spectate #no description 207 | +global.teleport #no description 208 | +global.teleport2me #no description 209 | +global.teleportany #no description 210 | +global.teleportpos #no description 211 | +global.cleanup #no description 212 | +global.version #no description 213 | +global.sysinfo #no description 214 | +global.breakitem #no description 215 | +heli.drop #Spawns a helicopter at a specific players posititon (heli.drop ) 216 | +heli.calltome #Forces a helicopter to spawn off map and fly to your position 217 | +heli.call #Calls in a helicopter to roam the map like normal 218 | +heli.strafe #Forces helicopter to target a specific player (heli.strafe ) 219 | +hierarchy.ls #no description 220 | +hierarchy.cd #no description 221 | +hierarchy.del #no description 222 | +inventory.give #no description 223 | +inventory.giveall #no description 224 | +inventory.giveto #no description 225 | +inventory.giveid #no description 226 | +inventory.givearm #no description 227 | +pool.print_memory #no description 228 | +pool.print_prefabs #no description 229 | +pool.print_assets #no description 230 | +pool.clear_memory #no description 231 | +pool.clear_prefabs #no description 232 | +pool.clear_assets #no description 233 | +server.stop #Stops the server 234 | +server.backup #Backup server folder 235 | +server.writecfg #Writes config files 236 | +server.fps #Prints current server fps 237 | +server.save #Force save the current game 238 | +server.readcfg #no description 239 | +spawn.fill_populations #no description 240 | +spawn.fill_groups #no description 241 | +spawn.report #Prints some information about entities already spawned on the server 242 | +weather.clouds #no description 243 | +weather.fog #no description 244 | +weather.wind #no description 245 | +weather.rain #Modify rain intensity, values between 0-100 (auto) 246 | +xmas.refill #no description 247 | +global.dump #no descriptio 248 | -------------------------------------------------------------------------------- /rust/dev.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | docker build -t r . 4 | 5 | docker run -it --rm \ 6 | -v $PWD/run.sh:/home/rust/run.sh \ 7 | -v $PWD/data/configs/server.cfg:/data/configs/server.cfg \ 8 | -v $PWD/data/saves/:/data/saves/ \ 9 | --name rustds \ 10 | --entrypoint bash \ 11 | -p 28015:28015/udp \ 12 | -p 28015:28015/tcp \ 13 | -p 28016:28016/tcp \ 14 | -p 28017:28017/tcp r 15 | -------------------------------------------------------------------------------- /rust/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | export SAVES=/data/saves 4 | export CONFIGS=/data/configs 5 | 6 | IFS=$'\n' 7 | for cfgArg in $(cat /data/configs/server.cfg) 8 | do 9 | echo $cfgArg 10 | if [ ${cfgArg:0:1} == "#" ]; then 11 | echo -n "" 12 | else 13 | CONFIG_ARGS=$(echo -n "${CONFIG_ARGS} +${cfgArg}"); 14 | fi 15 | done 16 | 17 | ln -s /data/saves /games/${APPID}/server 18 | 19 | cd /games/${APPID} 20 | export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`dirname $0`/RustDedicated_Data/Plugins/x86_64 21 | ./RustDedicated -batchmode ${CONFIG_ARGS} -logfile 2>&1 22 | cd /home/rust 23 | -------------------------------------------------------------------------------- /satisfactory/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM docker.io/gamenight/steamcmd:latest AS download 2 | 3 | ARG VERSION="gn-wip-local" 4 | 5 | ENV APPID=1690800 6 | ENV STEAM_USER="anonymous" 7 | ENV VERSION="${VERSION}" 8 | 9 | RUN /home/steam/install.sh 10 | 11 | FROM docker.io/ubuntu:latest as server 12 | 13 | ENV LD_LIBRARY_PATH=/games/satisfactory/linux64:/games/satisfactory/linux32 14 | 15 | RUN apt-get update \ 16 | && apt-get install -y ca-certificates \ 17 | && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 18 | 19 | RUN useradd -u 1000 -o -s /bin/bash -d /games/satisfactory satisfactory 20 | 21 | # Satisfactory install files 22 | COPY --from=download \ 23 | --chown=satisfactory:satisfactory /games/1690800/ /games/satisfactory/ 24 | 25 | # Include steam api client libs 26 | COPY --from=download \ 27 | --chown=satisfactory:satisfactory /home/steam/Steam/linux32/* /games/satisfactory/linux32/ 28 | 29 | COPY --chown=satisfactory:satisfactory ./config/* /games/satisfactory/FactoryGame/Saved/Config/LinuxServer/ 30 | 31 | COPY --chown=satisfactory:satisfactory ./run.sh /games/satisfactory/ 32 | 33 | # VOLUME /games/satisfactory/FactoryGame/Saved 34 | 35 | EXPOSE 7777/udp 15000/udp 15777/udp 36 | 37 | USER satisfactory 38 | 39 | WORKDIR /games/satisfactory 40 | 41 | ENTRYPOINT ["/games/satisfactory/run.sh"] 42 | 43 | CMD ["log"] 44 | -------------------------------------------------------------------------------- /satisfactory/README.md: -------------------------------------------------------------------------------- 1 | # Satisfactory 2 | 3 | See [Configuration file reference](https://satisfactory.fandom.com/wiki/Dedicated_servers/Configuration_files) 4 | 5 | After the server is up, connect to it via Satisfactory's Server Manager and claim it, then follow the on screen prompts. 6 | 7 | ## Ports 8 | 9 | - `7777/udp`: Game Port 10 | - `15000/udp`: Beacon Port 11 | - `15777/udp`: Query Port 12 | 13 | ## Volumes 14 | 15 | - `/data/saves`: game saves 16 | - `/configs/`: game configs 17 | 18 | -------------------------------------------------------------------------------- /satisfactory/config/ApexDestruction.ini: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /satisfactory/config/Compat.ini: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /satisfactory/config/ControlRig.ini: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /satisfactory/config/DeviceProfiles.ini: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /satisfactory/config/EditorScriptingUtilities.ini: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /satisfactory/config/Engine.ini: -------------------------------------------------------------------------------- 1 | [Core.System] 2 | Paths=../../../Engine/Content 3 | Paths=%GAMEDIR%Content 4 | Paths=../../../Engine/Plugins/Wwise/Content 5 | Paths=../../../Engine/Plugins/Editor/GeometryMode/Content 6 | Paths=../../../Engine/Plugins/Compositing/LensDistortion/Content 7 | Paths=../../../Engine/Plugins/Experimental/PythonScriptPlugin/Content 8 | Paths=../../../Engine/Plugins/Tests/EditorTests/Content 9 | Paths=../../../Engine/Plugins/Tests/RuntimeTests/Content 10 | Paths=../../../Engine/Plugins/Experimental/Landmass/Content 11 | Paths=../../../Engine/Plugins/Experimental/ControlRig/Content 12 | Paths=../../../Engine/Plugins/Experimental/FullBodyIK/Content 13 | Paths=../../../FactoryGame/Plugins/AbstractInstance/Content 14 | Paths=../../../FactoryGame/Plugins/CSSEditorToolsExtension/Content 15 | Paths=../../../Engine/Plugins/2D/Paper2D/Content 16 | Paths=../../../Engine/Plugins/Developer/AnimationSharing/Content 17 | Paths=../../../Engine/Plugins/Editor/SpeedTreeImporter/Content 18 | Paths=../../../Engine/Plugins/Enterprise/DatasmithContent/Content 19 | Paths=../../../Engine/Plugins/Experimental/ChaosClothEditor/Content 20 | Paths=../../../Engine/Plugins/Experimental/GeometryProcessing/Content 21 | Paths=../../../Engine/Plugins/Experimental/GeometryCollectionPlugin/Content 22 | Paths=../../../Engine/Plugins/Experimental/ChaosSolverPlugin/Content 23 | Paths=../../../Engine/Plugins/Experimental/ChaosNiagara/Content 24 | Paths=../../../Engine/Plugins/FX/Niagara/Content 25 | Paths=../../../Engine/Plugins/Experimental/MotoSynth/Content 26 | Paths=../../../Engine/Plugins/Media/MediaCompositing/Content 27 | Paths=../../../Engine/Plugins/Runtime/Synthesis/Content 28 | Paths=../../../Engine/Plugins/Runtime/AudioSynesthesia/Content 29 | 30 | [/Script/Engine.Player] 31 | ConfiguredInternetSpeed=120000 32 | ConfiguredLanSpeed=130000 33 | 34 | [/Script/OnlineSubsystemUtils.IpNetDriver] 35 | MaxClientRate=120000 36 | MaxInternetClientRate=120000 37 | 38 | [/Script/SocketSubsystemEpic.EpicNetDriver] 39 | MaxClientRate=120000 40 | MaxInternetClientRate=120000 41 | 42 | -------------------------------------------------------------------------------- /satisfactory/config/FullBodyIK.ini: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /satisfactory/config/Game.ini: -------------------------------------------------------------------------------- 1 | [/Script/Engine.GameNetworkManager] 2 | TotalNetBandwidth=500000 3 | MaxDynamicBandwidth=120000 4 | MinDynamicBandwidth=100000 5 | 6 | -------------------------------------------------------------------------------- /satisfactory/config/GameUserSettings.ini: -------------------------------------------------------------------------------- 1 | [/Script/FactoryGame.FGGameUserSettings] 2 | mIntValues=() 3 | mFloatValues=() 4 | mAutoDetectSettingsHandled=False 5 | mPrimaryLanguage= 6 | CurrentFGGameUserSettingsVersion=0 7 | bUseVSync=False 8 | bUseDynamicResolution=False 9 | ResolutionSizeX=1280 10 | ResolutionSizeY=720 11 | LastUserConfirmedResolutionSizeX=1280 12 | LastUserConfirmedResolutionSizeY=720 13 | WindowPosX=-1 14 | WindowPosY=-1 15 | FullscreenMode=1 16 | LastConfirmedFullscreenMode=1 17 | PreferredFullscreenMode=1 18 | Version=5 19 | AudioQualityLevel=0 20 | LastConfirmedAudioQualityLevel=0 21 | FrameRateLimit=0.000000 22 | DesiredScreenWidth=1280 23 | DesiredScreenHeight=720 24 | LastUserConfirmedDesiredScreenWidth=1280 25 | LastUserConfirmedDesiredScreenHeight=720 26 | LastRecommendedScreenWidth=-1.000000 27 | LastRecommendedScreenHeight=-1.000000 28 | LastCPUBenchmarkResult=-1.000000 29 | LastGPUBenchmarkResult=-1.000000 30 | LastGPUBenchmarkMultiplier=1.000000 31 | bUseHDRDisplayOutput=False 32 | HDRDisplayOutputNits=1000 33 | 34 | [ScalabilityGroups] 35 | sg.ResolutionQuality=100.000000 36 | sg.ViewDistanceQuality=3 37 | sg.AntiAliasingQuality=3 38 | sg.ShadowQuality=3 39 | sg.PostProcessQuality=3 40 | sg.TextureQuality=3 41 | sg.EffectsQuality=3 42 | sg.FoliageQuality=3 43 | sg.ShadingQuality=3 44 | 45 | [/Script/Engine.GameUserSettings] 46 | bUseDesiredScreenHeight=False 47 | 48 | -------------------------------------------------------------------------------- /satisfactory/config/Hardware.ini: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /satisfactory/config/Input.ini: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /satisfactory/config/MotoSynth.ini: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /satisfactory/config/Niagara.ini: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /satisfactory/config/Paper2D.ini: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /satisfactory/config/PhysXVehicles.ini: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /satisfactory/config/RuntimeOptions.ini: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /satisfactory/config/Scalability.ini: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /satisfactory/config/ServerSettings.ini: -------------------------------------------------------------------------------- 1 | [/Script/FactoryGame.FGServerSubsystem] 2 | mAutoPause=False 3 | mAutoSaveOnDisconnect=True 4 | -------------------------------------------------------------------------------- /satisfactory/config/Synthesis.ini: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /satisfactory/config/VariantManagerContent.ini: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /satisfactory/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/env sh 2 | /games/satisfactory/FactoryServer.sh -log -unattended -ServerQueryPort=15777 -BeaconPort=15000 -Port=7777 3 | -------------------------------------------------------------------------------- /steamcmd/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:22.04 2 | 3 | RUN dpkg --add-architecture i386 \ 4 | && apt-get update \ 5 | && apt-get install -y \ 6 | ca-certificates \ 7 | curl \ 8 | lib32gcc-s1 \ 9 | sudo \ 10 | tar \ 11 | && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \ 12 | && groupadd -r steam \ 13 | && useradd -m -s /bin/bash -g steam -G sudo steam \ 14 | && echo "steam:steam" | chpasswd \ 15 | && mkdir -p /data/configs /data/logs /data/saves /games /tmp \ 16 | && chown -R steam /data /games /home/steam/ /tmp 17 | 18 | # Steam user to login with 19 | ENV STEAM_USER="anonymous" 20 | 21 | # Steam password used to authenticate 22 | ENV STEAM_PASS="" 23 | 24 | # Steam guard OTP if logging in with an account that has Steam guard enabled 25 | ENV STEAM_GUARD="" 26 | 27 | # Disable login command, useful if mounting a steam profile 28 | ENV NO_LOGIN="" 29 | 30 | # APP ID for the application you want to install. Mostly useful in base images. See https://developer.valvesoftware.com/wiki/Dedicated_Servers_List 31 | ENV APPID="" 32 | 33 | USER steam 34 | WORKDIR /home/steam 35 | 36 | COPY --chown=steam:steam ./data/ /data/ 37 | COPY --chown=steam:steam ./install.sh /home/steam/install.sh 38 | 39 | RUN mkdir -p /home/steam/.steam/sdk32 /home/steam/Steam \ 40 | && curl http://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz | tar -xz -C /home/steam/Steam/ \ 41 | && echo quit | /home/steam/Steam/steamcmd.sh \ 42 | && ln -s /home/steam/Steam/linux32/steamclient.so /home/steam/.steam/sdk32/steamclient.so 43 | 44 | 45 | # where user accounts are stored, useful if you want to simply mount an already authenticated user or cache user authentication data for reuse 46 | VOLUME ["/home/steam/Steam/userdata/"] 47 | 48 | ENTRYPOINT /home/steam/install.sh && /data/configs/configure.sh 49 | -------------------------------------------------------------------------------- /steamcmd/data/configs/configure.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "/data/configs/configure.sh (AKA this very file) gets called by steamcmd after running the install.sh by default" 3 | echo "You should overwrite /data/configs/configure.sh by mounting a volume at /data/configs and using your own." 4 | echo "The game specfied by the APPPID $APPID was installed at /home/steam/games/$APPID/" -------------------------------------------------------------------------------- /steamcmd/install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | export APP_COMMAND="+force_install_dir /games/$APPID/ +app_update $APPID validate" 4 | if [[ -z "$APPID" ]]; then 5 | APP_COMMAND="" 6 | fi; 7 | 8 | if [[ -z "$STEAM_USER" ]]; then 9 | export STEAM_USER="anonymous"; 10 | export STEAM_PASS=""; 11 | fi; 12 | 13 | export LOGIN_COMMAND=""; 14 | if [[ -z "$NO_LOGIN" ]]; then 15 | export LOGIN_COMMAND="+login $STEAM_USER $STEAM_PASS $STEAM_GUARD"; 16 | fi; 17 | 18 | exec /home/steam/Steam/steamcmd.sh \ 19 | +@sSteamCmdForcePlatformType linux \ 20 | ${LOGIN_COMMAND} ${APP_COMMAND} +exit; 21 | -------------------------------------------------------------------------------- /terraria/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM docker.io/ubuntu:latest as download 2 | 3 | ARG VERSION=1436 4 | 5 | WORKDIR /games/terraria 6 | 7 | ADD https://terraria.org/api/download/pc-dedicated-server/terraria-server-${VERSION}.zip /games/terraria.zip 8 | 9 | RUN apt-get update \ 10 | && apt-get install -y unzip \ 11 | && unzip ../terraria.zip \ 12 | && cp -R ${VERSION}/Linux/* /games/terraria 13 | 14 | FROM docker.io/ubuntu:latest 15 | 16 | WORKDIR /games/terraria 17 | 18 | RUN useradd -d /games/terraria -u 1000 -o -s /bin/bash terraria 19 | 20 | COPY --from=download \ 21 | --chown=terraria:terraria /games/terraria/* /games/terraria/ 22 | COPY --chown=terraria:terraria ./run.sh /games/terraria/run.sh 23 | COPY --chown=terraria:terraria ./generate_config.sh /games/terraria/generate_config.sh 24 | COPY --chown=terraria:terraria ./data /data 25 | 26 | RUN chmod +x /games/terraria/run.sh /games/terraria/TerrariaServer.bin.* \ 27 | && chown -Rv terraria:terraria /games/terraria /data 28 | 29 | #Sets the name of the world when using autocreate 30 | ENV T_WORLD_NAME "MobyWorld" 31 | 32 | #Sets the max number of players allowed on a server. Value must be between 1 and 255 33 | ENV T_MAX_PLAYERS 8 34 | 35 | #Set the server password 36 | ENV T_PASSWORD "" 37 | 38 | #Set the message of the day 39 | ENV T_MOTD "Save the whales!" 40 | 41 | #Creates a new world if none is found. World size is specified by: 1(small), 2(medium), and 3(large). 42 | ENV T_WORLD_SIZE 2 43 | 44 | #Sets world difficulty when using -autocreate. Options: 0(normal), 1(expert) 45 | ENV T_DIFFICULTY 0 46 | 47 | #Adds additional cheat protection. 48 | ENV T_SECURE 1 49 | 50 | #Sets the server language from its language code. en/US = English de/DE = German it/IT = Italian fr/FR = French es/ES = Spanish ru/RU = Russian zh/Hans = Chinese pt/BR = Portuguese pl/PL = Polish 51 | ENV T_LANG "en/US" 52 | 53 | USER terraria 54 | 55 | VOLUME ["/data/saves", "/data/configs"] 56 | 57 | EXPOSE 7777 58 | 59 | ENTRYPOINT ["/games/terraria/run.sh"] 60 | CMD ["-config /data/configs/serverconfig.txt"] 61 | -------------------------------------------------------------------------------- /terraria/README.md: -------------------------------------------------------------------------------- 1 | # Terraria 2 | 3 | Dedicated server for Terraria 4 | 5 | 6 | ## Environment variables 7 | 8 | - `T_WORLD_NAME "MobyWorld"`: Sets the name of the world when using autocreate 9 | - `T_MAX_PLAYERS 8`: Sets the max number of players allowed on a server. Value must be between 1 and 255 10 | - `T_PASSWORD ""`: Set the server password 11 | - `T_MOTD "Save the whales!"`: Set the message of the day 12 | - `T_WORLD_SIZE 2`: Creates a new world if none is found. World size is specified by: 1(small), 2(medium), and 3(large). 13 | - `T_DIFFICULTY 0`: Sets world difficulty when using -autocreate. Options: 0(normal), 1(expert) 14 | - `T_SECURE 1`: Adds additional cheat protection. 15 | - `T_LANG "en/US"`: Sets the server language from its language code. en/US = English de/DE = German it/IT = Italian fr/FR = French es/ES = Spanish ru/RU = Russian zh/Hans = Chinese pt/BR = Portuguese pl/PL = Polish 16 | 17 | ## Ports 18 | 19 | - `7777/tcp`: Game port 20 | 21 | ## Volumes 22 | 23 | - `/data/saves`: game saves 24 | - `/data/configs/serverconfig.txt`: https://terraria.fandom.com/wiki/Server#Server_config_file 25 | -------------------------------------------------------------------------------- /terraria/data/configs/serverconfig.txt: -------------------------------------------------------------------------------- 1 | #Sets the max number of players allowed on a server. Value must be between 1 and 255 2 | maxplayers=8 3 | 4 | #Set the port number 5 | port=7777 6 | 7 | #Set the server password 8 | password= 9 | #Set the message of the day 10 | motd=Please don’t cut the purple trees! 11 | 12 | #Sets the folder where world files will be stored 13 | worldpath=/data/saves/worlds/ 14 | 15 | #Load a world and automatically start the server. 16 | world=/data/saves/worlds/world1.wld 17 | 18 | #Creates a new world if none is found. World size is specified by: 1(small), 2(medium), and 3(large). 19 | autocreate=2 20 | 21 | #Sets world difficulty when using -autocreate. Options: 0(normal), 1(expert) 22 | difficulty=0 23 | 24 | #Sets the name of the world when using autocreate 25 | worldname=World 26 | 27 | #The location of the banlist. Defaults to "banlist.txt" in the working directory. 28 | banlist=/data/configs/banlist.txt 29 | 30 | #Adds additional cheat protection. 31 | secure=1 32 | 33 | #Sets the server language from its language code. en/US = English de/DE = German it/IT = Italian fr/FR = French es/ES = Spanish ru/RU = Russian zh/Hans = Chinese pt/BR = Portuguese pl/PL = Polish 34 | language=en/US 35 | -------------------------------------------------------------------------------- /terraria/generate_config.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ -z "${T_WORLD_NAME}" ]; then export T_WORLD_NAME="MobyWorld"; fi 4 | if [ -z "${T_MAX_PLAYERS}" ]; then export T_MAX_PLAYERS=8; fi 5 | if [ -z "${T_PORT}" ]; then export T_PORT=7777; fi 6 | if [ -z "${T_PASSWORD}" ]; then export T_WORLD_NAME=""; fi 7 | if [ -z "${T_MOTD}" ]; then export T_MOTD="Please don't cut the purple trees! Save the whales!"; fi 8 | if [ -z "${T_WORLD_SIZE}" ]; then export T_WORLD_SIZE=2; fi 9 | if [ -z "${T_DIFFICULTY}" ]; then export T_DIFFICULTY=0; fi 10 | if [ -z "${T_SECURE}" ]; then export T_SECURE=1; fi 11 | if [ -z "${T_LANG}" ]; then export T_SECURE="en/US"; fi 12 | 13 | cat <> /data/configs/serverconfig.txt 14 | #Sets the name of the world when using autocreate 15 | worldname=${T_WORLD_NAME} 16 | 17 | #Sets the max number of players allowed on a server. Value must be between 1 and 255 18 | maxplayers=${T_MAX_PLAYERS} 19 | 20 | #Set the port number 21 | port=${T_PORT} 22 | 23 | #Set the server password 24 | password=${T_PASSWORD} 25 | 26 | #Set the message of the day 27 | motd=${T_MOTD} 28 | 29 | #Sets the folder where world files will be stored 30 | worldpath=/data/saves/worlds/ 31 | 32 | #Load a world and automatically start the server. 33 | world=/data/saves/worlds/world1.wld 34 | 35 | #Creates a new world if none is found. World size is specified by: 1(small), 2(medium), and 3(large). 36 | autocreate=${T_WORLD_SIZE} 37 | 38 | #Sets world difficulty when using -autocreate. Options: 0(normal), 1(expert) 39 | difficulty=${T_DIFFICULTY} 40 | 41 | #The location of the banlist. Defaults to "banlist.txt" in the working directory. 42 | banlist=/data/configs/banlist.txt 43 | 44 | #Adds additional cheat protection. 45 | secure=${T_SECURE} 46 | 47 | #Sets the server language from its language code. en/US = English de/DE = German it/IT = Italian fr/FR = French es/ES = Spanish ru/RU = Russian zh/Hans = Chinese pt/BR = Portuguese pl/PL = Polish 48 | language=${T_LANG} 49 | EOF 50 | -------------------------------------------------------------------------------- /terraria/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ -f /data/configs/serverconfig.txt ]; then 4 | echo "using existing config" 5 | else 6 | echo "generating config based on env" 7 | ./generate_config.sh 8 | fi 9 | 10 | exec /games/terraria/TerrariaServer.bin.x86_64 $@ 11 | -------------------------------------------------------------------------------- /valheim/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM gamenight/steamcmd:latest AS download 2 | 3 | ARG VERSION="gn-wip-local" 4 | 5 | ENV APPID=896660 6 | ENV STEAM_USER="anonymous" 7 | ENV VERSION="${VERSION}" 8 | 9 | RUN /home/steam/install.sh 10 | 11 | FROM ubuntu:latest as server 12 | 13 | ENV VH_SERVER_NAME="Valheim Docker" 14 | ENV VH_WORLD="World" 15 | ENV VH_SERVER_PASSWORD="" 16 | ENV VH_PUBLIC="1" 17 | ENV PGID=1000 18 | ENV PUID=1000 19 | 20 | ENV LD_LIBRARY_PATH=/games/valheim/linux64:$LD_LIBRARY_PATH 21 | 22 | COPY --from=download /games/896660/ /games/valheim/ 23 | COPY ./run.sh /games/valheim/ 24 | 25 | WORKDIR /data 26 | 27 | VOLUME /data 28 | 29 | EXPOSE 2456/udp 2457/udp 30 | 31 | ENTRYPOINT /games/valheim/run.sh 32 | -------------------------------------------------------------------------------- /valheim/README.md: -------------------------------------------------------------------------------- 1 | # Valheim 2 | 3 | Dedicated server for Valheim 4 | 5 | 6 | 7 | 8 | ## Environment variables 9 | 10 | - `VH_SERVER_NAME`: Sets the name that will be visible in the server list 11 | - `VH_SERVER_PASSWORD`: The server password 12 | - `VH_WORLD`: creates or loads a world with the specified name. 13 | - `VH_PUBLIC`: Visibility of the server, if set to `1` the server will be visible in the server browser 14 | - `PUID`: runs the valheim process and sets the `/data` volume permissions with this user id. 15 | - `PGID`: runs the valheim process and sets the `/data` volume permission with this group id 16 | 17 | ## Ports 18 | 19 | - `2456/udp`: Valheim game port 20 | - `2457/udp`: Steam query port 21 | 22 | ## Volumes 23 | 24 | - `/data`: game save data will be stored here 25 | 26 | Special Files. Add Steam IDs (one per line) to set the desired roles: 27 | 28 | - `/data/adminlist.txt` 29 | - `/data/bannedlist.txt` 30 | - `/data/permittedlist.txt` 31 | > NOTE: Adding a person to the permitted list will auto-ban anyone who tries to join that is not added to the permitted list 32 | -------------------------------------------------------------------------------- /valheim/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | export ispub="0" 4 | if [ "${VH_PUBLIC}" = "1" ]; then 5 | ispub="1" 6 | fi 7 | 8 | export _PASSWORD_ARG="-password ${VH_SERVER_PASSWORD}" 9 | if [[ -z "${VH_SERVER_PASSWORD}" ]]; then 10 | _PASSWORD_ARG="-password" 11 | fi 12 | 13 | PUSER=valheim; 14 | if [ -z "$(cat /etc/group | grep ${PGID})" ]; then 15 | addgroup -q --gecos "" --gid ${PGID} ${PUSER}; 16 | fi 17 | 18 | if [ -z "$(cat /etc/passwd | grep ${PUID})" ]; then 19 | adduser -q --gecos "" --uid ${PUID} --gid ${PGID} --disabled-password --disabled-login --no-create-home ${PUSER}; 20 | fi 21 | 22 | chown -R ${PUID}:${PGID} /data; 23 | chown -R ${PUID}:${PGID} /games; 24 | 25 | exec su valheim -c "export LD_LIBRARY_PATH=\"./linux64:$LD_LIBRARY_PATH\"; \ 26 | export SteamAppID=892970; \ 27 | echo \"Starting Valheim (\${SteamAppID}) server\"; \ 28 | cd /games/valheim; \ 29 | /games/valheim/valheim_server.x86_64 -nographics -batchmode \ 30 | -savedir /data \ 31 | -port 2456 \ 32 | -name \"${VH_SERVER_NAME}\" ${_PASSWORD_ARG} \ 33 | -world \"${VH_WORLD}\" \ 34 | -public \"${ispub}\"; \ 35 | echo \"Valheim (\${SteamAppID}) server exited with code \$?\";" 36 | 37 | -------------------------------------------------------------------------------- /versions.txt: -------------------------------------------------------------------------------- 1 | steamcmd latest 2 | minecraft 1.18.2 3 | factorio 1.1.59 4 | valheim 0.208.1 5 | terraria 1436 6 | dwarf_fortress 47_05 7 | satisfactory latest 8 | --------------------------------------------------------------------------------