Compare commits

..

36 Commits

Author SHA1 Message Date
Geoff Bourne
19eebae327 Auto-merging via docker-versions-create 2021-09-15 21:10:23 -05:00
Geoff Bourne
088bc53010 Auto-merging via docker-versions-create 2021-09-15 20:39:04 -05:00
Geoff Bourne
19c5626085 Auto-merging via docker-versions-create 2021-08-30 21:39:28 -05:00
Geoff Bourne
03cbbd465a Auto-merging via docker-versions-create 2021-08-10 12:57:46 -05:00
Geoff Bourne
592f18358a Auto-merging via docker-versions-create 2021-08-01 12:15:02 -05:00
Geoff Bourne
905906fa6c Auto-merging via docker-versions-create 2021-07-31 09:29:16 -05:00
Geoff Bourne
c862745534 Auto-merging via docker-versions-create 2021-07-26 19:37:13 -05:00
Geoff Bourne
ead8543b48 Merge branch 'master' into java16 2021-07-25 18:21:54 -05:00
Geoff Bourne
d34ae9d57d Auto-merging via docker-versions-create 2021-07-25 09:38:47 -05:00
Geoff Bourne
b6e53249f9 Auto-merging via docker-versions-create 2021-07-23 21:29:14 -05:00
Geoff Bourne
8020f83c3d Auto-merging via docker-versions-create 2021-07-17 21:16:18 -05:00
Geoff Bourne
fe01df78c4 Auto-merging via docker-versions-create 2021-07-17 20:59:03 -05:00
Geoff Bourne
afd0865d33 Auto-merging via docker-versions-create 2021-07-17 18:06:02 -05:00
Geoff Bourne
bcf408fb44 Auto-merging via docker-versions-create 2021-07-14 18:43:28 -05:00
Geoff Bourne
37f59eecd9 Auto-merging via docker-versions-create 2021-07-12 19:11:17 -05:00
Geoff Bourne
4ae2e5592f Auto-merging via docker-versions-create 2021-07-09 20:00:00 -05:00
Geoff Bourne
8fc44e0071 Auto-merging via docker-versions-create 2021-07-08 18:01:28 -05:00
Geoff Bourne
f3fa90b700 Auto-merging via docker-versions-create 2021-07-08 08:05:30 -05:00
itzg
c1322a23ea Auto-merging via docker-versions-create 2021-07-08 12:56:09 +00:00
Geoff Bourne
4cbf481441 Auto-merging via docker-versions-create 2021-07-08 07:40:33 -05:00
itzg
1cd8ec83ef Auto-merging via docker-versions-create 2021-07-04 19:54:08 +00:00
Geoff Bourne
9778bddd4f Auto-merging from master 2021-07-03 14:27:40 -05:00
Geoff Bourne
a03a1a8eff ci: auto-merge from master 2021-07-02 16:03:37 -05:00
itzg
408af32fbe Auto-merging via docker-versions-create 2021-07-02 16:56:04 +00:00
itzg
141d6c7125 Auto-merging via docker-versions-create 2021-06-28 12:14:14 +00:00
itzg
ddd4712ea0 Auto-merging via docker-versions-create 2021-06-27 13:13:19 +00:00
itzg
680987a385 Auto-merging via docker-versions-create 2021-06-24 12:47:13 +00:00
Geoff Bourne
655ae04abb Auto-merging via docker-versions-create 2021-06-23 22:35:33 -05:00
Geoff Bourne
f62dd55300 Auto-merging via docker-versions-create 2021-06-20 12:50:41 -05:00
Geoff Bourne
b5877f6208 Auto-merging via docker-versions-create 2021-06-05 17:54:18 -05:00
Geoff Bourne
d561c026c6 Auto-merging via docker-versions-create 2021-05-24 20:52:34 -05:00
Geoff Bourne
3cd3ca9d88 Merge branch 'master' into java16 2021-05-23 12:27:27 -05:00
Geoff Bourne
b9ef9a46b6 Merge from master 2021-05-22 13:47:15 -05:00
Geoff Bourne
275863f04c Auto-merging via docker-versions-create 2021-05-21 23:03:45 -05:00
Geoff Bourne
ae94a6be3a Auto-merging via docker-versions-create 2021-05-21 22:52:46 -05:00
Geoff Bourne
d08c6e2c46 ci: updated CACHE_NAME 2021-05-21 22:13:59 -05:00
46 changed files with 483 additions and 440 deletions

View File

@@ -8,7 +8,7 @@ on:
- java8-openj9 - java8-openj9
- java11* - java11*
- java16* - java16*
- test/* - test/multiarch/*
tags: tags:
- "[0-9]+.[0-9]+.[0-9]+" - "[0-9]+.[0-9]+.[0-9]+"
- "[0-9]+.[0-9]+.[0-9]+-multiarch*" - "[0-9]+.[0-9]+.[0-9]+-multiarch*"

View File

@@ -7,7 +7,7 @@ on:
- openj9 - openj9
- openj9-11 - openj9-11
- adopt11 - adopt11
- test/alpine/* - test/*
tags: tags:
- "[0-9]+.[0-9]+.[0-9]+-java8" - "[0-9]+.[0-9]+.[0-9]+-java8"
- "[0-9]+.[0-9]+.[0-9]+-openj9" - "[0-9]+.[0-9]+.[0-9]+-openj9"

View File

@@ -3,7 +3,7 @@
Adding a new server `TYPE` can vary due to the complexity of obtaining and configuring each type; however, the addition of any server type includes at least the following steps: Adding a new server `TYPE` can vary due to the complexity of obtaining and configuring each type; however, the addition of any server type includes at least the following steps:
1. Copy an existing "start-deploy*" script, such as [start-deployMohist](start-deployMohist) and rename it accordingly making sure to retain the "start-deploy" prefix 1. Copy an existing "start-deploy*" script, such as [start-deployMohist](start-deployMohist) and rename it accordingly making sure to retain the "start-deploy" prefix
2. Modify the type-specific behavior between the "start-utils" preamble and the hand-off to `start-setupWorld` at the end of the script 2. Modify the type-specific behavior between the "start-utils" preamble and the hand-off to `start-finalSetupWorld` at the end of the script
3. Develop and test the changes using the [iterative process described below](#iterative-script-development) 3. Develop and test the changes using the [iterative process described below](#iterative-script-development)
4. Add a case-entry to the `case "${TYPE^^}"` in [start-configuration](start-configuration) 4. Add a case-entry to the `case "${TYPE^^}"` in [start-configuration](start-configuration)
5. Add a section to the [README](README.md). It is recommended to copy-modify an existing section to retain a similar wording and level of detail 5. Add a section to the [README](README.md). It is recommended to copy-modify an existing section to retain a similar wording and level of detail
@@ -70,5 +70,5 @@ The multiarch images are built and published by [a Github action](https://github
The following git command can be used to provide the bulk of release notes content: The following git command can be used to provide the bulk of release notes content:
```shell script ```shell script
git log --invert-grep --grep "^ci:" --grep "^misc:" --grep "^docs:" --grep "^build(deps)" --pretty="- %s" 1.1.0..1.2.0 git log --invert-grep --grep "^ci:" --grep "^misc:" --grep "^docs:" --pretty="- %s" 1.1.0..1.2.0
``` ```

View File

@@ -1,29 +1,30 @@
FROM openjdk:8u212-jre-alpine FROM adoptopenjdk:16-jre
LABEL org.opencontainers.image.authors="Geoff Bourne <itzgeoff@gmail.com>" LABEL org.opencontainers.image.authors="Geoff Bourne <itzgeoff@gmail.com>"
RUN apk add --no-cache -U \ RUN apt-get update \
openssl \ && DEBIAN_FRONTEND=noninteractive \
apt-get install -y \
imagemagick \ imagemagick \
lsof \ gosu \
su-exec \ sudo \
shadow \ net-tools \
bash \ iputils-ping \
curl iputils wget \ curl wget \
git \ git \
jq \ jq \
dos2unix \
mysql-client \ mysql-client \
tzdata \ tzdata \
rsync \ rsync \
nano \ nano \
sudo \ unzip \
knock \ knockd \
ttf-dejavu ttf-dejavu \
&& apt-get clean
RUN addgroup -g 1000 minecraft \ RUN addgroup --gid 1000 minecraft \
&& adduser -Ss /bin/false -u 1000 -G minecraft -h /home/minecraft minecraft \ && adduser --system --shell /bin/false --uid 1000 --ingroup minecraft --home /data minecraft
&& mkdir -m 777 /data \
&& chown minecraft:minecraft /data /home/minecraft
COPY files/sudoers* /etc/sudoers.d COPY files/sudoers* /etc/sudoers.d
@@ -31,9 +32,9 @@ EXPOSE 25565 25575
# hook into docker BuildKit --platform support # hook into docker BuildKit --platform support
# see https://docs.docker.com/engine/reference/builder/#automatic-platform-args-in-the-global-scope # see https://docs.docker.com/engine/reference/builder/#automatic-platform-args-in-the-global-scope
ARG TARGETOS=linux ARG TARGETOS
ARG TARGETARCH=amd64 ARG TARGETARCH
ARG TARGETVARIANT="" ARG TARGETVARIANT
ARG EASY_ADD_VER=0.7.1 ARG EASY_ADD_VER=0.7.1
ADD https://github.com/itzg/easy-add/releases/download/${EASY_ADD_VER}/easy-add_${TARGETOS}_${TARGETARCH}${TARGETVARIANT} /usr/bin/easy-add ADD https://github.com/itzg/easy-add/releases/download/${EASY_ADD_VER}/easy-add_${TARGETOS}_${TARGETARCH}${TARGETVARIANT} /usr/bin/easy-add
@@ -44,25 +45,26 @@ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz --from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--var version=1.5.1 --var app=rcon-cli --file {{.app}} \ --var version=1.4.7 --var app=rcon-cli --file {{.app}} \
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz --from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--var version=0.10.1 --var app=mc-monitor --file {{.app}} \ --var version=0.7.1 --var app=mc-monitor --file {{.app}} \
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz --from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--var version=1.8.0 --var app=mc-server-runner --file {{.app}} \ --var version=1.7.0 --var app=mc-server-runner --file {{.app}} \
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz --from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--var version=0.1.1 --var app=maven-metadata-release --file {{.app}} \ --var version=0.1.1 --var app=maven-metadata-release --file {{.app}} \
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz --from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
ARG MC_HELPER_VERSION=1.6.1 ARG ASCIIFY_VERSION=1.0.1
RUN curl -fsSL https://github.com/itzg/mc-image-helper/releases/download/v${MC_HELPER_VERSION}/mc-image-helper-${MC_HELPER_VERSION}.tgz \ ADD https://jitpack.io/com/github/itzg/asciify/${ASCIIFY_VERSION}/asciify-${ASCIIFY_VERSION}.jar /usr/share/asciify/asciify.jar
| tar -C /usr/share -zxf - \ RUN chmod -R a+r /usr/share/asciify
&& ln -s /usr/share/mc-image-helper-${MC_HELPER_VERSION}/bin/mc-image-helper /usr/bin
COPY mcstatus /usr/local/bin
VOLUME ["/data"] VOLUME ["/data"]
COPY server.properties /tmp/server.properties COPY server.properties /tmp/server.properties
@@ -72,7 +74,7 @@ WORKDIR /data
STOPSIGNAL SIGTERM STOPSIGNAL SIGTERM
ENV UID=1000 GID=1000 \ ENV UID=1000 GID=1000 \
JVM_XX_OPTS="-XX:+UseG1GC" MEMORY="1G" \ MEMORY="1G" \
TYPE=VANILLA VERSION=LATEST \ TYPE=VANILLA VERSION=LATEST \
ENABLE_RCON=true RCON_PORT=25575 RCON_PASSWORD=minecraft \ ENABLE_RCON=true RCON_PORT=25575 RCON_PASSWORD=minecraft \
SERVER_PORT=25565 ONLINE_MODE=TRUE SERVER_NAME="Dedicated Server" \ SERVER_PORT=25565 ONLINE_MODE=TRUE SERVER_NAME="Dedicated Server" \
@@ -80,13 +82,13 @@ ENV UID=1000 GID=1000 \
AUTOPAUSE_PERIOD=10 AUTOPAUSE_KNOCK_INTERFACE=eth0 AUTOPAUSE_PERIOD=10 AUTOPAUSE_KNOCK_INTERFACE=eth0
COPY start* / COPY start* /
COPY bin/ /usr/local/bin/ COPY health.sh /
COPY bin/mc-health /health.sh
ADD files/autopause /autopause ADD files/autopause /autopause
RUN dos2unix /start* && chmod +x /start* \ RUN dos2unix /start* && chmod +x /start*
&& dos2unix /autopause/* && chmod +x /autopause/*.sh RUN dos2unix /health.sh && chmod +x /health.sh
RUN dos2unix /autopause/* && chmod +x /autopause/*.sh
ENTRYPOINT [ "/start" ] ENTRYPOINT [ "/start" ]
HEALTHCHECK --start-period=1m CMD mc-health HEALTHCHECK --start-period=1m CMD /health.sh

184
README.md
View File

@@ -43,8 +43,10 @@ By default, the container will download the latest version of the "vanilla" [Min
* [Running a Forge Server](#running-a-forge-server) * [Running a Forge Server](#running-a-forge-server)
* [Running a Bukkit/Spigot server](#running-a-bukkitspigot-server) * [Running a Bukkit/Spigot server](#running-a-bukkitspigot-server)
* [Running a Paper server](#running-a-paper-server) * [Running a Paper server](#running-a-paper-server)
* [Running a Tuinity server](#running-a-tuinity-server)
* [Running an Airplane server](#running-an-airplane-server) * [Running an Airplane server](#running-an-airplane-server)
* [Running a Purpur server](#running-a-purpur-server) * [Running a Purpur server](#running-a-purpur-server)
* [Running a Yatopia server](#running-a-yatopia-server)
* [Running a Magma server](#running-a-magma-server) * [Running a Magma server](#running-a-magma-server)
* [Running a Mohist server](#running-a-mohist-server) * [Running a Mohist server](#running-a-mohist-server)
* [Running a Catserver type server](#running-a-catserver-type-server) * [Running a Catserver type server](#running-a-catserver-type-server)
@@ -70,7 +72,8 @@ By default, the container will download the latest version of the "vanilla" [Min
* [Cloning world from a container path](#cloning-world-from-a-container-path) * [Cloning world from a container path](#cloning-world-from-a-container-path)
* [Overwrite world on start](#overwrite-world-on-start) * [Overwrite world on start](#overwrite-world-on-start)
* [Server configuration](#server-configuration) * [Server configuration](#server-configuration)
* [Message of the Day](#message-of-the-day) * [Server name](#server-name)
* [Server port](#server-port)
* [Difficulty](#difficulty) * [Difficulty](#difficulty)
* [Whitelist Players](#whitelist-players) * [Whitelist Players](#whitelist-players)
* [Op/Administrator Players](#opadministrator-players) * [Op/Administrator Players](#opadministrator-players)
@@ -95,18 +98,16 @@ By default, the container will download the latest version of the "vanilla" [Min
* [View Distance](#view-distance) * [View Distance](#view-distance)
* [Level Seed](#level-seed) * [Level Seed](#level-seed)
* [Game Mode](#game-mode) * [Game Mode](#game-mode)
* [Message of the Day](#message-of-the-day)
* [PVP Mode](#pvp-mode) * [PVP Mode](#pvp-mode)
* [Level Type and Generator Settings](#level-type-and-generator-settings) * [Level Type and Generator Settings](#level-type-and-generator-settings)
* [Custom Server Resource Pack](#custom-server-resource-pack) * [Custom Server Resource Pack](#custom-server-resource-pack)
* [Level / World Save Name](#level--world-save-name) * [Level / World Save Name](#level--world-save-name)
* [Online mode](#online-mode) * [Online mode](#online-mode)
* [Allow flight](#allow-flight) * [Allow flight](#allow-flight)
* [Server name](#server-name)
* [Server port](#server-port)
* [Other server property mappings](#other-server-property-mappings) * [Other server property mappings](#other-server-property-mappings)
* [Miscellaneous Options](#miscellaneous-options) * [Miscellaneous Options](#miscellaneous-options)
* [Replacing variables inside configs](#replacing-variables-inside-configs) * [Replacing variables inside configs](#replacing-variables-inside-configs)
* [Patching existing files](#patching-existing-files)
* [Running with a custom server JAR](#running-with-a-custom-server-jar) * [Running with a custom server JAR](#running-with-a-custom-server-jar)
* [Force re-download of the server file](#force-re-download-of-the-server-file) * [Force re-download of the server file](#force-re-download-of-the-server-file)
* [Running as alternate user/group ID](#running-as-alternate-usergroup-id) * [Running as alternate user/group ID](#running-as-alternate-usergroup-id)
@@ -129,7 +130,7 @@ By default, the container will download the latest version of the "vanilla" [Min
* [Enabling Autopause](#enabling-autopause) * [Enabling Autopause](#enabling-autopause)
* [Running on RaspberryPi](#running-on-raspberrypi) * [Running on RaspberryPi](#running-on-raspberrypi)
<!-- Added by: runner, at: Sat Oct 9 16:34:51 UTC 2021 --> <!-- Added by: runner, at: Thu Sep 16 01:45:44 UTC 2021 -->
<!--te--> <!--te-->
@@ -151,7 +152,8 @@ docker exec -i mc rcon-cli
Note: The `-i` is required for interactive use of rcon-cli. Note: The `-i` is required for interactive use of rcon-cli.
To run a simple, one-shot command, such as stopping a Minecraft server, pass the command as arguments to `rcon-cli`, such as: To run a simple, one-shot command, such as stopping a Minecraft server, pass the command as
arguments to `rcon-cli`, such as:
``` ```
docker exec mc rcon-cli stop docker exec mc rcon-cli stop
@@ -159,14 +161,6 @@ docker exec mc rcon-cli stop
_The `-i` is not needed in this case._ _The `-i` is not needed in this case._
If rcon is disabled you can send commands by passing them as arguments to the packaged `mc-send-to-console` script. For example, a player can be op'ed in the container `mc` with:
```shell
docker exec mc mc-send-to-console op player
| |
+- container name +- Minecraft commands start here
```
In order to attach and interact with the Minecraft server, add `-it` when starting the container, such as In order to attach and interact with the Minecraft server, add `-it` when starting the container, such as
docker run -d -it -p 25565:25565 --name mc itzg/minecraft-server docker run -d -it -p 25565:25565 --name mc itzg/minecraft-server
@@ -436,9 +430,17 @@ If you have attached a host directory to the `/data` volume, then you can instal
[You can also auto-download plugins using `SPIGET_RESOURCES`.](#auto-downloading-spigotmcbukkitpapermc-plugins) [You can also auto-download plugins using `SPIGET_RESOURCES`.](#auto-downloading-spigotmcbukkitpapermc-plugins)
### Running a Tuinity server
A [Tuinity](https://github.com/Spottedleaf/Tuinity) server, which is a fork of Paper aimed at improving server performance at high playercounts.
-e TYPE=TUINITY
> **NOTE** only `VERSION=LATEST` is supported
### Running an Airplane server ### Running an Airplane server
An [Airplane](https://airplane.gg) server, which is "a stable, optimized, well supported 1.17 Paper fork." An [Airplane](https://github.com/TECHNOVE/Airplane) server, which is a fork of Tuinity aimed at further improving server performance at high playercounts.
-e TYPE=AIRPLANE -e TYPE=AIRPLANE
@@ -451,7 +453,7 @@ Extra variables:
### Running a Purpur server ### Running a Purpur server
A [Purpur](https://purpur.pl3x.net/) server, which is "drop-in replacement for Paper servers designed for configurability, new fun and exciting gameplay features, and performance built on top of Airplane." A [Purpur](https://purpur.pl3x.net/) server, which is "a drop-in replacement for Paper servers designed for configurability, new fun and exciting gameplay features, and high performance built on top of Tuinity."
-e TYPE=PURPUR -e TYPE=PURPUR
@@ -460,6 +462,18 @@ A [Purpur](https://purpur.pl3x.net/) server, which is "drop-in replacement for P
Extra variables: Extra variables:
- `PURPUR_BUILD=LATEST` : set a specific Purpur build to use - `PURPUR_BUILD=LATEST` : set a specific Purpur build to use
- `FORCE_REDOWNLOAD=false` : set to true to force the located server jar to be re-downloaded - `FORCE_REDOWNLOAD=false` : set to true to force the located server jar to be re-downloaded
### Running a Yatopia server
A [Yatopia](https://github.com/YatopiaMC/Yatopia) server, which is a "blazing fast Tuinity fork with best in class performance".
-e TYPE=YATOPIA
> NOTE: the `VERSION` variable is used to locate the Yatopia version to download
Extra variables:
- `RELEASE=stable` : set to `stable` or `latest`
- `FORCE_REDOWNLOAD=false` : set to true to force the located server jar to be re-downloaded
- `USE_FLARE_FLAGS=false` : set to true to add appropriate flags for the [Flare](https://blog.airplane.gg/flare) profiler - `USE_FLARE_FLAGS=false` : set to true to add appropriate flags for the [Flare](https://blog.airplane.gg/flare) profiler
### Running a Magma server ### Running a Magma server
@@ -642,20 +656,20 @@ then you apply a workaround by adding this to the run invocation:
There are optional volume paths that can be attached to supply content to be copied into the data area: There are optional volume paths that can be attached to supply content to be copied into the data area:
`/plugins` `/plugins`
: contents are synchronized into `/data/plugins` for Bukkit related server types. Set `SYNC_SKIP_NEWER_IN_DESTINATION=false` if you want files from `/plugins` to take precedence over newer files in `/data/plugins`. : contents are copied into `/data/plugins` for Bukkit related server types. Set `PLUGINS_SYNC_UPDATE=false` if you want files from `/plugins` to take precedence over newer files in `/data/plugins`.
`/mods` `/mods`
: contents are synchronized into `/data/mods` for Forge related server types. The destination can be changed by setting `COPY_MODS_DEST`. : contents are copied into `/data/mods` for Forge related server types
`/config` `/config`
: contents are synchronized into `/data/config` by default, but can be changed with `COPY_CONFIG_DEST`. For example, `-v ./config:/config -e COPY_CONFIG_DEST=/data` will allow you to copy over files like `bukkit.yml` and so on directly into the server directory. Set `SYNC_SKIP_NEWER_IN_DESTINATION=false` if you want files from `/config` to take precedence over newer files in `/data/config`. : contents are copied into `/data/config` by default, but can be changed with `COPY_CONFIG_DEST`
By default, the [environment variable processing](#replacing-variables-inside-configs) is performed on synchronized files that match the expected suffixes in `REPLACE_ENV_SUFFIXES` (by default "yml,yaml,txt,cfg,conf,properties,hjson,json,tml,toml") and are not excluded by `REPLACE_ENV_VARIABLES_EXCLUDES` and `REPLACE_ENV_VARIABLES_EXCLUDE_PATHS`. This processing can be disabled by setting `REPLACE_ENV_DURING_SYNC` to `false`.
If you want old mods/plugins to be removed before the content is brought over from those attach points, then add `-e REMOVE_OLD_MODS=TRUE`. You can fine tune the removal process by specifying the `REMOVE_OLD_MODS_INCLUDE` and `REMOVE_OLD_MODS_EXCLUDE` variables. By default, everything will be removed. You can also specify the `REMOVE_OLD_MODS_DEPTH` (default is 16) variable to only delete files up to a certain level. If you want old mods/plugins to be removed before the content is brought over from those attach points, then add `-e REMOVE_OLD_MODS=TRUE`. You can fine tune the removal process by specifying the `REMOVE_OLD_MODS_INCLUDE` and `REMOVE_OLD_MODS_EXCLUDE` variables. By default, everything will be removed. You can also specify the `REMOVE_OLD_MODS_DEPTH` (default is 16) variable to only delete files up to a certain level.
For example: `-e REMOVE_OLD_MODS=TRUE -e REMOVE_OLD_MODS_INCLUDE="*.jar" -e REMOVE_OLD_MODS_DEPTH=1` will remove all old jar files that are directly inside the `plugins/` or `mods/` directory. For example: `-e REMOVE_OLD_MODS=TRUE -e REMOVE_OLD_MODS_INCLUDE="*.jar" -e REMOVE_OLD_MODS_DEPTH=1` will remove all old jar files that are directly inside the `plugins/` or `mods/` directory.
You can specify the destination of the files that are copied from `/mods` and `/config` by setting the `COPY_MODS_DEST` and `COPY_CONFIG_DEST`, where the default is `/data/mods` and `/data/config`. For example, `-v ./config:/config -e COPY_CONFIG_DEST=/data` will allow you to copy over files like `bukkit.yml` and so on directly into the server directory.
These paths work well if you want to have a common set of modules in a separate location, but still have multiple worlds with different server requirements in either persistent volumes or a downloadable archive. These paths work well if you want to have a common set of modules in a separate location, but still have multiple worlds with different server requirements in either persistent volumes or a downloadable archive.
> For more flexibility with mods/plugins preparation, you can declare directories to use in [the `MODS` variable](#downloadable-modplugin-pack-for-forge-bukkit-and-spigot-servers) > For more flexibility with mods/plugins preparation, you can declare directories to use in [the `MODS` variable](#downloadable-modplugin-pack-for-forge-bukkit-and-spigot-servers)
@@ -754,25 +768,21 @@ This will reset any manual configuration of the `server.properties` file, so if
you want to make any persistent configuration changes you will need to make sure you want to make any persistent configuration changes you will need to make sure
you have properly set the proper environment variables in your docker run command (described below). you have properly set the proper environment variables in your docker run command (described below).
### Message of the Day ### Server name
The message of the day, shown below each server entry in the client UI, can be changed with the `MOTD` environment variable, such as The server name (e.g. for bungeecord) can be set like:
-e MOTD="My Server" docker run -d -e SERVER_NAME=MyServer ...
If you leave it off, a default is computed from the server type and version, such as ### Server port
A Paper Minecraft Server powered by Docker > **WARNING:** only change this value if you know what you're doing. It is only needed when using host networking and it is rare that host networking should be used. Use `-p` port mappings instead.
That way you can easily differentiate between several servers you may have started. If you must, the server port can be set like:
The section symbol (§) and other unicode characters are automatically converted to allow [formatting codes](https://minecraft.fandom.com/wiki/Formatting_codes) to be used consistently with all server versions. For example, docker run -d -e SERVER_PORT=25566 ...
-e MOTD="A §l§cMinecraft§r §nserver" **however**, be sure to change your port mapping accordingly and be prepared for some features to break.
renders
![](docs/motd-example.png)
### Difficulty ### Difficulty
@@ -786,8 +796,6 @@ values.
### Whitelist Players ### Whitelist Players
> **NOTE** it is very important to set this with servers exposed to the internet where you want only limited players to join.
To whitelist players for your Minecraft server, pass the Minecraft usernames separated by commas via the `WHITELIST` environment variable, such as To whitelist players for your Minecraft server, pass the Minecraft usernames separated by commas via the `WHITELIST` environment variable, such as
docker run -d -e WHITELIST=user1,user2 ... docker run -d -e WHITELIST=user1,user2 ...
@@ -963,6 +971,26 @@ For example:
docker run -d -e MODE=creative ... docker run -d -e MODE=creative ...
### Message of the Day
The message of the day, shown below each server entry in the client UI, can be changed with the `MOTD` environment variable, such as
-e MOTD="My Server"
If you leave it off, a default is computed from the server type and version, such as
A Paper Minecraft Server powered by Docker
That way you can easily differentiate between several servers you may have started.
The section symbol (§) and other unicode characters are automatically converted to allow [formatting codes](https://minecraft.fandom.com/wiki/Formatting_codes) to be used consistently with all server versions. For example,
-e MOTD="A §l§cMinecraft§r §nserver"
renders
![](docs/motd-example.png)
### PVP Mode ### PVP Mode
By default, servers are created with player-vs-player (PVP) mode enabled. You can disable this with the `PVP` By default, servers are created with player-vs-player (PVP) mode enabled. You can disable this with the `PVP`
@@ -1030,22 +1058,6 @@ Allows users to use flight on your server while in Survival mode, if they have a
-e ALLOW_FLIGHT=TRUE|FALSE -e ALLOW_FLIGHT=TRUE|FALSE
### Server name
The server name (e.g. for bungeecord) can be set like:
docker run -d -e SERVER_NAME=MyServer ...
### Server port
> **WARNING:** only change this value if you know what you're doing. It is only needed when using host networking and it is rare that host networking should be used. Use `-p` port mappings instead.
If you must, the server port can be set like:
docker run -d -e SERVER_PORT=25566 ...
**however**, be sure to change your port mapping accordingly and be prepared for some features to break.
### Other server property mappings ### Other server property mappings
| Environment Variable | Server Property | | Environment Variable | Server Property |
@@ -1064,7 +1076,6 @@ If you must, the server port can be set like:
| USE_NATIVE_TRANSPORT | use-native-transport | | USE_NATIVE_TRANSPORT | use-native-transport |
| ENFORCE_WHITELIST | enforce-whitelist | | ENFORCE_WHITELIST | enforce-whitelist |
| ENABLE_WHITELIST | white-list and whitelist | | ENABLE_WHITELIST | white-list and whitelist |
| SIMULATION_DISTANCE | simulation-distance |
## Miscellaneous Options ## Miscellaneous Options
@@ -1079,13 +1090,24 @@ in your config files after the container starts.
For those cases there is the option to replace defined variables inside your configs For those cases there is the option to replace defined variables inside your configs
with environment variables defined at container runtime. with environment variables defined at container runtime.
When the environment variable `REPLACE_ENV_IN_PLACE` is set to `true` (the default), the startup script will go through all files inside the container's `/data` path and replace variables that match the container's environment variables. Variables can instead (or in addition to) be replaced in files sync'ed from `/plugins`, `/mods`, and `/config` by setting `REPLACE_ENV_DURING_SYNC` to `true` (defaults to `false`). If you set the enviroment variable `REPLACE_ENV_VARIABLES` to `TRUE` the startup script
will go thru all files inside your `/data` volume and replace variables that match your
defined environment variables. Variables that you want to replace need to be wrapped
inside `${YOUR_VARIABLE}` curly brackets and prefixed with a dollar sign. This is the regular
syntax for enviromment variables inside strings or config files.
Variables that you want to replace need to be declared inside curly brackets and prefixed with a dollar sign, such as `${CFG_YOUR_VARIABLE}`, which is same as many scripting languages. Optionally you can also define a prefix to only match predefined environment variables.
You can also change `REPLACE_ENV_VARIABLE_PREFIX`, which defaults to "CFG_", to limit which environment variables are allowed to be used. For example, with "CFG_" as the prefix, the variable `${CFG_DB_HOST}` would be subsituted, but not `${DB_HOST}`. `ENV_VARIABLE_PREFIX="CFG_"` <-- this is the default prefix
If you want to use a file for value (like when use secrets) you can add suffix `_FILE` to your variable name. If you want use file for value (like when use secrets) you can add suffix `_FILE` to your variable name (in run command).
There are some limitations to what characters you can use.
| Type | Allowed Characters |
| ----- | ------------------- |
| Name | `0-9a-zA-Z_-` |
| Value | `0-9a-zA-Z_-:/=?.+` |
Variables will be replaced in files with the following extensions: Variables will be replaced in files with the following extensions:
`.yml`, `.yaml`, `.txt`, `.cfg`, `.conf`, `.properties`. `.yml`, `.yaml`, `.txt`, `.cfg`, `.conf`, `.properties`.
@@ -1135,6 +1157,14 @@ services:
CFG_DB_HOST: "http://localhost:3306" CFG_DB_HOST: "http://localhost:3306"
CFG_DB_NAME: "minecraft" CFG_DB_NAME: "minecraft"
CFG_DB_PASSWORD_FILE: "/run/secrets/db_password" CFG_DB_PASSWORD_FILE: "/run/secrets/db_password"
restart: always
rcon:
image: itzg/rcon
ports:
- "4326:4326"
- "4327:4327"
volumes:
- "rcon:/opt/rcon-web-admin/db"
volumes: volumes:
mc: mc:
@@ -1145,47 +1175,9 @@ secrets:
file: ./db_password file: ./db_password
``` ```
### Patching existing files The content of `db_password`:
JSON path based patches can be applied to one or more existing files by setting the variable `PATCH_DEFINITIONS` to the path of a directory that contains one or more [patch definition json files](https://github.com/itzg/mc-image-helper#patchdefinition) or a [patch set json file](https://github.com/itzg/mc-image-helper#patchset). ug23u3bg39o-ogADSs
Variable placeholders in the patch values can be restricted by setting `REPLACE_ENV_VARIABLE_PREFIX`, which defaults to "CFG_".
The following example shows a patch-set file were various fields in the `paper.yaml` configuration file can be modified and added:
```json
{
"patches": [
{
"file": "/data/paper.yml",
"ops": [
{
"$set": {
"path": "$.verbose",
"value": true
}
},
{
"$set": {
"path": "$.settings['velocity-support'].enabled",
"value": "${CFG_VELOCITY_ENABLED}",
"value-type": "bool"
}
},
{
"$put": {
"path": "$.settings",
"key": "my-test-setting",
"value": "testing"
}
}
]
}
]
}
```
> **NOTES:** Only JSON and Yaml files can be patched at this time. TOML support is planned to be added next. Removal of comments and other cosmetic changes will occur when patched files are processed.
### Running with a custom server JAR ### Running with a custom server JAR

View File

@@ -1,15 +0,0 @@
#!/bin/bash
: "${CONSOLE_IN_NAMED_PIPE:=/tmp/minecraft-console-in}"
if [ $# = 0 ]; then
echo "ERROR: pass console commands as arguments"
exit 1
fi
if [ ! -p "${CONSOLE_IN_NAMED_PIPE}" ]; then
echo "ERROR: named pipe ${CONSOLE_IN_NAMED_PIPE} is missing"
exit 1
fi
echo "$@" > "${CONSOLE_IN_NAMED_PIPE:-/tmp/minecraft-console-in}"

View File

@@ -12,10 +12,7 @@ services:
ENABLE_AUTOPAUSE: "TRUE" ENABLE_AUTOPAUSE: "TRUE"
OVERRIDE_SERVER_PROPERTIES: "TRUE" OVERRIDE_SERVER_PROPERTIES: "TRUE"
MAX_TICK_TIME: "-1" MAX_TICK_TIME: "-1"
# More aggressive settings for demo purposes restart: always
AUTOPAUSE_TIMEOUT_INIT: "30"
AUTOPAUSE_TIMEOUT_EST: "10"
restart: unless-stopped
volumes: volumes:
mc: {} mc: {}

0
files/autopause/autopause-daemon.sh Executable file → Normal file
View File

29
files/autopause/autopause-fcns.sh Executable file → Normal file
View File

@@ -5,27 +5,38 @@ current_uptime() {
} }
java_running() { java_running() {
[[ $( ps -a -o stat,comm | grep 'java' | awk '{ print $1 }') =~ ^S.*$ ]] [[ $( ps -ax -o stat,comm | grep 'java' | awk '{ print $1 }') =~ ^S.*$ ]]
} }
java_process_exists() { java_process_exists() {
[[ -n "$(ps -a -o comm | grep 'java')" ]] [[ -n "$(ps -ax -o comm | grep 'java')" ]]
} }
rcon_client_exists() { rcon_client_exists() {
[[ -n "$(ps -a -o comm | grep 'rcon-cli')" ]] [[ -n "$(ps -ax -o comm | grep 'rcon-cli')" ]]
} }
mc_server_listening() { mc_server_listening() {
mc-monitor status --host localhost --port $SERVER_PORT --timeout 10s >& /dev/null [[ -n $(netstat -tln | grep -e "0.0.0.0:$SERVER_PORT" -e ":::$SERVER_PORT" | grep LISTEN) ]]
} }
java_clients_connected() { java_clients_connected() {
local connections local connections
if java_running ; then connections=$(netstat -tn | grep ":$SERVER_PORT" | grep ESTABLISHED)
connections=$(mc-monitor status --host localhost --port $SERVER_PORT --show-player-count) if [[ -z "$connections" ]] ; then
else return 1
connections=0
fi fi
(( $connections > 0 )) IFS=$'\n'
connections=($connections)
unset IFS
# check that at least one external address is not localhost
# remember, that the host network mode does not work with autopause because of the knockd utility
for (( i=0; i<${#connections[@]}; i++ ))
do
if [[ ! $(echo "${connections[$i]}" | awk '{print $5}') =~ ^localhost$|^127(?:\.[0-9]+){0,2}\.[0-9]+$|^(?:0*\:)*?:?0*1$ ]] ; then
# not localhost
return 0
fi
done
return 1
} }

View File

@@ -3,13 +3,10 @@
[unpauseMCServer-server] [unpauseMCServer-server]
sequence = 25565 sequence = 25565
seq_timeout = 1 seq_timeout = 1
command = /sbin/su-exec minecraft:minecraft /autopause/resume.sh command = /usr/sbin/gosu minecraft:minecraft /autopause/resume.sh
tcpflags = syn tcpflags = syn
[unpauseMCServer-rcon] [unpauseMCServer-rcon]
sequence = 25575 sequence = 25575
seq_timeout = 1 seq_timeout = 1
command = /sbin/su-exec minecraft:minecraft /autopause/resume.sh
tcpflags = syn
[unpauseMCServer-bedrock]
sequence = 19132:udp
command = /usr/sbin/gosu minecraft:minecraft /autopause/resume.sh command = /usr/sbin/gosu minecraft:minecraft /autopause/resume.sh
tcpflags = syn

View File

@@ -2,7 +2,7 @@
. /start-utils . /start-utils
if [[ $( ps -a -o stat,comm | grep 'java' | awk '{ print $1 }') =~ ^S.*$ ]] ; then if [[ $( ps -ax -o stat,comm | grep 'java' | awk '{ print $1 }') =~ ^S.*$ ]] ; then
# save world # save world
rcon-cli save-all >/dev/null rcon-cli save-all >/dev/null

View File

@@ -2,7 +2,7 @@
. /start-utils . /start-utils
if [[ $( ps -a -o stat,comm | grep 'java' | awk '{ print $1 }') =~ ^T.*$ ]] ; then if [[ $( ps -ax -o stat,comm | grep 'java' | awk '{ print $1 }') =~ ^T.*$ ]] ; then
logAutopauseAction "Knocked, resuming Java process" logAutopauseAction "Knocked, resuming Java process"
pkill -CONT java pkill -CONT java
fi fi

1
bin/mc-health → health.sh Executable file → Normal file
View File

@@ -1,6 +1,5 @@
#!/bin/bash #!/bin/bash
# shellcheck source=../start-utils
. ${SCRIPTS:-/}start-utils . ${SCRIPTS:-/}start-utils
if isTrue "${DISABLE_HEALTHCHECK}"; then if isTrue "${DISABLE_HEALTHCHECK}"; then

2
start Executable file → Normal file
View File

@@ -40,7 +40,7 @@ if ! isTrue "${SKIP_SUDO:-false}" && [ $(id -u) = 0 ]; then
echo 'hosts: files dns' > /etc/nsswitch.conf echo 'hosts: files dns' > /etc/nsswitch.conf
fi fi
exec su-exec ${runAsUser}:${runAsGroup} ${SCRIPTS:-/}start-configuration $@ exec gosu ${runAsUser}:${runAsGroup} ${SCRIPTS:-/}start-configuration $@
else else
exec ${SCRIPTS:-/}start-configuration $@ exec ${SCRIPTS:-/}start-configuration $@
fi fi

53
start-configuration Executable file → Normal file
View File

@@ -2,17 +2,14 @@
set -euo pipefail set -euo pipefail
IFS=$'\n\t' IFS=$'\n\t'
# shellcheck source=start-utils
. ${SCRIPTS:-/}start-utils . ${SCRIPTS:-/}start-utils
: "${EULA:=}" : ${EULA:=}
: "${PROXY:=}" : ${PROXY:=}
: "${RCON_PASSWORD_FILE:=}" : ${RCON_PASSWORD_FILE:=}
shopt -s nullglob shopt -s nullglob
isDebugging && set -x
#umask 002 #umask 002
export HOME=/data export HOME=/data
@@ -59,23 +56,17 @@ fi
if ! which java > /dev/null; then if ! which java > /dev/null; then
log "Fixing PATH to include java" log "Fixing PATH to include java"
PATH="${PATH}:/usr/bin" PATH="${PATH}:/opt/java/openjdk/bin"
fi fi
export VERSIONS_JSON=https://launchermeta.mojang.com/mc/game/version_manifest.json export VERSIONS_JSON=https://launchermeta.mojang.com/mc/game/version_manifest.json
case "X$VERSION" in case "X$VERSION" in
X|XLATEST|Xlatest) X|XLATEST|Xlatest)
if ! VANILLA_VERSION=$(get --json-path '$.latest.release' "$VERSIONS_JSON"); then VANILLA_VERSION=$(curl -fsSL $VERSIONS_JSON | jq -r '.latest.release')
log "ERROR: version lookup failed: $VANILLA_VERSION"
exit 1
fi
;; ;;
XSNAPSHOT|Xsnapshot) XSNAPSHOT|Xsnapshot)
if ! VANILLA_VERSION=$(get --json-path '$.latest.snapshot' "$VERSIONS_JSON"); then VANILLA_VERSION=$(curl -fsSL $VERSIONS_JSON | jq -r '.latest.snapshot')
log "ERROR: version lookup failed: $VANILLA_VERSION"
exit 1
fi
;; ;;
*) *)
VANILLA_VERSION=$VERSION VANILLA_VERSION=$VERSION
@@ -102,7 +93,19 @@ case "${TYPE^^}" in
exec ${SCRIPTS:-/}start-deployPaper "$@" exec ${SCRIPTS:-/}start-deployPaper "$@"
;; ;;
TUINITY)
exec ${SCRIPTS:-/}start-deployTuinity "$@"
;;
FORGE) FORGE)
if versionLessThan 1.17; then
log "**********************************************************************"
log "WARNING: The image tag itzg/minecraft-server:java8 is recommended"
log " since some mods require Java 8"
log " Exception traces reporting ClassCastException: class jdk.internal.loader.ClassLoaders\$AppClassLoader"
log " can be fixed with java8"
log "**********************************************************************"
fi
exec ${SCRIPTS:-/}start-deployForge "$@" exec ${SCRIPTS:-/}start-deployForge "$@"
;; ;;
@@ -110,12 +113,22 @@ case "${TYPE^^}" in
exec ${SCRIPTS:-/}start-deployFabric "$@" exec ${SCRIPTS:-/}start-deployFabric "$@"
;; ;;
FTBA)
exec ${SCRIPTS:-/}start-deployFTBA "$@"
;;
FTB|CURSEFORGE) FTB|CURSEFORGE)
log "**********************************************************************"
log "WARNING: The image tag itzg/minecraft-server:java8 is recommended"
log " since some mods require Java 8"
log " Exception traces reporting ClassCastException: class jdk.internal.loader.ClassLoaders\$AppClassLoader"
log " can be fixed with java8"
log "**********************************************************************"
exec ${SCRIPTS:-/}start-deployCF "$@" exec ${SCRIPTS:-/}start-deployCF "$@"
;; ;;
VANILLA) VANILLA)
exec "${SCRIPTS:-/}start-deployVanilla" "$@" exec ${SCRIPTS:-/}start-deployVanilla "$@"
;; ;;
SPONGEVANILLA) SPONGEVANILLA)
@@ -146,6 +159,10 @@ case "${TYPE^^}" in
exec ${SCRIPTS:-/}start-deployPurpur "$@" exec ${SCRIPTS:-/}start-deployPurpur "$@"
;; ;;
YATOPIA)
exec ${SCRIPTS:-/}start-deployYatopia "$@"
;;
AIRPLANE) AIRPLANE)
exec ${SCRIPTS:-/}start-deployAirplane "$@" exec ${SCRIPTS:-/}start-deployAirplane "$@"
;; ;;
@@ -161,8 +178,8 @@ case "${TYPE^^}" in
*) *)
log "Invalid type: '$TYPE'" log "Invalid type: '$TYPE'"
log "Must be: VANILLA, FORGE, BUKKIT, SPIGOT, PAPER, FTBA (multiarch-only)," log "Must be: VANILLA, FORGE, BUKKIT, SPIGOT, PAPER, FTBA (multiarch-only),"
log " CURSE_INSTANCE, CURSEFORGE, SPONGEVANILLA, PURPUR, CUSTOM," log " CURSE_INSTANCE, CURSEFORGE, SPONGEVANILLA, TUINITY, PURPUR"
log " MAGMA, MOHIST, CATSERVER, AIRPLANE, CANYON, LIMBO" log " CUSTOM, MAGMA, MOHIST, CATSERVER, YATOPIA, AIRPLANE, CANYON, LIMBO"
exit 1 exit 1
;; ;;

0
start-deployAirplane Executable file → Normal file
View File

0
start-deployBukkitSpigot Executable file → Normal file
View File

7
start-deployCF Executable file → Normal file
View File

@@ -84,8 +84,6 @@ if ! isTrue ${USE_MODPACK_START_SCRIPT:-true}; then
exit 2 exit 2
fi fi
forgeInstallerJar=$(ls -t "${forgeInstallerJar}" | head -1)
log "Installing forge server" log "Installing forge server"
dirOfInstaller=$(dirname "${forgeInstallerJar}") dirOfInstaller=$(dirname "${forgeInstallerJar}")
(cd "${dirOfInstaller}"; java -jar $(basename "${forgeInstallerJar}") --installServer) (cd "${dirOfInstaller}"; java -jar $(basename "${forgeInstallerJar}") --installServer)
@@ -103,7 +101,7 @@ if ! isTrue ${USE_MODPACK_START_SCRIPT:-true}; then
export FTB_DIR=$(dirname "${SERVER}") export FTB_DIR=$(dirname "${SERVER}")
exec ${SCRIPTS:-/}start-setupWorld $@ exec ${SCRIPTS:-/}start-finalSetupWorld $@
fi fi
entryScriptExpr=" entryScriptExpr="
@@ -238,4 +236,5 @@ elif [ -e "${FTB_DIR}/Install.sh" ]; then
popd popd
fi fi
exec ${SCRIPTS:-/}start-setupWorld $@ # Continue to Final Setup
exec ${SCRIPTS:-/}start-finalSetupWorld $@

0
start-deployCanyon Executable file → Normal file
View File

2
start-deployCatserver Executable file → Normal file
View File

@@ -29,4 +29,4 @@ fi
export SKIP_LOG4J_CONFIG=true export SKIP_LOG4J_CONFIG=true
# Continue to Final Setup # Continue to Final Setup
exec ${SCRIPTS:-/}start-setupWorld "$@" exec ${SCRIPTS:-/}start-finalSetupWorld "$@"

3
start-deployCustom Executable file → Normal file
View File

@@ -32,4 +32,5 @@ fi
export SKIP_LOG4J_CONFIG=true export SKIP_LOG4J_CONFIG=true
exec ${SCRIPTS:-/}start-setupWorld $@ # Continue to Final Setup
exec ${SCRIPTS:-/}start-finalSetupWorld $@

3
start-deployFTBA Executable file → Normal file
View File

@@ -79,4 +79,5 @@ if ! [ -v SERVER ]; then
exit 2 exit 2
fi fi
exec ${SCRIPTS:-/}start-setupWorld $@ # Continue to Final Setup
exec ${SCRIPTS:-/}start-finalSetupWorld $@

8
start-deployFabric Executable file → Normal file
View File

@@ -1,7 +1,6 @@
#!/bin/bash #!/bin/bash
set -eu set -eu
# shellcheck source=start-utils
. ${SCRIPTS:-/}start-utils . ${SCRIPTS:-/}start-utils
requireVar VANILLA_VERSION requireVar VANILLA_VERSION
@@ -33,7 +32,7 @@ if [[ ! -e ${SERVER} ]]; then
if [[ ! -e $FABRIC_INSTALLER ]]; then if [[ ! -e $FABRIC_INSTALLER ]]; then
log "Downloading $FABRIC_INSTALLER_URL ..." log "Downloading $FABRIC_INSTALLER_URL ..."
if ! get -o "$FABRIC_INSTALLER" "$FABRIC_INSTALLER_URL"; then if ! curl -o $FABRIC_INSTALLER -fsSL $FABRIC_INSTALLER_URL; then
log "Failed to download from given location $FABRIC_INSTALLER_URL" log "Failed to download from given location $FABRIC_INSTALLER_URL"
exit 2 exit 2
fi fi
@@ -58,7 +57,8 @@ if [[ ! -e ${SERVER} ]]; then
exit 10 exit 10
fi fi
mv fabric-server-launch.jar "${SERVER}" mv fabric-server-launch.jar ${SERVER}
fi fi
exec ${SCRIPTS:-/}start-setupWorld "$@" # Continue to Final Setup
exec ${SCRIPTS:-/}start-finalSetupWorld $@

159
start-deployForge Executable file → Normal file
View File

@@ -4,36 +4,82 @@
: ${FORGEVERSION:=RECOMMENDED} : ${FORGEVERSION:=RECOMMENDED}
isDebugging && set -x isDebugging && set -x
get_installer() { if [[ -z $FORGE_INSTALLER && -z $FORGE_INSTALLER_URL ]]; then
if [[ -z $FORGE_INSTALLER_URL ]]; then norm=$VANILLA_VERSION
log "Downloading $normForgeVersion"
forgeFileNames=" case $VANILLA_VERSION in
$normForgeVersion/forge-$normForgeVersion-installer.jar *.*.*)
$shortForgeVersion/forge-$shortForgeVersion-installer.jar norm=$VANILLA_VERSION ;;
" *.*)
norm=${VANILLA_VERSION}.0 ;;
esac
for fn in $forgeFileNames; do #################################################################################
downloadUrl=https://maven.minecraftforge.net/net/minecraftforge/forge/$fn
log "...trying $downloadUrl" log "Checking Forge version information."
if curl -o $FORGE_INSTALLER -fsSL $downloadUrl; then case $FORGEVERSION in
return RECOMMENDED)
curl -fsSL -o /tmp/forge.json http://files.minecraftforge.net/maven/net/minecraftforge/forge/promotions_slim.json
FORGE_VERSION=$(cat /tmp/forge.json | jq -r ".promos[\"$VANILLA_VERSION-recommended\"]")
if [ $FORGE_VERSION = null ]; then
FORGE_VERSION=$(cat /tmp/forge.json | jq -r ".promos[\"$VANILLA_VERSION-latest\"]")
if [ $FORGE_VERSION = null ]; then
log "ERROR: Version $VANILLA_VERSION is not supported by Forge"
log " Refer to http://files.minecraftforge.net/ for supported versions"
exit 2
fi
fi fi
done ;;
log "Unable to locate usable URL for $normForgeVersion"
exit 2
else
log "Downloading $FORGE_INSTALLER_URL ..."
if ! curl -o $FORGE_INSTALLER -fsSL $FORGE_INSTALLER_URL; then
log "Failed to download from given location $FORGE_INSTALLER_URL"
exit 2
fi
fi
}
install() { *)
FORGE_VERSION=$FORGEVERSION
;;
esac
normForgeVersion=$VANILLA_VERSION-$FORGE_VERSION-$norm
shortForgeVersion=$VANILLA_VERSION-$FORGE_VERSION
FORGE_INSTALLER="/tmp/forge-$shortForgeVersion-installer.jar"
elif [[ -z $FORGE_INSTALLER ]]; then
FORGE_INSTALLER="/tmp/forge-installer.jar"
elif [[ ! -e $FORGE_INSTALLER ]]; then
log "ERROR: the given Forge installer doesn't exist : $FORGE_INSTALLER"
exit 2
else
shortForgeVersion=$VANILLA_VERSION-${FORGE_INSTALLER_CUSTOM_VERSION:-custom}
fi
installMarker="/data/.forge-installed-$shortForgeVersion"
if [ ! -e $installMarker ]; then
if [ ! -e $FORGE_INSTALLER ]; then if [ ! -e $FORGE_INSTALLER ]; then
get_installer $normForgeVersion $shortForgeVersion
if [[ -z $FORGE_INSTALLER_URL ]]; then
log "Downloading $normForgeVersion"
forgeFileNames="
$normForgeVersion/forge-$normForgeVersion-installer.jar
$shortForgeVersion/forge-$shortForgeVersion-installer.jar
END
"
for fn in $forgeFileNames; do
if [ $fn == END ]; then
log "Unable to compute URL for $normForgeVersion"
exit 2
fi
downloadUrl=https://maven.minecraftforge.net/net/minecraftforge/forge/$fn
log "...trying $downloadUrl"
if curl -o $FORGE_INSTALLER -fsSL $downloadUrl; then
break
fi
done
else
log "Downloading $FORGE_INSTALLER_URL ..."
if ! curl -o $FORGE_INSTALLER -fsSL $FORGE_INSTALLER_URL; then
log "Failed to download from given location $FORGE_INSTALLER_URL"
exit 2
fi
fi
fi fi
log "Installing Forge $shortForgeVersion using $FORGE_INSTALLER" log "Installing Forge $shortForgeVersion using $FORGE_INSTALLER"
@@ -67,69 +113,10 @@ install() {
export SERVER=$latest export SERVER=$latest
log "Using server $SERVER" log "Using server $SERVER"
echo $SERVER > $installMarker echo $SERVER > $installMarker
}
resolve_versions() {
if [[ -z $FORGE_INSTALLER && -z $FORGE_INSTALLER_URL ]]; then
norm=$VANILLA_VERSION
case $VANILLA_VERSION in
*.*.*)
norm=$VANILLA_VERSION ;;
*.*)
norm=${VANILLA_VERSION}.0 ;;
esac
#################################################################################
log "Checking Forge version information."
case $FORGEVERSION in
RECOMMENDED)
curl -fsSL -o /tmp/forge.json http://files.minecraftforge.net/maven/net/minecraftforge/forge/promotions_slim.json
FORGE_VERSION=$(cat /tmp/forge.json | jq -r ".promos[\"$VANILLA_VERSION-recommended\"]")
if [ $FORGE_VERSION = null ]; then
FORGE_VERSION=$(cat /tmp/forge.json | jq -r ".promos[\"$VANILLA_VERSION-latest\"]")
if [ $FORGE_VERSION = null ]; then
log "ERROR: Version $VANILLA_VERSION is not supported by Forge"
log " Refer to http://files.minecraftforge.net/ for supported versions"
exit 2
fi
fi
;;
*)
FORGE_VERSION=$FORGEVERSION
;;
esac
normForgeVersion=$VANILLA_VERSION-$FORGE_VERSION-$norm
shortForgeVersion=$VANILLA_VERSION-$FORGE_VERSION
FORGE_INSTALLER="/tmp/forge-$shortForgeVersion-installer.jar"
elif [[ -z $FORGE_INSTALLER ]]; then
FORGE_INSTALLER="/tmp/forge-installer.jar"
elif [[ ! -e $FORGE_INSTALLER ]]; then
log "ERROR: the given Forge installer doesn't exist : $FORGE_INSTALLER"
exit 2
else
shortForgeVersion=$VANILLA_VERSION-${FORGE_INSTALLER_CUSTOM_VERSION:-custom}
fi
}
### main
resolve_versions
installMarker="/data/.forge-installed-$shortForgeVersion"
if [ ! -e $installMarker ]; then
install
else else
export SERVER=$(cat $installMarker) export SERVER=$(cat $installMarker)
if [ ! -e "$SERVER" ] && versionLessThan 1.17; then
rm "$installMarker"
install
fi
fi fi
exec ${SCRIPTS:-/}start-setupWorld $@ # Continue to Final Setup
exec ${SCRIPTS:-/}start-finalSetupWorld $@

3
start-deployLimbo Executable file → Normal file
View File

@@ -60,4 +60,5 @@ export LEVEL
export SKIP_LOG4J_CONFIG=true export SKIP_LOG4J_CONFIG=true
exec ${SCRIPTS:-/}start-setupWorld $@ # Continue to Final Setup
exec ${SCRIPTS:-/}start-finalSetupWorld $@

3
start-deployMagma Executable file → Normal file
View File

@@ -89,4 +89,5 @@ else
fi fi
fi fi
exec ${SCRIPTS:-/}start-setupWorld $@ # Continue to Final Setup
exec ${SCRIPTS:-/}start-finalSetupWorld $@

3
start-deployMohist Executable file → Normal file
View File

@@ -40,4 +40,5 @@ fi
export SKIP_LOG4J_CONFIG=true export SKIP_LOG4J_CONFIG=true
exec ${SCRIPTS:-/}start-setupWorld "$@" # Continue to Final Setup
exec ${SCRIPTS:-/}start-finalSetupWorld "$@"

0
start-deployPaper Executable file → Normal file
View File

3
start-deploySpongeVanilla Executable file → Normal file
View File

@@ -37,4 +37,5 @@ if [ ! -e $SERVER ] || [ -n "$FORCE_REDOWNLOAD" ]; then
curl -sSL -o $SERVER https://repo.spongepowered.org/maven/org/spongepowered/$TYPE/$SPONGEVERSION/$SERVER curl -sSL -o $SERVER https://repo.spongepowered.org/maven/org/spongepowered/$TYPE/$SPONGEVERSION/$SERVER
fi fi
exec ${SCRIPTS:-/}start-setupWorld $@ # Continue to Final Setup
exec ${SCRIPTS:-/}start-finalSetupWorld $@

26
start-deployTuinity Normal file
View File

@@ -0,0 +1,26 @@
#!/bin/bash
. ${SCRIPTS:-/}start-utils
if [ "${VERSION}" != "LATEST" ]; then
log "ERROR: Tuinity server type only supports VERSION=LATEST"
exit 1
fi
: ${TUINITY_BUILD:=lastSuccessfulBuild}
export SERVER=tuinity-${VANILLA_VERSION}-${TUINITY_BUILD}.jar
if [ ! -f "$SERVER" ] || [ -n "$FORCE_REDOWNLOAD" ]; then
downloadUrl="https://ci.codemc.io/job/Spottedleaf/job/Tuinity/${TUINITY_BUILD}/artifact/tuinity-paperclip.jar"
log "Downloading Tuinity (build $TUINITY_BUILD) from $downloadUrl ..."
curl -fsSL -o "$SERVER" "$downloadUrl"
if [ ! -f "$SERVER" ]; then
log "ERROR: failed to download from $downloadUrl (status=$?)"
exit 3
fi
fi
# Normalize on Spigot for later operations
export TYPE=SPIGOT
exec ${SCRIPTS:-/}start-spiget "$@"

21
start-deployVanilla Executable file → Normal file
View File

@@ -1,39 +1,41 @@
#!/bin/bash #!/bin/bash
# shellcheck source=start-utils . ${SCRIPTS:-/}start-utils
. "${SCRIPTS:-/}start-utils"
isDebugging && set -x isDebugging && set -x
set -o pipefail set -o pipefail
export SERVER="minecraft_server.${VANILLA_VERSION// /_}.jar" export SERVER="minecraft_server.${VANILLA_VERSION// /_}.jar"
if [ ! -e "$SERVER" ] || [ -n "$FORCE_REDOWNLOAD" ]; then if [ ! -e $SERVER ] || [ -n "$FORCE_REDOWNLOAD" ]; then
log "Downloading $SERVER ..." log "Downloading $SERVER ..."
debug "Finding version manifest for $VANILLA_VERSION" debug "Finding version manifest for $VANILLA_VERSION"
versionManifestUrl=$(get 'https://launchermeta.mojang.com/mc/game/version_manifest.json' | jq --arg VANILLA_VERSION "$VANILLA_VERSION" --raw-output '[.versions[]|select(.id == $VANILLA_VERSION)][0].url') versionManifestUrl=$(curl -fsSL 'https://launchermeta.mojang.com/mc/game/version_manifest.json' | jq --arg VANILLA_VERSION "$VANILLA_VERSION" --raw-output '[.versions[]|select(.id == $VANILLA_VERSION)][0].url')
result=$? result=$?
if [ $result != 0 ]; then if [ $result != 0 ]; then
log "ERROR failed to obtain version manifest URL ($result)" log "ERROR failed to obtain version manifest URL ($result)"
exit 1 exit 1
fi fi
if [ "$versionManifestUrl" = "null" ]; then if [ $versionManifestUrl = "null" ]; then
log "ERROR couldn't find a matching manifest entry for $VANILLA_VERSION" log "ERROR couldn't find a matching manifest entry for $VANILLA_VERSION"
exit 1 exit 1
fi fi
debug "Found version manifest at $versionManifestUrl" debug "Found version manifest at $versionManifestUrl"
serverDownloadUrl=$(get --json-path '$.downloads.server.url' "${versionManifestUrl}") serverDownloadUrl=$(curl -fsSL ${versionManifestUrl} | jq --raw-output '.downloads.server.url')
result=$? result=$?
if [ $result != 0 ]; then if [ $result != 0 ]; then
log "ERROR failed to obtain version manifest from $versionManifestUrl ($result)" log "ERROR failed to obtain version manifest from $versionManifestUrl ($result)"
exit 1 exit 1
elif [ "$serverDownloadUrl" = "null" ]; then elif [ $serverDownloadUrl = null ]; then
log "ERROR version $VANILLA_VERSION does not provide a server download" log "ERROR version $VANILLA_VERSION does not provide a server download"
exit 1 exit 1
fi fi
debug "Downloading server from $serverDownloadUrl" debug "Downloading server from $serverDownloadUrl"
get -o "$SERVER" "$serverDownloadUrl" if isDebugging; then
verbose=-v
fi
curl $verbose -fsSL -o $SERVER $serverDownloadUrl
result=$? result=$?
if [ $result != 0 ]; then if [ $result != 0 ]; then
log "ERROR failed to download server from $serverDownloadUrl ($result)" log "ERROR failed to download server from $serverDownloadUrl ($result)"
@@ -43,4 +45,5 @@ fi
isDebugging && ls -l isDebugging && ls -l
exec "${SCRIPTS:-/}start-setupWorld" "$@" # Continue to Final Setup
exec ${SCRIPTS:-/}start-finalSetupWorld $@

30
start-deployYatopia Normal file
View File

@@ -0,0 +1,30 @@
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
. ${SCRIPTS:-/}start-utils
isDebugging && set -x
: ${VANILLA_VERSION:?}
: ${RELEASE:=latest}
: ${FORCE_REDOWNLOAD:=false}
requireEnum RELEASE stable latest
export SERVER="yatopia-${RELEASE}-${VANILLA_VERSION}.jar"
if [ ! -f "$SERVER" ] || isTrue "$FORCE_REDOWNLOAD"; then
downloadUrl="https://api.yatopiamc.org/v2/${RELEASE}Build/download?branch=ver/${VANILLA_VERSION}"
log "Downloading Yatopia from $downloadUrl ..."
if ! curl -fsSL -o "$SERVER" "$downloadUrl"; then
log "ERROR: failed to download from $downloadUrl (status=$?)"
exit 3
fi
fi
# Normalize on Spigot for later operations
export TYPE=SPIGOT
export SKIP_LOG4J_CONFIG=true
# Continue to Final Setup
exec ${SCRIPTS:-/}start-finalSetupWorld $@

View File

@@ -0,0 +1,51 @@
#!/bin/bash
. ${SCRIPTS:-/}start-utils
: ${ENV_VARIABLE_PREFIX:=CFG_}
if isTrue "${REPLACE_ENV_VARIABLES}"; then
log "Replacing env variables in configs that match the prefix $ENV_VARIABLE_PREFIX ..."
# File excludes
fileExcludes=
for f in ${REPLACE_ENV_VARIABLES_EXCLUDES}; do
fileExcludes="${fileExcludes} -not -name $f"
done
# Directory excludes (recursive)
dirExcludes=$(join_by " -o -path " ${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS})
if [[ $dirExcludes ]]; then
dirExcludes=" -type d ( -path ${dirExcludes} ) -prune -o"
fi
isDebugging && echo "Using find file exclusions: $fileExcludes"
isDebugging && echo "Using find directory exclusions: $dirExcludes"
for name in $(compgen -v $ENV_VARIABLE_PREFIX); do
# check if name of env variable matches the prefix
# sanity check environment variables to avoid code injections
# Read content from file environment
if [[ $name = *"_FILE" ]]; then
value=$(<${!name})
name="${name%_FILE}"
else
value=${!name}
fi
log "Replacing $name with $value ..."
value=${value//\\/\\\\}
value=${value//#/\\#}
find /data/ \
$dirExcludes \
-type f \
\( -name "*.yml" -or -name "*.yaml" -or -name "*.txt" -or -name "*.cfg" \
-or -name "*.conf" -or -name "*.properties" -or -name "*.hjson" -or -name "*.json" \) \
$fileExcludes \
-exec sed -i 's#${'"$name"'}#'"$value"'#g' {} \;
done
fi
exec ${SCRIPTS:-/}start-minecraftFinalSetup $@

2
start-setupModconfig → start-finalSetupModconfig Executable file → Normal file
View File

@@ -24,4 +24,4 @@ case "X$MODCONFIG" in
esac esac
fi fi
exec ${SCRIPTS:-/}start-setupMounts $@ exec ${SCRIPTS:-/}start-finalSetupMounts $@

27
start-setupModpack → start-finalSetupModpack Executable file → Normal file
View File

@@ -2,7 +2,6 @@
set -e -o pipefail set -e -o pipefail
# shellcheck source=start-utils
. ${SCRIPTS:-/}start-utils . ${SCRIPTS:-/}start-utils
if isDebugging; then if isDebugging; then
set -x set -x
@@ -23,7 +22,7 @@ if [[ "$MODPACK" ]]; then
if [[ "${MODPACK}" == *.zip ]]; then if [[ "${MODPACK}" == *.zip ]]; then
downloadUrl="${MODPACK}" downloadUrl="${MODPACK}"
else else
downloadUrl=$(curl -Ls -o /dev/null -w %{url_effective} $MODPACK) downloadUrl=$(curl -Ls -o /dev/null -w %{effective_url} $MODPACK)
if ! [[ $downloadUrl == *.zip ]]; then if ! [[ $downloadUrl == *.zip ]]; then
log "ERROR Invalid URL given for MODPACK: $downloadUrl resolved from $MODPACK" log "ERROR Invalid URL given for MODPACK: $downloadUrl resolved from $MODPACK"
log " Must be HTTP, HTTPS or FTP and a ZIP file" log " Must be HTTP, HTTPS or FTP and a ZIP file"
@@ -72,11 +71,25 @@ if [[ "$MODS" ]]; then
for i in ${MODS//,/ } for i in ${MODS//,/ }
do do
if isURL "$i"; then if isURL $i; then
log "Downloading mod/plugin $i ..." log "Downloading mod/plugin $i ..."
if ! get -o "${out_dir}" "$i"; then if isValidFileURL jar "$i"; then
log "ERROR: failed to download from $i into $out_dir" if ! curl -fsSL -o "${out_dir}/$(getFilenameFromUrl "${i}")" "${i}"; then
exit 2 log "ERROR: failed to download from $i into $out_dir"
exit 2
fi
else
effective_url=$(resolveEffectiveUrl "$i")
if isValidFileURL jar "${effective_url}"; then
out_file=$(getFilenameFromUrl "${effective_url}")
if ! curl -fsSL -o "${out_dir}/$out_file" "${effective_url}"; then
log "ERROR: failed to download from $i into $out_dir"
exit 2
fi
else
log "ERROR: $effective_url resolved from $i is not a valid jar URL"
exit 2
fi
fi fi
elif [[ -f "$i" && "$i" =~ .*\.jar ]]; then elif [[ -f "$i" && "$i" =~ .*\.jar ]]; then
log "Copying plugin located at $i ..." log "Copying plugin located at $i ..."
@@ -175,4 +188,4 @@ if [[ "${GENERIC_PACK}" ]]; then
fi fi
fi fi
exec ${SCRIPTS:-/}start-setupModconfig $@ exec ${SCRIPTS:-/}start-finalSetupModconfig $@

40
start-finalSetupMounts Executable file
View File

@@ -0,0 +1,40 @@
#!/bin/bash
. ${SCRIPTS:-/}start-utils
: ${PLUGINS_SYNC_UPDATE:=true}
isDebugging && set -x
if [ -d /plugins ]; then
case ${TYPE} in
SPIGOT|BUKKIT|PAPER|MAGMA)
mkdir -p /data/plugins
log "Copying plugins over..."
if isTrue ${PLUGINS_SYNC_UPDATE}; then
updateArg="--update"
fi
# Copy plugins over using rsync to allow deeply nested updates of plugins
rsync -a --out-format="update:%f:Last Modified %M" --prune-empty-dirs $updateArg /plugins /data
;;
esac
fi
# If any modules have been provided, copy them over
: ${COPY_MODS_DEST:="/data/mods"}
if [ -d /mods ]; then
log "Copying any mods over..."
mkdir -p "${COPY_MODS_DEST}"
rsync -a --out-format="update:%f:Last Modified %M" "${rsyncArgs[@]}" --prune-empty-dirs --update /mods/ "${COPY_MODS_DEST}"
fi
: ${COPY_CONFIG_DEST:="/data/config"}
if [ -d /config ]; then
log "Copying any configs from /config to ${COPY_CONFIG_DEST}"
mkdir -p "${COPY_CONFIG_DEST}"
rsync -a --out-format="update:%f:Last Modified %M" "${rsyncArgs[@]}" --prune-empty-dirs --update /config/ "${COPY_CONFIG_DEST}"
fi
exec ${SCRIPTS:-/}start-finalSetupServerProperties $@

View File

@@ -56,7 +56,7 @@ function customizeServerProps {
setServerProp "server-name" "$SERVER_NAME" setServerProp "server-name" "$SERVER_NAME"
setServerProp "server-ip" "$SERVER_IP" setServerProp "server-ip" "$SERVER_IP"
setServerProp "server-port" "$SERVER_PORT" setServerProp "server-port" "$SERVER_PORT"
setServerProp "motd" "$(echo $MOTD | mc-image-helper asciify)" setServerProp "motd" "$(echo $MOTD | java -jar /usr/share/asciify/asciify.jar)"
setServerProp "allow-nether" "$ALLOW_NETHER" setServerProp "allow-nether" "$ALLOW_NETHER"
setServerProp "announce-player-achievements" "$ANNOUNCE_PLAYER_ACHIEVEMENTS" setServerProp "announce-player-achievements" "$ANNOUNCE_PLAYER_ACHIEVEMENTS"
setServerProp "enable-command-block" "$ENABLE_COMMAND_BLOCK" setServerProp "enable-command-block" "$ENABLE_COMMAND_BLOCK"
@@ -100,7 +100,6 @@ function customizeServerProps {
setServerProp "prevent-proxy-connections" "$PREVENT_PROXY_CONNECTIONS" setServerProp "prevent-proxy-connections" "$PREVENT_PROXY_CONNECTIONS"
setServerProp "use-native-transport" "$USE_NATIVE_TRANSPORT" setServerProp "use-native-transport" "$USE_NATIVE_TRANSPORT"
setServerProp "enforce-whitelist" "$ENFORCE_WHITELIST" setServerProp "enforce-whitelist" "$ENFORCE_WHITELIST"
setServerProp "simulation-distance" "$SIMULATION_DISTANCE"
if [ -n "$DIFFICULTY" ]; then if [ -n "$DIFFICULTY" ]; then
case $DIFFICULTY in case $DIFFICULTY in
@@ -218,4 +217,4 @@ if isDebugging; then
cat "${SERVER_PROPERTIES}" cat "${SERVER_PROPERTIES}"
fi fi
exec ${SCRIPTS:-/}start-setupEnvVariables $@ exec ${SCRIPTS:-/}start-finalSetupEnvVariables $@

2
start-setupWorld → start-finalSetupWorld Executable file → Normal file
View File

@@ -71,4 +71,4 @@ if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] );
fi fi
fi fi
exec ${SCRIPTS:-/}start-setupModpack $@ exec ${SCRIPTS:-/}start-finalSetupModpack $@

33
start-finalExec → start-minecraftFinalSetup Executable file → Normal file
View File

@@ -172,32 +172,29 @@ function copyFilesForCurseForge() {
cp -f /data/eula.txt "${FTB_DIR}/" cp -f /data/eula.txt "${FTB_DIR}/"
} }
mcServerRunnerArgs=( mcServerRunnerArgs="--stop-duration ${STOP_DURATION:-60}s"
--stop-duration "${STOP_DURATION:-60}s"
--named-pipe "${CONSOLE_IN_NAMED_PIPE:-/tmp/minecraft-console-in}"
)
if [[ ${STOP_SERVER_ANNOUNCE_DELAY} ]]; then if [[ ${STOP_SERVER_ANNOUNCE_DELAY} ]]; then
mcServerRunnerArgs+=(--stop-server-announce-delay "${STOP_SERVER_ANNOUNCE_DELAY}s") mcServerRunnerArgs="${mcServerRunnerArgs} --stop-server-announce-delay ${STOP_SERVER_ANNOUNCE_DELAY}s"
fi fi
if [[ ${TYPE} == "CURSE_INSTANCE" ]]; then if [[ ${TYPE} == "CURSE_INSTANCE" ]]; then
if isTrue ${DEBUG_EXEC}; then if isTrue ${DEBUG_EXEC}; then
set -x set -x
fi fi
exec mc-server-runner "${mcServerRunnerArgs[@]}" \ exec mc-server-runner ${mcServerRunnerArgs} \
--cf-instance-file "${CURSE_INSTANCE_JSON}" \ --cf-instance-file "${CURSE_INSTANCE_JSON}" \
java $JVM_XX_OPTS $JVM_OPTS $expandedDOpts -jar _SERVERJAR_ "$@" $EXTRA_ARGS java $JVM_XX_OPTS $JVM_OPTS $expandedDOpts -jar _SERVERJAR_ "$@" $EXTRA_ARGS
elif [[ ${TYPE} == "CURSEFORGE" && "${SERVER}" ]]; then elif [[ ${TYPE} == "CURSEFORGE" && "${SERVER}" ]]; then
copyFilesForCurseForge copyFilesForCurseForge
cd "${FTB_DIR}" || (log "ERROR: can't go into ${FTB_DIR}"; exit 1) cd "${FTB_DIR}"
log "Starting CurseForge server in ${FTB_DIR}..." log "Starting CurseForge server in ${FTB_DIR}..."
if isTrue ${DEBUG_EXEC}; then if isTrue ${DEBUG_EXEC}; then
set -x set -x
fi fi
exec mc-server-runner ${bootstrapArgs} "${mcServerRunnerArgs[@]}" java $JVM_XX_OPTS $JVM_OPTS $expandedDOpts -jar $(basename "${SERVER}") "$@" $EXTRA_ARGS exec mc-server-runner ${bootstrapArgs} ${mcServerRunnerArgs} java $JVM_XX_OPTS $JVM_OPTS $expandedDOpts -jar $(basename "${SERVER}") "$@" $EXTRA_ARGS
elif [[ ${TYPE} == "CURSEFORGE" ]]; then elif [[ ${TYPE} == "CURSEFORGE" ]]; then
mcServerRunnerArgs+=(--shell bash) mcServerRunnerArgs="${mcServerRunnerArgs} --shell bash"
copyFilesForCurseForge copyFilesForCurseForge
@@ -212,13 +209,15 @@ EOF
sed -i "s/MAX_RAM=[^;]*/MAX_RAM=${MAX_MEMORY}/" "${FTB_DIR}/settings.cfg" sed -i "s/MAX_RAM=[^;]*/MAX_RAM=${MAX_MEMORY}/" "${FTB_DIR}/settings.cfg"
fi fi
cd "${FTB_DIR}" || (log "ERROR: can't go into ${FTB_DIR}"; exit 1) cd "${FTB_DIR}"
log "Running FTB ${FTB_SERVER_START} in ${FTB_DIR} ..." log "Running FTB ${FTB_SERVER_START} in ${FTB_DIR} ..."
finalArgs="${FTB_SERVER_START}" finalArgs=(
"${FTB_SERVER_START}"
)
if isTrue ${SETUP_ONLY:=false}; then if isTrue ${SETUP_ONLY:=false}; then
echo "SETUP_ONLY: ${finalArgs}" echo "SETUP_ONLY: ${finalArgs[@]}"
exit exit
fi fi
@@ -228,12 +227,12 @@ EOF
if isTrue ${EXEC_DIRECTLY:-false}; then if isTrue ${EXEC_DIRECTLY:-false}; then
"${finalArgs[@]}" "${finalArgs[@]}"
else else
exec mc-server-runner "${mcServerRunnerArgs[@]}" "${finalArgs[@]}" exec mc-server-runner ${mcServerRunnerArgs} "${finalArgs[@]}"
fi fi
elif [[ -x run.sh ]]; then elif [[ -x run.sh ]]; then
log "Using Forge supplied run.sh script..." log "Using Forge supplied run.sh script..."
echo $JVM_XX_OPTS $JVM_OPTS $expandedDOpts > user_jvm_args.txt echo $JVM_XX_OPTS $JVM_OPTS $expandedDOpts > user_jvm_args.txt
exec mc-server-runner "${mcServerRunnerArgs[@]}" --shell bash run.sh exec mc-server-runner ${mcServerRunnerArgs} --shell bash run.sh
else else
# If we have a bootstrap.txt file... feed that in to the server stdin # If we have a bootstrap.txt file... feed that in to the server stdin
if [ -f /data/bootstrap.txt ]; then if [ -f /data/bootstrap.txt ]; then
@@ -246,12 +245,12 @@ else
$JVM_XX_OPTS $JVM_XX_OPTS
$JVM_OPTS $JVM_OPTS
$expandedDOpts $expandedDOpts
-jar "$SERVER" -jar $SERVER
"$@" $EXTRA_ARGS "$@" $EXTRA_ARGS
) )
if isTrue ${SETUP_ONLY:=false}; then if isTrue ${SETUP_ONLY:=false}; then
echo "SETUP_ONLY: java ${finalArgs[*]}" echo "SETUP_ONLY: java ${finalArgs[@]}"
exit exit
fi fi
@@ -262,7 +261,7 @@ else
if isTrue ${EXEC_DIRECTLY:-false}; then if isTrue ${EXEC_DIRECTLY:-false}; then
exec java "${finalArgs[@]}" exec java "${finalArgs[@]}"
else else
exec mc-server-runner ${bootstrapArgs} "${mcServerRunnerArgs[@]}" java "${finalArgs[@]}" exec mc-server-runner ${bootstrapArgs} ${mcServerRunnerArgs} java "${finalArgs[@]}"
fi fi
fi fi

View File

@@ -1,34 +0,0 @@
#!/bin/bash
. ${SCRIPTS:-/}start-utils
set -e
: ${REPLACE_ENV_IN_PLACE:=${REPLACE_ENV_VARIABLES:-false}}
: ${REPLACE_ENV_PATHS:=/data}
: ${REPLACE_ENV_SUFFIXES:=yml,yaml,txt,cfg,conf,properties,hjson,json,tml,toml}
: ${REPLACE_ENV_VARIABLE_PREFIX:=${ENV_VARIABLE_PREFIX:-CFG_}}
: ${REPLACE_ENV_VARIABLES_EXCLUDES:=}
: ${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS:=}
: ${PATCH_DEFINITIONS:=}
: ${DEBUG:=false}
if isTrue "${REPLACE_ENV_IN_PLACE}"; then
log "Replacing env variables in ${REPLACE_ENV_PATHS} that match the prefix $REPLACE_ENV_VARIABLE_PREFIX ..."
mc-image-helper --debug=${DEBUG} interpolate \
--replace-env-file-suffixes="${REPLACE_ENV_SUFFIXES}" \
--replace-env-excludes="${REPLACE_ENV_VARIABLES_EXCLUDES}" \
--replace-env-exclude-paths="${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS}" \
--replace-env-prefix=${REPLACE_ENV_VARIABLE_PREFIX} \
"${REPLACE_ENV_PATHS[@]}"
fi
if [[ ${PATCH_DEFINITIONS} ]]; then
log "Applying patch definitions from ${PATCH_DEFINITIONS}"
mc-image-helper --debug=${DEBUG} patch \
--patch-env-prefix=${REPLACE_ENV_VARIABLE_PREFIX} \
"${PATCH_DEFINITIONS}"
fi
exec ${SCRIPTS:-/}start-finalExec $@

View File

@@ -1,69 +0,0 @@
#!/bin/bash
. ${SCRIPTS:-/}start-utils
: ${SYNC_SKIP_NEWER_IN_DESTINATION:=${PLUGINS_SYNC_UPDATE:-true}}
: ${REPLACE_ENV_DURING_SYNC:=true}
: ${REPLACE_ENV_SUFFIXES:=yml,yaml,txt,cfg,conf,properties,hjson,json,tml,toml}
: ${REPLACE_ENV_VARIABLE_PREFIX:=${ENV_VARIABLE_PREFIX:-CFG_}}
: ${REPLACE_ENV_VARIABLES_EXCLUDES:=}
: ${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS:=}
: ${DEBUG:=false}
set -e
isDebugging && set -x
if isTrue ${SYNC_SKIP_NEWER_IN_DESTINATION}; then
updateArg="--skip-newer-in-destination"
fi
if isTrue ${REPLACE_ENV_DURING_SYNC}; then
subcommand=sync-and-interpolate
else
subcommand=sync
fi
if [ -d /plugins ]; then
case ${TYPE} in
SPIGOT|BUKKIT|PAPER|MAGMA)
mkdir -p /data/plugins
log "Copying plugins over..."
mc-image-helper \
--debug=${DEBUG} ${subcommand} $updateArg \
--replace-env-file-suffixes="${REPLACE_ENV_SUFFIXES}" \
--replace-env-excludes="${REPLACE_ENV_VARIABLES_EXCLUDES}" \
--replace-env-exclude-paths="${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS}" \
--replace-env-prefix=${REPLACE_ENV_VARIABLE_PREFIX} \
/plugins /data/plugins
;;
esac
fi
# If any modules have been provided, copy them over
: ${COPY_MODS_DEST:="/data/mods"}
if [ -d /mods ]; then
log "Copying any mods over..."
mc-image-helper \
--debug=${DEBUG} ${subcommand} $updateArg \
--replace-env-file-suffixes="${REPLACE_ENV_SUFFIXES}" \
--replace-env-excludes="${REPLACE_ENV_VARIABLES_EXCLUDES}" \
--replace-env-exclude-paths="${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS}" \
--replace-env-prefix=${REPLACE_ENV_VARIABLE_PREFIX} \
/mods "${COPY_MODS_DEST}"
fi
: ${COPY_CONFIG_DEST:="/data/config"}
if [ -d /config ]; then
log "Copying any configs from /config to ${COPY_CONFIG_DEST}"
mc-image-helper \
--debug=${DEBUG} ${subcommand} $updateArg \
--replace-env-file-suffixes="${REPLACE_ENV_SUFFIXES}" \
--replace-env-excludes="${REPLACE_ENV_VARIABLES_EXCLUDES}" \
--replace-env-exclude-paths="${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS}" \
--replace-env-prefix=${REPLACE_ENV_VARIABLE_PREFIX} \
/config "${COPY_CONFIG_DEST}"
fi
exec ${SCRIPTS:-/}start-setupServerProperties $@

3
start-spiget Executable file → Normal file
View File

@@ -101,4 +101,5 @@ if [[ ${SPIGET_RESOURCES} ]]; then
done done
fi fi
exec ${SCRIPTS:-/}start-setupWorld $@ # Continue to Final Setup
exec ${SCRIPTS:-/}start-finalSetupWorld $@

8
start-utils Executable file → Normal file
View File

@@ -180,11 +180,3 @@ function removeOldMods {
find "$1" -mindepth 1 -maxdepth ${REMOVE_OLD_MODS_DEPTH:-16} -wholename "${REMOVE_OLD_MODS_INCLUDE:-*}" -not -wholename "${REMOVE_OLD_MODS_EXCLUDE:-}" -delete find "$1" -mindepth 1 -maxdepth ${REMOVE_OLD_MODS_DEPTH:-16} -wholename "${REMOVE_OLD_MODS_INCLUDE:-*}" -not -wholename "${REMOVE_OLD_MODS_EXCLUDE:-}" -delete
fi fi
} }
function get() {
local flags=()
if isTrue "${DEBUG_GET:-false}"; then
flags+=("--debug")
fi
mc-image-helper "${flags[@]}" get "$@"
}

View File

@@ -14,4 +14,5 @@ fi
log "Resolved CURSE_INSTANCE_JSON as ${CURSE_INSTANCE_JSON}" log "Resolved CURSE_INSTANCE_JSON as ${CURSE_INSTANCE_JSON}"
exec ${SCRIPTS:-/}start-setupWorld "$@" # Continue to Final Setup
exec ${SCRIPTS:-/}start-finalSetupWorld "$@"

View File

@@ -17,5 +17,4 @@ services:
- itzg/minecraft-server:latest - itzg/minecraft-server:latest
environment: environment:
EULA: "TRUE" EULA: "TRUE"
VERSION: "1.16.5"