Compare commits

..

64 Commits

Author SHA1 Message Date
Geoff Bourne
288dc1f0b3 docs: avoid overly describing server properties 2025-06-23 20:14:50 -05:00
dependabot[bot]
8c04dfd882 build(deps): bump the updates group with 2 updates (#3510) 2025-06-23 06:48:49 -05:00
fireph
d8075916e3 Add support for Modrinth projects file (#3506) 2025-06-22 08:02:13 -05:00
Geoff Bourne
1cf2783daf Updated notes diagram for docker run to compose (#3507) 2025-06-19 12:37:27 -05:00
Geoff Bourne
a5643cdeac Upgrade tools to Go 1.24.4 (#3502) 2025-06-17 07:48:07 -05:00
Geoff Bourne
12816373ea Fixed handling of results output when using custom paper URL (#3501) 2025-06-14 17:06:12 -05:00
Geoff Bourne
2eb66042ec Fix Spigot/Bukkit downloads (#3500) 2025-06-13 22:38:14 -05:00
kingcavespider1
446db809c7 Fix ARM64 Crash with Meowice flags (#3498) 2025-06-11 13:12:25 -05:00
Geoff Bourne
d09d9d753a Use allow json comments option for patching (#3494) 2025-06-10 10:49:25 -05:00
Geoff Bourne
d622dbc2a9 build: pin mc-image-helper version for Java 8 (#3491) 2025-06-05 21:09:44 -05:00
kingcavespider1
0ad97c257a Added arclight and nanolimbo types and Meowice flags (#3485) 2025-06-05 13:11:16 -05:00
Byron Collins
f84171dca2 File suffix support for CF_API_KEY (#3489) 2025-06-05 07:35:26 -05:00
Ryan Kitty
0ba63777a3 Bump mc-helper ver in dockerfile (#3488) 2025-06-03 22:17:03 -05:00
Geoff Bourne
1289fea1c6 With patching, support comments in JSON and adding to arrays (#3486) 2025-06-03 11:35:51 -05:00
Geoff Bourne
e70b9600d1 Upgrade mc-image-helper to tweak file download logic (#3469) 2025-06-02 20:59:35 -05:00
kingcavespider1
6ede7e930c Add support for youer and banner (#3484) 2025-06-02 20:45:52 -05:00
dependabot[bot]
5416cedc1f build(deps): bump docker/build-push-action from 6.17.0 to 6.18.0 in the updates group (#3483) 2025-06-02 07:11:50 -05:00
dependabot[bot]
c9a8fef25f build(deps): bump mkdocs-autorefs from 1.4.1 to 1.4.2 in /docs in the patches group (#3482) 2025-06-02 06:27:34 -05:00
Geoff Bourne
8f1d3f1e45 Upgrade SF5 example to 5.0.8 (#3481) 2025-06-01 22:25:30 -05:00
Ryan Kitty
b37383b37d Updated type list in start-configuration (#3479) 2025-06-01 18:21:29 -05:00
Ryan Kitty
c11d2a0ab2 Add Leaf support (#3470)
Co-authored-by: Geoff Bourne <itzgeoff@gmail.com>
2025-06-01 17:49:54 -05:00
Geoff Bourne
85648d5916 Remove all use of sudoers file (#3477) 2025-06-01 10:04:37 -05:00
Geoff Bourne
3616847e8e Generalize info about UID/GID (#3474) 2025-05-31 10:02:53 -05:00
Jasper
e6cd7116b6 No longer need to run knockd with sudo (#3472) 2025-05-31 09:44:30 -05:00
Geoff Bourne
67b0074a9e build: introduce stable-{variant} image tags (#3468) 2025-05-26 16:26:11 -05:00
Geoff Bourne
a8900661f2 examples: increase memory for ftba example (#3467) 2025-05-24 13:52:41 -05:00
Geoff Bourne
ae32ce0738 mohist: use https://api.mohistmc.com download API (#3464) 2025-05-24 08:24:23 -05:00
dependabot[bot]
1370f58c26 build(deps): bump mkdocs-material from 9.6.13 to 9.6.14 in /docs in the patches group (#3459) 2025-05-19 11:19:21 -05:00
dependabot[bot]
89a6e1ad88 build(deps): bump docker/build-push-action from 6.16.0 to 6.17.0 in the updates group (#3458) 2025-05-19 07:22:31 -05:00
Dragonvi1
dc97022b98 Added forceInclude for particular-reforged since it's MC 1.20.1 (#3450) 2025-05-16 17:03:26 -05:00
Geoff Bourne
190ecd3278 cf: fix missing comma in cf-exclude-include.json (#3449) 2025-05-16 12:09:29 -05:00
Dragonvi1
15016996e2 Added Beyond Depth's client mods to the cf-exclude-include.json (#3448) 2025-05-16 07:58:59 -05:00
dependabot[bot]
fd83920383 build(deps): bump mkdocs-material from 9.6.12 to 9.6.13 in /docs in the patches group (#3446) 2025-05-15 07:02:03 -05:00
Geoff Bourne
5fe65a68c3 Add to global excludes the ones needed for Craftoria (#3440) 2025-05-10 11:25:08 -05:00
XHawk87
89ffb2377a Added Ansible and MASH to deployment docs (#3439) 2025-05-08 12:57:48 -05:00
Kim
8c52b98d91 Add smithing-template-viewer to cf-exclude-include.json (#3438) 2025-05-08 07:32:50 -05:00
Fournet Enzo
9d749ab514 CF: Ignoring particular (#3437) 2025-05-05 13:54:25 -05:00
Geoff Bourne
1c0fe6ff10 Use /data/tmp for WORLD zip preparation (#3322) 2025-05-04 16:49:32 -05:00
Geoff Bourne
ae4756f5a7 Change auto_curseforge test to use CF_PAGE_URL (#3431) 2025-04-30 09:45:28 -05:00
Geoff Bourne
6cbedd8c26 Revert (for now) the feature to limit concurrent modpack file downloads (#3430) 2025-04-30 09:21:23 -05:00
Geoff Bourne
62be34bae9 Upgrade mc-image-helper to 1.41.8 (#3429) 2025-04-28 21:21:55 -05:00
dependabot[bot]
c0f1a7e1cb build(deps): bump docker/build-push-action from 6.15.0 to 6.16.0 in the updates group (#3428) 2025-04-28 08:26:17 -05:00
dependabot[bot]
06ba3c8c77 build(deps): bump mkdocs-material from 9.6.11 to 9.6.12 in /docs in the patches group (#3425) 2025-04-21 07:26:57 -05:00
Geoff Bourne
0ec908b243 Corrected build entries for Java 24 (#3421) 2025-04-18 21:44:32 -05:00
Geoff Bourne
d9615e3558 Add Java 24 image variants (#3420) 2025-04-18 21:35:24 -05:00
dependabot[bot]
dcf2f46620 build(deps): bump mkdocs-click from 0.8.1 to 0.9.0 in /docs in the patches group (#3413) 2025-04-16 20:14:59 -05:00
Geoff Bourne
8ba47ea280 deps: upgrade tools to Go 1.24.2 (#3412) 2025-04-13 08:32:45 -05:00
Geoff Bourne
21593d2e43 fabric: accept shared-fetch/netty arguments (#3411) 2025-04-12 13:46:23 -05:00
dependabot[bot]
c8a7513322 build(deps): bump mkdocs-material from 9.6.10 to 9.6.11 in /docs in the patches group (#3406) 2025-04-07 07:26:47 -05:00
Tobias
66d0605502 add resources key to docker compose jvm options (#3404) 2025-04-06 22:26:37 -05:00
Geoff Bourne
5fad540c57 Revert "Add support of CF_API_KEY_FILE environment variable" (#3402) 2025-04-05 09:13:18 -05:00
Geoff Bourne
04713222c9 docs: add a note about downloading fabric-api (#3401) 2025-04-05 08:53:06 -05:00
Maxim Liven
483cd3a1d8 Add support of CF_API_KEY_FILE environment variable (#3396) 2025-04-05 08:37:51 -05:00
Geoff Bourne
5b549c0483 build: add image info properties (#3400) 2025-04-04 20:25:19 -05:00
Geoff Bourne
c57760e4b4 docs: fix formatting for image labels list (#3399) 2025-04-04 14:57:27 -05:00
Geoff Bourne
fd3655be88 docs: added info about image labels (#3398) 2025-04-04 14:51:45 -05:00
Geoff Bourne
d6897a649e fabric: retry loader version lookup (#3394) 2025-04-02 21:15:38 -05:00
JairG
9f1a18ef34 fixed logic to not compare the VERSION number when VERSION is set to … (#3389) 2025-04-02 19:38:04 -05:00
Geoff Bourne
dedf8bc587 docs: clarify Fabric docs TYPE usage (#3387) 2025-04-01 21:11:34 -05:00
dependabot[bot]
abb33d20fb build(deps): bump the patches group in /docs with 2 updates (#3383) 2025-03-31 07:57:42 -05:00
Geoff Bourne
6b4985c38d docs: updated bmc4 example to v34.5 (#3382) 2025-03-30 18:56:44 -05:00
dependabot[bot]
16a7f7ae03 build(deps): bump the patches group in /docs with 2 updates (#3379) 2025-03-24 07:08:23 -05:00
Geoff Bourne
20db1c9eb0 docs: show example of MODRINTH_PROJECTS with version number (#3378) 2025-03-23 20:15:31 -05:00
Geoff Bourne
dac388268f Support multiple values for COPY_PLUGINS_SRC, COPY_MODS_SRC, and COPY_CONFIG_SRC (#3377) 2025-03-23 15:43:08 -05:00
69 changed files with 917 additions and 426 deletions

View File

@@ -20,8 +20,8 @@ jobs:
matrix:
# NOTE: the "latest" variant is identified in the Docker meta step's 'latest' config
variant:
- java23
- java23-graalvm
- java24
- java24-graalvm
- java21
- java21-alpine
- java21-graalvm
@@ -33,15 +33,14 @@ jobs:
- java8-graalvm-ce
- java8-openj9
- java8-jdk
- java11
include:
# JAVA 23
- variant: java23
baseImage: eclipse-temurin:23-jre
# JAVA 24
- variant: java24
baseImage: eclipse-temurin:24-jre
platforms: linux/amd64,linux/arm64
mcVersion: latest
- variant: java23-graalvm
baseImage: container-registry.oracle.com/graalvm/jdk:23-ol8
- variant: java24-graalvm
baseImage: container-registry.oracle.com/graalvm/jdk:24-ol8
platforms: linux/amd64,linux/arm64
mcVersion: latest
# JAVA 21:
@@ -75,28 +74,31 @@ jobs:
baseImage: eclipse-temurin:17-jre-alpine
platforms: linux/amd64
mcVersion: 1.20.4
# JAVA 11:
- variant: java11
baseImage: adoptopenjdk:11-jre-hotspot
platforms: linux/amd64,linux/arm/v7,linux/arm64
mcVersion: 1.16.5
# JAVA 8: NOTE: Unable to go past 8u312 because of Forge dependencies
- variant: java8
baseImage: eclipse-temurin:8u312-b07-jre-focal
platforms: linux/amd64,linux/arm/v7,linux/arm64
mcVersion: 1.12.2
# Pin version for Java 8
mcHelperVersion: 1.42.1
- variant: java8-graalvm-ce
baseImage: ghcr.io/graalvm/graalvm-ce:java8
platforms: linux/amd64
mcVersion: 1.12.2
# Pin version for Java 8
mcHelperVersion: 1.42.1
- variant: java8-jdk
baseImage: eclipse-temurin:8u312-b07-jdk-focal
platforms: linux/amd64,linux/arm64
mcVersion: 1.12.2
# Pin version for Java 8
mcHelperVersion: 1.42.1
- variant: java8-openj9
baseImage: ibm-semeru-runtimes:open-8u312-b07-jre
platforms: linux/amd64,linux/arm64
mcVersion: 1.12.2
# Pin version for Java 8
mcHelperVersion: 1.42.1
env:
IMAGE_TO_TEST: "${{ github.repository_owner }}/minecraft-server:test-${{ matrix.variant }}-${{ github.run_id }}"
HAS_IMAGE_REPO_ACCESS: ${{ secrets.DOCKER_USER != '' && secrets.DOCKER_PASSWORD != '' }}
@@ -119,16 +121,18 @@ jobs:
${{ github.repository_owner }}/minecraft-server
ghcr.io/${{ github.repository_owner }}/minecraft-server
tags: |
# For the "main" variant, it gets the tag as-is, without suffix
type=ref,event=tag,enable=${{ matrix.variant == env.MAIN_VARIANT }}
# and each variant (including main one) gets the tag with the variant suffix, such as 2023.1.1-java17
type=ref,event=tag,suffix=-${{ matrix.variant }}
# Apply the variant as a moving tag for most recent commit per variant
type=raw,value=${{ matrix.variant }},enable=${{ github.ref_name == github.event.repository.default_branch }}
# For the "main" variant, it gets the tag as-is
type=pep440,pattern={{version}},enable=${{ matrix.variant == env.MAIN_VARIANT }}
# ...and all variants (including main one) get the tag with the variant suffix, such as 2023.1.1-java17
type=pep440,pattern={{version}},suffix=-${{ matrix.variant }}
# latest tag gets a moving 'stable' image tag applied to the main variant
type=pep440,pattern=stable,enable=${{ matrix.variant == env.MAIN_VARIANT }}
# ...and qualified stable for all variants
type=pep440,pattern=stable,suffix=-${{ matrix.variant }}
# for building test/* branch images
type=ref,event=branch,suffix=-${{ matrix.variant }},enable=${{ github.ref_name != github.event.repository.default_branch }}
# latest repo tag gets a moving 'stable' image tag applied to the main variant
type=raw,value=stable,enable=${{ github.ref_type == 'tag' && matrix.variant == env.MAIN_VARIANT }}
# apply the variant as a moving tag for most recent commit per variant
type=raw,value=${{ matrix.variant }},enable=${{ github.ref_name == github.event.repository.default_branch }}
# for backward compatibility with users referencing java8-multiarch, this will set an extra label on java8
type=raw,value=java8-multiarch,enable=${{ matrix.variant == 'java8' && github.ref_name == github.event.repository.default_branch }}
# NOTE this identifies which variant will be published as "latest", which isn't
@@ -139,13 +143,13 @@ jobs:
org.opencontainers.image.authors=Geoff Bourne <itzgeoff@gmail.com>
- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v3.10.0
uses: docker/setup-buildx-action@v3.11.1
- name: Set up QEMU
uses: docker/setup-qemu-action@v3.6.0
- name: Build for test
uses: docker/build-push-action@v6.15.0
uses: docker/build-push-action@v6.18.0
with:
platforms: linux/amd64
tags: ${{ env.IMAGE_TO_TEST }}
@@ -156,6 +160,7 @@ jobs:
push: false
build-args: |
BASE_IMAGE=${{ matrix.baseImage }}
${{ matrix.mcHelperVersion && format('MC_HELPER_VERSION={0}', matrix.mcHelperVersion) }}
cache-from: type=gha,scope=${{ matrix.variant }}
# no cache-to to avoid cross-cache update from next build step
@@ -183,7 +188,7 @@ jobs:
password: ${{ github.token }}
- name: Build and push
uses: docker/build-push-action@v6.15.0
uses: docker/build-push-action@v6.18.0
if: github.actor == github.repository_owner
with:
platforms: ${{ matrix.platforms }}
@@ -207,5 +212,9 @@ jobs:
build-args: |
BASE_IMAGE=${{ matrix.baseImage }}
BUILD_FILES_REV=${{ steps.build-files-rev.outputs.REV }}
BUILDTIME=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }}
VERSION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }}
REVISION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
${{ matrix.mcHelperVersion && format('MC_HELPER_VERSION={0}', matrix.mcHelperVersion) }}
cache-from: type=gha,scope=${{ matrix.variant }}
cache-to: type=gha,mode=max,scope=${{ matrix.variant }}

View File

@@ -19,7 +19,7 @@ jobs:
steps:
- name: on-publish
if: github.event_name == 'release' && github.event.action == 'published'
uses: SethCohen/github-releases-to-discord@v1.16.2
uses: SethCohen/github-releases-to-discord@v1.19.0
with:
webhook_url: ${{ secrets.DISCORD_WEBHOOK }}
- name: on-success

View File

@@ -42,6 +42,8 @@ jobs:
baseImage: eclipse-temurin:8u312-b07-jre-focal
platforms: linux/amd64
mcVersion: 1.12.2
# Pin version for Java 8
mcHelperVersion: 1.42.1
env:
IMAGE_TO_TEST: ${{ github.repository_owner }}/minecraft-server:test-${{ matrix.variant }}-${{ github.run_id }}
runs-on: ubuntu-22.04
@@ -53,20 +55,21 @@ jobs:
fetch-depth: 0
- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v3.10.0
uses: docker/setup-buildx-action@v3.11.1
- name: Confirm multi-arch build
uses: docker/build-push-action@v6.15.0
uses: docker/build-push-action@v6.18.0
with:
platforms: ${{ matrix.platforms }}
# ensure latest base image is used
pull: true
build-args: |
BASE_IMAGE=${{ matrix.baseImage }}
${{ matrix.mcHelperVersion && format('MC_HELPER_VERSION={0}', matrix.mcHelperVersion) }}
cache-from: type=gha,scope=${{ matrix.variant }}
- name: Build for test
uses: docker/build-push-action@v6.15.0
uses: docker/build-push-action@v6.18.0
with:
# Only build single platform since loading multi-arch image into daemon fails with
# "docker exporter does not currently support exporting manifest lists"
@@ -79,6 +82,7 @@ jobs:
push: false
build-args: |
BASE_IMAGE=${{ matrix.baseImage }}
${{ matrix.mcHelperVersion && format('MC_HELPER_VERSION={0}', matrix.mcHelperVersion) }}
cache-from: type=gha,scope=${{ matrix.variant }}
- name: Run tests

View File

@@ -19,38 +19,36 @@ RUN --mount=target=/build,source=build \
RUN --mount=target=/build,source=build \
/build/run.sh setup-user
COPY --chmod=644 files/sudoers* /etc/sudoers.d
EXPOSE 25565
ARG APPS_REV=1
ARG GITHUB_BASEURL=https://github.com
ARG EASY_ADD_VERSION=0.8.9
ARG EASY_ADD_VERSION=0.8.11
ADD ${GITHUB_BASEURL}/itzg/easy-add/releases/download/${EASY_ADD_VERSION}/easy-add_${TARGETOS}_${TARGETARCH}${TARGETVARIANT} /usr/bin/easy-add
RUN chmod +x /usr/bin/easy-add
ARG RESTIFY_VERSION=1.7.7
ARG RESTIFY_VERSION=1.7.10
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--var version=${RESTIFY_VERSION} --var app=restify --file {{.app}} \
--from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
ARG RCON_CLI_VERSION=1.7.0
ARG RCON_CLI_VERSION=1.7.1
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--var version=${RCON_CLI_VERSION} --var app=rcon-cli --file {{.app}} \
--from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
ARG MC_MONITOR_VERSION=0.15.3
ARG MC_MONITOR_VERSION=0.15.6
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--var version=${MC_MONITOR_VERSION} --var app=mc-monitor --file {{.app}} \
--from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
ARG MC_SERVER_RUNNER_VERSION=1.12.6
ARG MC_SERVER_RUNNER_VERSION=1.13.1
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--var version=${MC_SERVER_RUNNER_VERSION} --var app=mc-server-runner --file {{.app}} \
--from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
ARG MC_HELPER_VERSION=1.41.2
ARG MC_HELPER_VERSION=1.45.0
ARG MC_HELPER_BASE_URL=${GITHUB_BASEURL}/itzg/mc-image-helper/releases/download/${MC_HELPER_VERSION}
# used for cache busting local copy of mc-image-helper
ARG MC_HELPER_REV=1
@@ -69,7 +67,7 @@ ENV TYPE=VANILLA VERSION=LATEST EULA="" UID=1000 GID=1000 LC_ALL=en_US.UTF-8
COPY --chmod=755 scripts/start* /
COPY --chmod=755 bin/ /usr/local/bin/
COPY --chmod=755 bin/mc-health /health.sh
COPY --chmod=644 files/* /image/
COPY --chmod=755 files/* /image/
COPY --chmod=755 files/auto /auto
RUN curl -fsSL -o /image/Log4jPatcher.jar https://github.com/CreeperHost/Log4jPatcher/releases/download/v1.0.1/Log4jPatcher-1.0.1.jar
@@ -78,3 +76,8 @@ RUN dos2unix /start* /auto/*
ENTRYPOINT [ "/start" ]
HEALTHCHECK --start-period=2m --retries=2 --interval=30s CMD mc-health
ARG BUILDTIME=local
ARG VERSION=local
ARG REVISION=local
RUN echo "buildtime=${BUILDTIME}\nversion=${VERSION}\nrevision=${REVISION}" > /etc/image.properties

View File

@@ -17,8 +17,9 @@ if [ ! -p "${CONSOLE_IN_NAMED_PIPE}" ]; then
exit 1
fi
if [ "$(id -u)" = 0 -a $UID != 0 ]; then
exec $(getSudoFromDistro) minecraft bash -c "echo '$*' > '${CONSOLE_IN_NAMED_PIPE}'"
if [[ "$(id -u)" = 0 ]] && [[ $UID != 0 ]]; then
error "Exec needs to be run with user ID $UID"
exit 2
else
echo "$@" >"${CONSOLE_IN_NAMED_PIPE}"
fi

View File

@@ -4,16 +4,18 @@ export TARGET
set -euo pipefail
os_major_version=$(awk -F'[= ."]+' '/^VERSION_ID=/{ print $2 }' /etc/os-release)
# Install and configure dnf
microdnf install dnf -y
dnf install 'dnf-command(config-manager)' -y
dnf config-manager --set-enabled ol8_codeready_builder
dnf config-manager --set-enabled ol${os_major_version}_codeready_builder
# Add EPEL repository
tee /etc/yum.repos.d/ol8-epel.repo <<EOF
[ol8_developer_EPEL]
tee /etc/yum.repos.d/ol${os_major_version}-epel.repo <<EOF
[ol${os_major_version}_developer_EPEL]
name=Oracle Linux \$releasever EPEL (\$basearch)
baseurl=https://yum.oracle.com/repo/OracleLinux/OL8/developer/EPEL/\$basearch/
baseurl=https://yum.oracle.com/repo/OracleLinux/OL${os_major_version}/developer/EPEL/\$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1

View File

@@ -24,7 +24,7 @@ _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 after setting the env var `CREATE_CONSOLE_IN_PIPE` to "true". For example, a player can be op'ed in the container `mc` with:
```shell
docker exec mc mc-send-to-console op player
docker exec --user 1000 mc mc-send-to-console op player
| |
+- container name +- Minecraft commands start here
```

View File

@@ -8,10 +8,10 @@ By default, the image declares an initial and maximum Java memory-heap limit of
- `INIT_MEMORY`: independently sets the initial heap size
- `MAX_MEMORY`: independently sets the max heap size
The values of all three are passed directly to the JVM and support format/units as `<size>[g|G|m|M|k|K]`.
The values of all three are passed directly to the JVM and support format/units as `<size>[g|G|m|M|k|K]`.
!!! example "Using docker run"
```
-e MEMORY=2G
```
@@ -23,7 +23,7 @@ The values of all three are passed directly to the JVM and support format/units
```
!!! example "Using compose file"
```
environment:
MEMORY: 2G
@@ -46,8 +46,9 @@ To let the JVM calculate the heap size from the container declared memory limit,
MEMORY: ""
JVM_XX_OPTS: "-XX:MaxRAMPercentage=75"
deploy:
limits:
memory: 4G
resources:
limits:
memory: 4G
```
!!! important
@@ -67,7 +68,7 @@ docker run ... -e JVM_OPTS="-someJVMOption someJVMOptionValue" ...
```yaml
environment:
- EULA=true
- JVM_OPTS=-someJVMOption someJVMOptionValue
- JVM_OPTS=-someJVMOption someJVMOptionValue
```
Using object syntax is recommended and more intuitive:
@@ -111,7 +112,7 @@ If needing to map to a different port, then also set the environment variable `J
!!! example
With a compose file:
```yaml
environment:
ENABLE_JMX: true
@@ -130,3 +131,13 @@ The set of flags documented there can be added using
-e USE_AIKAR_FLAGS=true
When `MEMORY` is greater than or equal to 12G, then the Aikar flags will be adjusted according to the article.
## Enable MeowIce's Flags
[MeowIce has created an updated set of JVM flags](https://github.com/MeowIce/meowice-flags?tab=readme-ov-file#why-would-i-have-to-switch-) based on Aikar's flags but with support for optimizations for Java 17 and above
The set of flags documented there can be added using
-e USE_MEOWICE_FLAGS=true
There is an optional `USE_MEOWICE_GRAALVM_FLAGS` variable to enable GraalVM specific optimizations, defaults to `TRUE` if USE_MEOWICE_GRAALVM_FLAGS is `TRUE`

View File

@@ -24,14 +24,9 @@ docker run -d -v /path/on/host:/data \
## Running as alternate user/group ID
By default, the container will switch to user ID 1000 and group ID 1000;
however, you can override those values by setting `UID` and/or `GID` as environmental entries, during the `docker run` command.
By default, the container will switch to and run the Minecraft server as user ID 1000 and group ID 1000; however, that can be changed by setting the environment variables `UID` and `GID`.
-e UID=1234
-e GID=1234
The container will also skip user switching if the `--user`/`-u` argument
is passed to `docker run`.
The startup will also skip user switching if the `--user`/`-u` argument is passed to `docker run` or `user` is set on the compose service.
## Extra Arguments

View File

@@ -246,125 +246,26 @@ By default, the server listens for RCON on port 25575 within the container. It c
### Query
Enabling this will enable the gamespy query protocol.
By default the query port will be `25565` (UDP) but can easily be changed with the `QUERY_PORT` variable.
docker run -d -e ENABLE_QUERY=true
### Max players
By default max players is 20, you can increase this with the `MAX_PLAYERS` variable.
docker run -d -e MAX_PLAYERS=50
### Max world size
This sets the maximum possible size in blocks, expressed as a radius, that the world border can obtain.
docker run -d -e MAX_WORLD_SIZE=10000
### Allow Nether
Allows players to travel to the Nether.
docker run -d -e ALLOW_NETHER=true
### Announce Player Achievements
Allows server to announce when a player gets an achievement.
docker run -d -e ANNOUNCE_PLAYER_ACHIEVEMENTS=true
### Enable Command Block
Enables command blocks
docker run -d -e ENABLE_COMMAND_BLOCK=true
### Force Gamemode
Force players to join in the default game mode.
- false - Players will join in the gamemode they left in.
- true - Players will always join in the default gamemode.
`docker run -d -e FORCE_GAMEMODE=false`
### Generate Structures
Defines whether structures (such as villages) will be generated.
- false - Structures will not be generated in new chunks.
- true - Structures will be generated in new chunks.
`docker run -d -e GENERATE_STRUCTURES=true`
### Hardcore
If set to true, players will be set to spectator mode if they die.
docker run -d -e HARDCORE=false
### Snooper
If set to false, the server will not send data to snoop.minecraft.net server.
docker run -d -e SNOOPER_ENABLED=false
### Max Build Height
The maximum height in which building is allowed.
Terrain may still naturally generate above a low height limit.
docker run -d -e MAX_BUILD_HEIGHT=256
### Max Tick Time
The maximum number of milliseconds a single tick may take before the server watchdog stops the server with the message, A single server tick took 60.00 seconds (should be max 0.05); Considering it to be crashed, server will forcibly shutdown. Once this criteria is met, it calls System.exit(1).
Setting this to -1 will disable watchdog entirely
docker run -d -e MAX_TICK_TIME=60000
### Spawn Animals
Determines if animals will be able to spawn.
docker run -d -e SPAWN_ANIMALS=true
### Spawn Monsters
Determines if monsters will be spawned.
docker run -d -e SPAWN_MONSTERS=true
### Spawn NPCs
Determines if villagers will be spawned.
docker run -d -e SPAWN_NPCS=true
### Set spawn protection
Sets the area that non-ops can not edit (0 to disable)
docker run -d -e SPAWN_PROTECTION=0
### View Distance
Sets the amount of world data the server sends the client, measured in chunks in each direction of the player (radius, not diameter).
It determines the server-side viewing distance.
docker run -d -e VIEW_DISTANCE=10
Set the environment variable `QUERY_PORT` to "true" to enable the gamespy query protocol. Map to the server property [enable-query](https://minecraft.wiki/w/Server.properties#enable-query). By default, the query port will be `25565` (UDP) but can be changed with the `QUERY_PORT` environment variable.
### Level Seed
If you want to create the Minecraft level with a specific seed, use `SEED`, such as
-e SEED=1785852800490497919
If you want to create the Minecraft level with a specific seed, set the environment variable `SEED`, which maps to the [level-seed](https://minecraft.wiki/w/Server.properties#level-seed) property.
If using a negative value for the seed, make sure to quote the value such as:
!!! example "Using docker run"
```
-e SEED="-1785852800490497919"
```
!!! example "Using compose"
```yaml
environment:
SEED: "-1785852800490497919"
```
### Game Mode
@@ -382,13 +283,6 @@ For example:
docker run -d -e MODE=creative ...
### PVP Mode
By default, servers are created with player-vs-player (PVP) mode enabled. You can disable this with the `PVP`
environment variable set to `false`, such as
docker run -d -e PVP=false ...
### Level Type and Generator Settings
By default, a standard world is generated with hills, valleys, water, etc. A different level type can
@@ -396,7 +290,7 @@ be configured by setting `LEVEL_TYPE` to [an expected type listed here](https://
For some of the level types, `GENERATOR_SETTINGS` can be used to further customize the world generation.
To configure the `GENERATOR_SEETINGS` you need to add the appropriate `GeneratorOptions` JSON configuration. In the case of a superflat world, you may omit the `flat_world_options`.
To configure the `GENERATOR_SETTINGS` you need to add the appropriate `GeneratorOptions` JSON configuration. In the case of a superflat world, you may omit the `flat_world_options`.
The layers are applied from -64 and up and are added in the order of the list
@@ -452,31 +346,24 @@ where the default is "world":
> **INFO** Refer to the [data directory](../data-directory.md) section for a visual description of where the `$LEVEL` directory is situated.
### Online mode
By default, server checks connecting players against Minecraft's account database. If you want to create an offline server or your server is not connected to the internet, you can disable the server to try connecting to minecraft.net to authenticate players with environment variable `ONLINE_MODE`, like this
docker run -d -e ONLINE_MODE=FALSE ...
### Allow flight
Allows users to use flight on your server while in Survival mode, if they have a mod that provides flight installed.
-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.
> **WARNING:** only change this value if you know what you're doing. It only needs to be changed 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:
!!! example "Using docker run"
```
docker run -d -e SERVER_PORT=25566 ...
```
!!! example "Using compose"
```yaml
environment:
SERVER_PORT: 25566
```
**however**, be sure to change your port mapping accordingly and be prepared for some features to break.
@@ -500,26 +387,41 @@ When using `docker run` from a bash shell, the entries must be quoted with the `
### Other server property mappings
| Environment Variable | Server Property |
|-----------------------------------|-----------------------------------|
| BROADCAST_CONSOLE_TO_OPS | broadcast-console-to-ops |
| BROADCAST_RCON_TO_OPS | broadcast-rcon-to-ops |
| ENABLE_STATUS | enable-status |
| ENFORCE_SECURE_PROFILE | enforce-secure-profile |
| ENTITY_BROADCAST_RANGE_PERCENTAGE | entity-broadcast-range-percentage |
| FUNCTION_PERMISSION_LEVEL | function-permission-level |
| NETWORK_COMPRESSION_THRESHOLD | network-compression-threshold |
| OP_PERMISSION_LEVEL | op-permission-level |
| PLAYER_IDLE_TIMEOUT | player-idle-timeout |
| PREVENT_PROXY_CONNECTIONS | prevent-proxy-connections |
| SIMULATION_DISTANCE | simulation-distance |
| SYNC_CHUNK_WRITES | sync-chunk-writes |
| USE_NATIVE_TRANSPORT | use-native-transport |
| HIDE_ONLINE_PLAYERS | hide-online-players |
| RESOURCE_PACK_ID | resource-pack-id |
| RESOURCE_PACK_PROMPT | resource-pack-prompt |
| MAX_CHAINED_NEIGHBOR_UPDATES | max-chained-neighbor-updates |
| LOG_IPS | log-ips |
| REGION_FILE_COMPRESSION | region-file-compression |
| BUG_REPORT_LINK | bug-report-link |
| PAUSE_WHEN_EMPTY_SECONDS | pause-when-empty-seconds |
| Environment Variable | Server Property |
|-----------------------------------|-----------------------------------------------------------------------------------------|
| ALLOW_FLIGHT | [allow-flight](https://minecraft.wiki/w/Server.properties#allow-flight) |
| ALLOW_NETHER | [allow-nether](https://minecraft.wiki/w/Server.properties#allow-nether) |
| BROADCAST_CONSOLE_TO_OPS | broadcast-console-to-ops |
| BROADCAST_RCON_TO_OPS | broadcast-rcon-to-ops |
| BUG_REPORT_LINK | bug-report-link |
| ENABLE_COMMAND_BLOCK | [enable-command-block](https://minecraft.wiki/w/Server.properties#enable-command-block) |
| ENABLE_STATUS | enable-status |
| ENFORCE_SECURE_PROFILE | enforce-secure-profile |
| ENTITY_BROADCAST_RANGE_PERCENTAGE | entity-broadcast-range-percentage |
| FORCE_GAMEMODE | [force-gamemode](https://minecraft.wiki/w/Server.properties#force-gamemode) |
| FUNCTION_PERMISSION_LEVEL | function-permission-level |
| GENERATE_STRUCTURES | [generate-structures](https://minecraft.wiki/w/Server.properties#generate-structures) |
| HARDCORE | [hardcore](https://minecraft.wiki/w/Server.properties#hardcore) |
| HIDE_ONLINE_PLAYERS | hide-online-players |
| LOG_IPS | log-ips |
| MAX_CHAINED_NEIGHBOR_UPDATES | max-chained-neighbor-updates |
| MAX_PLAYERS | [max-players](https://minecraft.wiki/w/Server.properties#max-players) |
| MAX_TICK_TIME | [max-tick-time](https://minecraft.wiki/w/Server.properties#max-tick-time) |
| MAX_WORLD_SIZE | [max-world-size](https://minecraft.wiki/w/Server.properties#max-world-size) |
| NETWORK_COMPRESSION_THRESHOLD | network-compression-threshold |
| ONLINE_MODE | [online-mode](https://minecraft.wiki/w/Server.properties#online-mode) |
| OP_PERMISSION_LEVEL | op-permission-level |
| PAUSE_WHEN_EMPTY_SECONDS | pause-when-empty-seconds |
| PLAYER_IDLE_TIMEOUT | player-idle-timeout |
| PREVENT_PROXY_CONNECTIONS | prevent-proxy-connections |
| PVP | [pvp](https://minecraft.wiki/w/Server.properties#pvp) |
| REGION_FILE_COMPRESSION | region-file-compression |
| RESOURCE_PACK_ID | resource-pack-id |
| RESOURCE_PACK_PROMPT | resource-pack-prompt |
| SERVER_NAME | [server-name](https://minecraft.wiki/w/Server.properties#server-name) |
| SIMULATION_DISTANCE | simulation-distance |
| SPAWN_MONSTERS | [spawn-monsters](https://minecraft.wiki/w/Server.properties#spawn-monsters) |
| SPAWN_PROTECTION | [spawn-protection](https://minecraft.wiki/w/Server.properties#spawn-protection) |
| SYNC_CHUNK_WRITES | sync-chunk-writes |
| USE_NATIVE_TRANSPORT | use-native-transport |
| VIEW_DISTANCE | [view-distance](https://minecraft.wiki/w/Server.properties#view-distance) |

View File

@@ -13,6 +13,17 @@
[Shulker](https://github.com/jeremylvln/Shulker) is a Kubernetes operator for managing complex and dynamic Minecraft infrastructures, including game servers and proxies. It uses the docker-minecraft-server and docker-bungeecord images under-the-hood.
## With Ansible
[Ansible](https://docs.ansible.com/ansible/latest/getting_started/introduction.html) is an open-source task automation tool built in [Python](https://www.python.org/). Ansible playbooks can be used to automate all kinds of tasks, including deploying remote Minecraft servers.
### Using the MASH playbook
[The MASH Playbook](https://github.com/mother-of-all-self-hosting/mash-playbook) is a premade playbook with the option to deploy a [wide variety of open-source services](https://github.com/mother-of-all-self-hosting/mash-playbook/blob/main/docs/supported-services.md) to your server(s), including [docker-minecraft-server](https://github.com/XHawk87/ansible-role-minecraft), making it a good option if you want all the bells and whistles alongside your Minecraft server.
- Check out the [Installation Guide](https://github.com/mother-of-all-self-hosting/mash-playbook/blob/main/docs/README.md) for the MASH playbook to get started.
- You can then enable [Minecraft](https://github.com/mother-of-all-self-hosting/mash-playbook/blob/main/docs/services/minecraft.md) in your vars.yml.
- Enable any supporting services that you might find useful, such as [user authentication](https://github.com/mother-of-all-self-hosting/mash-playbook/blob/main/docs/services/authelia.md), [remote backups](https://github.com/mother-of-all-self-hosting/mash-playbook/blob/main/docs/services/backup-borg.md), [email relay](https://github.com/mother-of-all-self-hosting/mash-playbook/blob/main/docs/services/exim-relay.md), [cron monitoring](https://github.com/mother-of-all-self-hosting/mash-playbook/blob/main/docs/services/healthchecks.md), [audio and video conferencing](https://github.com/mother-of-all-self-hosting/mash-playbook/blob/main/docs/services/jitsi.md), databases ([MariaDB](https://github.com/mother-of-all-self-hosting/mash-playbook/blob/main/docs/services/mariadb.md), [PostgresSQL](https://github.com/mother-of-all-self-hosting/mash-playbook/blob/main/docs/services/postgres.md)), [push notifications](https://github.com/mother-of-all-self-hosting/mash-playbook/blob/main/docs/services/ntfy.md), [uptime monitoring](https://github.com/mother-of-all-self-hosting/mash-playbook/blob/main/docs/services/uptime-kuma.md), [a website](https://github.com/mother-of-all-self-hosting/mash-playbook/blob/main/docs/services/wordpress.md), as well as installing any [extra files, folders, applications, services and running commands](https://github.com/mother-of-all-self-hosting/mash-playbook/blob/main/docs/services/auxiliary.md) automatically on deployment.
## On CloudFormation (AWS)
If you're looking for a simple way to deploy this to the Amazon Web Services Cloud, check out the [Minecraft Server Deployment (CloudFormation) repository](https://github.com/vatertime/minecraft-spot-pricing). This repository contains a CloudFormation template that will get you up and running in AWS in a matter of minutes. Optionally it uses Spot Pricing so the server is very cheap, and you can easily turn it off when not in use.

View File

@@ -5,3 +5,34 @@ To troubleshoot just the command-line used to start the Minecraft server, set th
To troubleshoot any issues with memory allocation reported by the JVM, set the environment variable `DEBUG_MEMORY` to `true`.
If you are experiencing any issues with the "Changing ownership of /data" step, that can be disabled by setting `SKIP_CHOWN_DATA` to `true`.
To confirm the image version that has been pulled, use the following command, replacing `itzg/minecraft-server` as needed for specific image tags:
## Image labels
```shell
docker image inspect itzg/minecraft-server -f "{{json .Config.Labels}}"
```
such as
```json
{
"org.opencontainers.image.authors": "... <...@gmail.com>",
"org.opencontainers.image.created": "2025-04-03T02:15:51.405Z",
"org.opencontainers.image.description": "Docker image that provides a Minecraft Server for Java Edition that automatically downloads selected version at startup",
"org.opencontainers.image.licenses": "Apache-2.0",
"org.opencontainers.image.ref.name": "ubuntu",
"org.opencontainers.image.revision": "d6897a649ecbc16b5fb2e1500e24b64ef80270a0",
"org.opencontainers.image.source": "https://github.com/itzg/docker-minecraft-server",
"org.opencontainers.image.title": "docker-minecraft-server",
"org.opencontainers.image.url": "https://github.com/itzg/docker-minecraft-server",
"org.opencontainers.image.version": "java21"
}
```
The labels that are most interesting are:
- `org.opencontainers.image.created` : the date/time the image was built
- `org.opencontainers.image.revision` : which maps to <https://github.com/itzg/docker-minecraft-server/commit/REVISION>
- `org.opencontainers.image.version` : image tag and variant [as described in this page](../versions/java.md)

View File

@@ -6,7 +6,7 @@ A specific file can be omitted from each reference to allow for auto-selecting t
!!! warning "CurseForge API key usage"
A CurseForge API key must be allocated and set with `CF_API_KEY` [as described here](../types-and-platforms/mod-platforms/auto-curseforge.md#api-key).
A CurseForge API key must be allocated and set with `CF_API_KEY` (or `CF_API_KEY_FILE`) [as described here](../types-and-platforms/mod-platforms/auto-curseforge.md#api-key).
## Project-file references

View File

@@ -16,7 +16,9 @@ On the left, there are sections describing some download automation options.
## Mods vs Plugins
The terms "mods" and "plugins" can be quite confusing. Generally, the rule of thumb is that "mods" are used by the types that run client side to modify rendering, add new blocks, and add behaviors server, such as [Forge](../types-and-platforms/server-types/forge.md) and [Fabric](../types-and-platforms/server-types/fabric.md). "Plugins" are used by the types that **only run on servers** to add behaviors, commands, etc such as [Paper](../types-and-platforms/server-types/paper.md) (which derives from [Bukkit/Spigot](../types-and-platforms/server-types/bukkit-spigot.md)). There are also some types that are [hybrids](../types-and-platforms/server-types/hybrids.md), such as Magma, that use both "mods" and "plugins"
The terms "mods" and "plugins" can be quite confusing. Generally, the rule of thumb is that "mods" are used by the types that run client side to modify rendering, add new blocks, and add behaviors server, such as [Forge](../types-and-platforms/server-types/forge.md) and [Fabric](../types-and-platforms/server-types/fabric.md). "Plugins" are used by the types that **only run on servers** to add behaviors, commands, etc such as [Paper](../types-and-platforms/server-types/paper.md) (which derives from [Bukkit/Spigot](../types-and-platforms/server-types/bukkit-spigot.md)). There are also some types that are [hybrids](../types-and-platforms/server-types/hybrids.md), such as Magma, that use both "mods" and "plugins".
Typically, mods needs to be installed in both the client and server; however, there are some cases when only the server needs a mod. Plugins only need to be installed in the server and are never needed in the client.
## Optional plugins, mods, and config attach points
@@ -41,8 +43,28 @@ For example: `-e REMOVE_OLD_MODS=TRUE -e REMOVE_OLD_MODS_INCLUDE="*.jar" -e REMO
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.
!!! information ""
For more flexibility with mods/plugins preparation, you can declare other directories, files, and URLs to use in [the `MODS` / `PLUGINS` variables](#modsplugins-list).
!!! information "Multiple source directories"
`COPY_PLUGINS_SRC`, `COPY_MODS_SRC`, `COPY_CONFIG_SRC` can each be set to a comma or newline delimited list of container directories to reference.
For example, in a compose file:
```yaml
environment:
# ...EULA, etc
TYPE: PAPER
# matches up to volumes declared below
COPY_PLUGINS_SRC: /plugins-common,/plugins-local
volumes:
- mc-data:/data
# For example, reference a shared directory used by several projects
- ../plugins-common:/plugins-common:ro
# and add plugins unique to this project
- ./plugins:/plugins-local:ro
```
Alternatively, you can declare other directories along with files and URLs to use in [the `MODS` / `PLUGINS` variables](#modsplugins-list).
## Zip file modpack

View File

@@ -12,15 +12,35 @@
Also, a specific version (or release type) can be declared adding a colon and then the version id, version number/name, or release type after the project slug. The version ID or number can be found in the 'Metadata' section. Valid release types are `release`, `beta`, `alpha`.
To select a datapack from a Modrinth project, prefix the entry with "datapack:". When running a vanilla server, this is optional since only datapacks will be available for vanilla servers to select.
You can also reference a file containing project entries by prefixing the **container path** path with `@`.
| Description | Example projects entry |
|---------------------------------|----------------------------|
| Select latest version | `fabric-api` |
| Select specific version | `fabric-api:PbVeub96` |
| Select latest beta version | `fabric-api:beta` |
| Latest version using project ID | `P7dR8mSH` |
| Latest version of datapack | `datapack:terralith` |
| Specific version of datapack | `datapack:terralith:2.5.5` |
| Description | Example projects entry |
|---------------------------------|-------------------------------------------------------|
| Select latest version | `fabric-api` |
| Select specific version | `fabric-api:bQZpGIz0`<br/>`fabric-api:0.119.2+1.21.4` |
| Select latest beta version | `fabric-api:beta` |
| Latest version using project ID | `P7dR8mSH` |
| Latest version of datapack | `datapack:terralith` |
| Specific version of datapack | `datapack:terralith:2.5.5` |
| Projects Listing File | `@/path/to/modrinth-mods.txt` |
!!! info "More about listing files"
Each line in the listing file is processed as one of the references above; however, blank lines and comments that start with `#` are ignored.
Make sure to place the listing file in a mounted directory/volume or declare an appropriate mount for it.
For example, `MODRINTH_PROJECTS` can be set to "@/extras/modrinth-mods.txt", assuming "/extras" has been added to `volumes` section, where the container file `/extras/modrinth-mods.txt` contains
```text
# This comment is ignored
fabric-api
# This and previous blank line are ignore
cloth-config
datapack:terralith
```
## Extra options

View File

@@ -1,7 +1,7 @@
mkdocs-material == 9.6.8
mkdocs-autorefs == 1.4.1
mkdocstrings[python] == 0.29.0
mkdocs-literate-nav == 0.6.1
mkdocs-material == 9.6.14
mkdocs-autorefs == 1.4.2
mkdocstrings[python] == 0.29.1
mkdocs-literate-nav == 0.6.2
mdx-gh-links == 0.4
mkdocs-click == 0.8.1
mkdocs-click == 0.9.0
mkdocs-static-i18n == 1.3.0

View File

@@ -32,6 +32,20 @@ To manage a CurseForge modpack automatically with upgrade support, pinned or lat
docker run --env-file=.env itzg/minecraft-server
```
Alternately you can use [docker secrets](https://docs.docker.com/compose/how-tos/use-secrets/) with a `CF_API_KEY_FILE` environment variable:
```
service:
environment:
CF_API_KEY_FILE: /run/secrets/cf_api_key
secrets:
- cf_api_key
secrets:
cf_api_key:
file: cf_api_key.secret
```
!!! note
Be sure to use the appropriate [image tag for the Java version compatible with the modpack](../../versions/java.md).

View File

@@ -12,7 +12,7 @@ Run a Bukkit/Spigot server type by setting the environment variable `TYPE` to "B
```
docker run ... -e TYPE=SPIGOT ...
```
Compose
```yaml
environment:
@@ -50,3 +50,16 @@ Canyon is on a temporary hiatus, so by default the final build from GitHub will
-e CANYON_BUILD=6
-e CANYON_BUILD=26
### Poseidon
[Poseidon](https://github.com/retromcorg/Project-Poseidon) is a fork of CraftBukkit for Minecraft Beta 1.7.3. It includes multiple enhancements whilst also retaining compatibility with old Bukkit plugins.
-e VERSION=b1.7.3 -e TYPE=CANYON
!!! important
Only `VERSION=b1.7.3` is supported. Since that version pre-dates the health check mechanism used by this image, that will need to be disabled by setting `DISABLE_HEALTHCHECK=true`.
### Uberbukkit
[Uberbukkit](https://github.com/Moresteck/uberbukkit) is a fork of CraftBukkit for Minecraft Beta with Multi version support, supports b1.0 - b1.7.3

View File

@@ -1,23 +1,57 @@
Enable [Fabric server](https://fabricmc.net/) mode by adding a `-e TYPE=FABRIC` to your command-line.
A [Fabric server](https://fabricmc.net/) can be automatically downloaded, upgraded, and run by setting the environment variable TYPE to "FABRIC"
```
docker run -d -v /path/on/host:/data \
-e TYPE=FABRIC \
-p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server
```
!!! example
Using `docker run` command line
```
docker run -d -e EULA=TRUE -e TYPE=FABRIC -p 25565:25565 itzg/minecraft-server
```
In a compose file service:
```yaml
environment:
EULA: TRUE
TYPE: FABRIC
```
By default, the container will install the latest [fabric server launcher](https://fabricmc.net/use/server/), using the latest [fabric-loader](https://fabricmc.net/wiki/documentation:fabric_loader) against the minecraft version you have defined with `VERSION` (defaulting to the latest vanilla release of the game).
A specific loader or launcher version other than the latest can be requested using `FABRIC_LOADER_VERSION` and `FABRIC_LAUNCHER_VERSION` respectively, such as:
```
docker run -d -v /path/on/host:/data ... \
-e TYPE=FABRIC \
-e FABRIC_LAUNCHER_VERSION=0.10.2 \
-e FABRIC_LOADER_VERSION=0.13.1
```
!!! example "Using launcher and loader versions"
!!! note
With docker run
```
docker run -d ... \
-e TYPE=FABRIC \
-e FABRIC_LAUNCHER_VERSION=0.10.2 \
-e FABRIC_LOADER_VERSION=0.13.1
```
In a compose file service:
```yaml
environment:
EULA: TRUE
TYPE: FABRIC
FABRIC_LAUNCHER_VERSION: 0.10.2
FABRIC_LOADER_VERSION: 0.13.1
```
!!! note "Fabric API"
As [mentioned on the Fabric download page](https://fabricmc.net/use/installer/), most mods will require the Fabric API mod to be installed. That can be easily done by utilizing [the Modrinth downloads feature](../../mods-and-plugins/modrinth.md), such as adding this to the `environment` of a compose file service:
```yaml
TYPE: FABRIC
MODRINTH_PROJECTS: |
fabric-api
```
!!! note "Alternate launcher"
If you wish to use an alternative launcher you can:

View File

@@ -49,6 +49,34 @@ By default the latest build will be used; however, a specific build number can b
-e VERSION=1.16.5 -e MOHIST_BUILD=374
### Youer
A [Youer](https://github.com/MohistMC/Youer) server can be used with
-e TYPE=YOUER
!!! note
There are limited base versions supported, so you will also need to set `VERSION`, such as "1.12.2"
By default the latest build will be used; however, a specific build number can be selected by setting `MOHIST_BUILD`, such as
-e VERSION=1.16.5 -e MOHIST_BUILD=374
### Banner
A [Banner](https://github.com/MohistMC/Banner) server can be used with
-e TYPE=BANNER
!!! note
There are limited base versions supported, so you will also need to set `VERSION`, such as "1.12.2"
By default the latest build will be used; however, a specific build number can be selected by setting `MOHIST_BUILD`, such as
-e VERSION=1.16.5 -e MOHIST_BUILD=374
### Catserver
A [Catserver](http://catserver.moe/) type server can be used with
@@ -56,3 +84,10 @@ A [Catserver](http://catserver.moe/) type server can be used with
-e TYPE=CATSERVER
> **NOTE** Catserver only provides a single release stream, so `VERSION` is ignored
### Arclight
A [Arclight](https://arclight.izzel.io/) type server can be used with
-e TYPE=ARCLIGHT
-e ARCLIGHT_TYPE=NEOFORGE,FORGE,FABRIC

View File

@@ -39,6 +39,12 @@ Configuration options with defaults:
Instead of using format codes in the MOTD, Limbo requires [JSON chat content](https://minecraft.wiki/w/Raw_JSON_text_format#Java_Edition). If a plain string is provided, which is the default, then it gets converted into the required JSON structure.
## NanoLimbo
A [NanoLimbo](https://github.com/Nan1t/NanoLimbo) server can be run by setting `TYPE` to `NANOLIMBO`.
An alternate Limbo server
## Crucible
A [Crucible](https://github.com/CrucibleMC/Crucible) server can be run by setting `TYPE` to `CRUCIBLE`.
@@ -65,4 +71,4 @@ Alternatively, the final `-jar` invocation can be replaced by setting `CUSTOM_JA
When using `docker run` make sure to quote the entire value since it has spaces in it, such as
-e CUSTOM_JAR_EXEC="-cp worldedit.jar:Carpet-Server.jar net.minecraft.server.MinecraftServer"
-e CUSTOM_JAR_EXEC="-cp worldedit.jar:Carpet-Server.jar net.minecraft.server.MinecraftServer"

View File

@@ -85,6 +85,23 @@ Extra variables:
- `USE_FLARE_FLAGS=false` : set to true to add appropriate flags for the built-in [Flare](https://blog.airplane.gg/flare) profiler
- `PURPUR_DOWNLOAD_URL=<url>` : set URL to download Purpur from custom URL.
### Leaf
A [Leaf server](https://www.leafmc.one/) is a Paper fork focused on performance improvements and low-level optimizations for smoother gameplay.
To use a Leaf server, set the environment variable `TYPE` to `"LEAF"`.
-e TYPE=LEAF
!!! note
The `VERSION` variable is used to select the Minecraft version to run.
To specify a particular Leaf build, use `LEAF_BUILD`.
By default the latest build will be used; however, a specific build number can be selected by setting `LEAF_BUILD`, such as
-e VERSION=1.21.4 -e LEAF_BUILD=441
### Folia
A [Folia server](https://papermc.io/software/folia) can be used by setting the environment variable `TYPE` to "FOLIA".

View File

@@ -1,7 +1,7 @@
!!! warning
The variables listed on this page are manually documented and may be out-of-date or inaccurate.
The variables listed on this page are manually documented and may be out-of-date or inaccurate.
All other documentation pages are actively maintained, so please use the search box above to find the desired topic.
@@ -48,7 +48,7 @@
</tr>
<tr>
<td><code>TZ</code></td>
<td>You can configure the timezone to match yours by setting the TZ environment variable.
<td>You can configure the timezone to match yours by setting the TZ environment variable.
alternatively, you can mount: <code>/etc/localtime:/etc/localtime:ro
@@ -81,6 +81,18 @@ alternatively, you can mount: <code>/etc/localtime:/etc/localtime:ro
<td><code>false</code></td>
<td>⬜️</td>
</tr>
<tr>
<td><code>USE_MEOWICE_FLAGS</code></td>
<td><a href="https://github.com/MeowIce/meowice-flags?tab=readme-ov-file#why-would-i-have-to-switch-">MeowIce has created an updated set of JVM flags</a> based on Aikar's flags but with support for optimizations for Java 17 and above</td>
<td><code>false</code></td>
<td>⬜️</td>
</tr>
<tr>
<td><code>USE_MEOWICE_GRAALVM_FLAGS</code></td>
<td>enables MeowIce's flags for GraalVM if USE_MEOWICE_GRAALVM_FLAGS is TRUE</td>
<td><code>true</code></td>
<td>⬜️</td>
</tr>
<tr>
<td><code>JVM_OPTS</code></td>
<td>General JVM options can be passed to the Minecraft Server invocation by passing a <code>JVM_OPTS</code> environment variable. The JVM requires -XX options to precede -X options, so those can be declared in <code>JVM_XX_OPTS</code>. Both variables are space-delimited, raw JVM arguments</td>
@@ -711,7 +723,7 @@ alternatively, you can mount: <code>/etc/localtime:/etc/localtime:ro
### CurseForge
!!! tip
Refer to the [main documentation page](types-and-platforms/mod-platforms/auto-curseforge.md) for more details and up-to-date information.
<table>
@@ -730,6 +742,12 @@ alternatively, you can mount: <code>/etc/localtime:/etc/localtime:ro
<td><code></code></td>
<td>✅</td>
</tr>
<tr>
<td><code>CF_API_KEY_FILE</code></td>
<td>A path to a file inside of container that contains <strong>YOUR</strong> CurseForge (Eternal) API Key.</td>
<td><code></code></td>
<td>✅</td>
</tr>
<tr>
<td><code>CF_PAGE_URL</code></td>
<td>Pass a page URL to the modpack or a specific file</td>

View File

@@ -10,26 +10,29 @@ or explicitly include the tag, such as
where `<tag>` refers to the first column of this table:
| Tag | Java version | Linux | JVM Type | Architecture |
|------------------|--------------|--------|--------------------|---------------------|
| latest | 21 | Ubuntu | Hotspot | amd64, arm64 |
| stable | 21 | Ubuntu | Hotspot | amd64, arm64 |
| java23 | 23 | Ubuntu | Hotspot | amd64, arm64 |
| java23-graalvm | 23 | Oracle | Oracle GraalVM[^1] | amd64, arm64 |
| java21 | 21 | Ubuntu | Hotspot | amd64, arm64 |
| java21-jdk | 21 | Ubuntu | Hotspot+JDK | amd64, arm64 |
| java21-alpine | 21 | Alpine | Hotspot | amd64, arm64 |
| java21-graalvm | 21 | Oracle | Oracle GraalVM[^1] | amd64, arm64 |
| java17 | 17 | Ubuntu | Hotspot | amd64, arm64, armv7 |
| java17-graalvm | 17 | Oracle | Oracle GraalVM[^1] | amd64, arm64 |
| java17-alpine | 17 | Alpine | Hotspot | amd64 (1) |
| java11 | 11 | Ubuntu | Hotspot | amd64, arm64, armv7 |
| java8 | 8 | Ubuntu | Hotspot | amd64, arm64, armv7 |
| java8-jdk | 8 | Ubuntu | Hotspot+JDK | amd64 |
| java8-openj9 | 8 | Debian | OpenJ9 | amd64 |
| java8-graalvm-ce | 8 | Oracle | GraalVM CE | amd64 |
| Tag | Java version | Linux | JVM Type | Architecture | Note |
|------------------|--------------|--------|--------------------|---------------------|------|
| latest | 21 | Ubuntu | Hotspot | amd64, arm64 | |
| stable | 21 | Ubuntu | Hotspot | amd64, arm64 | |
| java24 | 24 | Ubuntu | Hotspot | amd64, arm64 | (2) |
| java24-graalvm | 24 | Oracle | Oracle GraalVM (3) | amd64, arm64 | (2) |
| java21 | 21 | Ubuntu | Hotspot | amd64, arm64 | |
| java21-jdk | 21 | Ubuntu | Hotspot+JDK | amd64, arm64 | |
| java21-alpine | 21 | Alpine | Hotspot | amd64, arm64 | |
| java21-graalvm | 21 | Oracle | Oracle GraalVM (3) | amd64, arm64 | |
| java17 | 17 | Ubuntu | Hotspot | amd64, arm64, armv7 | |
| java17-graalvm | 17 | Oracle | Oracle GraalVM (3) | amd64, arm64 | |
| java17-alpine | 17 | Alpine | Hotspot | amd64 (1) | |
| java8 | 8 | Ubuntu | Hotspot | amd64, arm64, armv7 | |
| java8-jdk | 8 | Ubuntu | Hotspot+JDK | amd64 | |
| java8-openj9 | 8 | Debian | OpenJ9 | amd64 | |
| java8-graalvm-ce | 8 | Oracle | GraalVM CE | amd64 | |
Notes
1. Why no arm64 for Java 17 Alpine? That is because the base images, such as [elipse-temurin](https://hub.docker.com/_/eclipse-temurin/tags?page=&page_size=&ordering=&name=17-jre-alpine) do not provide support for that. Use the Ubuntu based images instead.
2. Short-term variant, subject to deprecation upon next version introduction
3. Based on the [Oracle GraalMV images](https://blogs.oracle.com/java/post/new-oracle-graalvm-container-images), which as of JDK 17, are now under the [GraalVM Free License](https://blogs.oracle.com/java/post/graalvm-free-license) incorporating what used to be known as the GraalVM Enterprise.
!!! example "Example using java8"
@@ -75,7 +78,7 @@ where `java tag` still refers to the first column of the table above and `releas
### Stable image tag
The `stable` image tag combines the benefits of `latest` and [release versions](#release-versions) since it shifts to refer to the most recently released version.
The `stable` image tag combines the benefits of `latest` and [release versions](#release-versions) since it shifts to refer to the most recently released version. There is also a per-variant stable tag, formatted as `stable-{variant}`.
## Version compatibilities
@@ -123,17 +126,17 @@ Forge also doesn't support openj9 JVM implementation.
The following image tags have been deprecated and are no longer receiving updates:
- java19
- adopt13
- adopt14
- adopt15
- openj9-nightly
- multiarch-latest
- java11
- java16/java16-openj9
- java17-graalvm-ce
- java17-openj9
- java19
- java20-graalvm, java20, java20-alpine
- java23-*
- java8-multiarch is still built and pushed, but please move to java8 instead
- java8-alpine
[^1]: Based on the [Oracle GraalMV images](https://blogs.oracle.com/java/post/new-oracle-graalvm-container-images), which as of JDK 17, are now under the [GraalVM Free License](https://blogs.oracle.com/java/post/graalvm-free-license) incorporating what used to be known as the GraalVM Enterprise.

View File

@@ -1,20 +1,20 @@
services:
mc:
image: itzg/minecraft-server
environment:
EULA: true
MODPACK_PLATFORM: MODRINTH
MODRINTH_MODPACK: https://modrinth.com/modpack/better-mc-forge-bmc4/version/v32.5
MODRINTH_EXCLUDE_FILES: |
XaeroPlus
XaerosWorldMap
MODRINTH_OVERRIDES_EXCLUSIONS: |
mods/citresewn-*.jar
**/datapacks/BE_default_endgen_fix*
MODRINTH_FORCE_SYNCHRONIZE: true
MEMORY: 4G
ports:
- "25565:25565"
# declare /data volume mapping as desired
# volumes:
# - ./data:/data
services:
mc:
image: itzg/minecraft-server
environment:
EULA: true
MODPACK_PLATFORM: MODRINTH
# NOTE: v36 doesn't startup correctly
MODRINTH_MODPACK: https://modrinth.com/modpack/better-mc-forge-bmc4/version/v34.5
MODRINTH_OVERRIDES_EXCLUSIONS: |
config/paxi/datapacks/BE_default_endgen_fix*
MODRINTH_FORCE_SYNCHRONIZE: true
MEMORY: 4G
ports:
- "25565:25565"
volumes:
- mc-data:/data
# or use a host directory binding
# - ./data:/data
volumes:
mc-data:

View File

@@ -16,19 +16,6 @@ services:
CF_API_KEY: ${CF_API_KEY}
CF_SLUG: craftoria
MEMORY: 8G
# TODO: replace with slugs and see if already excluded by cf-exclude-include.json
CF_EXCLUDE_MODS: |
737481
363363
394468
986380
844662
568563
915902
690971
455508
1089803
511319
volumes:
# Use managed volume by default, but can change to a relative path like
# ./data:/data

View File

@@ -7,6 +7,10 @@ services:
# VERSION: 1.21.4
# FABRIC_INSTALLER_VERSION: 1.0.1
# FABRIC_LOADER_VERSION: 0.16.10
# Since Fabric server type only includes the loader, most times
# the fabric-api is required for other mods to function
MODRINTH_PROJECTS: |
fabric-api
ports:
- "25565:25565"
volumes:

View File

@@ -12,6 +12,7 @@ services:
# Use Pack ID from https://www.feed-the-beast.com/modpacks/119-ftb-presents-direwolf20-120?tab=about
FTB_MODPACK_ID: "119"
# FTB_MODPACK_VERSION_ID: ""
MEMORY: 4G
volumes:
# use a named, managed volume for data volume
- data:/data

View File

@@ -1,16 +1,16 @@
services:
mc:
image: itzg/minecraft-server
container_name: paper
tty: true
stdin_open: true
environment:
EULA: "true"
TYPE: PAPER
VIEW_DISTANCE: 10
MEMORY: 2G
ports:
- "25565:25565"
volumes:
- mc-paper:/data
- mc-data:/data
restart: unless-stopped
volumes:
mc-paper: {}
mc-data: {}

View File

@@ -5,9 +5,11 @@ services:
EULA: true
# https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/
MODPACK_PLATFORM: AUTO_CURSEFORGE
# CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/skyfactory-5/files/6044634
# CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/skyfactory-5/files/6290684
CF_SLUG: skyfactory-5
CF_FILENAME_MATCHER: 5.0.2
# Comment out the following to get the latest version or pick a version from
# https://www.curseforge.com/minecraft/modpacks/skyfactory-5/files/all?page=1&pageSize=20
CF_FILENAME_MATCHER: 5.0.8
# Allocate API key from https://console.curseforge.com/
# and set in .env file making sure to double up dollar signs, such as
# CF_API_KEY=$$2a$$10$$....

View File

@@ -45,11 +45,7 @@ if isTrue "${DEBUG_AUTOPAUSE}"; then
knockdArgs+=(-D)
fi
if isTrue "${SKIP_SUDO}"; then
/usr/local/sbin/knockd "${knockdArgs[@]}"
else
sudo /usr/local/sbin/knockd "${knockdArgs[@]}"
fi
/usr/local/sbin/knockd "${knockdArgs[@]}"
if [ $? -ne 0 ] ; then
logAutopause "Failed to start knockd daemon."

View File

@@ -25,11 +25,17 @@ use_proxy() {
}
use_server_list_ping() {
if [[ "${VERSION^^}" == "LATEST" || "${VERSION^^}" == "SNAPSHOT" ]]; then
# Don't use server-list ping for unknown version
return 1
fi
if versionLessThan 1.7; then
echo "--use-server-list-ping"
fi
}
mc_server_listening() {
mc-monitor status $(use_proxy) --host "${SERVER_HOST:-localhost}" --port "$SERVER_PORT" $(use_server_list_ping) --timeout 10s >&/dev/null
}

View File

@@ -6,8 +6,5 @@ if isTrue "${DEBUG_AUTOSTOP}"; then
fi
logAutostopAction "Stopping Java process"
if isTrue "${AUTOSTOP_PKILL_USE_SUDO:-false}"; then
sudo pkill -f --signal SIGTERM mc-server-runner
else
pkill -f --signal SIGTERM mc-server-runner
fi
pkill -f --signal SIGTERM mc-server-runner

View File

@@ -11,6 +11,7 @@
"beehivetooltips",
"better-advancements",
"better-foliage",
"better-modlist-neoforge",
"better-placement",
"better-sprinting",
"better-third-person",
@@ -21,11 +22,13 @@
"block-drops-jei-addon",
"blur-forge",
"cartography",
"chattoggle",
"cherished-worlds",
"chunk-animator",
"clickable-advancements",
"compass-coords",
"configured",
"controllable",
"controlling",
"craftpresence",
"ctm",
@@ -35,6 +38,7 @@
"ding",
"drippy-loading-screen",
"dynamic-surroundings",
"dynamic-view",
"dynamiclights-reforged",
"easiervillagertrading",
"effective-forge",
@@ -42,18 +46,25 @@
"embeddium-extension",
"embeddium-extras",
"enchantment-descriptions",
"enhanced-boss-bars",
"enhancedvisuals",
"entity-collision-fps-fix",
"entity-model-features",
"entity-texture-features-fabric",
"entityculling",
"equipment-compare",
"essential-mod",
"euphoria-patches",
"extreme-sound-muffler",
"ezzoom",
"fading-night-vision",
"falling-leaves-forge",
"fancymenu",
"farsight",
"faster-ladder-climbing",
"flerovium",
"foamfix-optimization-mod",
"forgeskyboxes",
"fps-reducer",
"free-cam",
"ftb-backups-2",
@@ -61,6 +72,7 @@
"hwyla",
"iceberg",
"ignitioncoil",
"illager-raid-music",
"inmisaddon",
"iris-flywheel-compat",
"irisshaders",
@@ -76,8 +88,10 @@
"legendary-tooltips",
"lighty",
"loot-capacitor-tooltips",
"loot-journal",
"lootbeams",
"magnesium-extras",
"make-bubbles-pop",
"menumobs",
"minecraft-rich-presence",
"model-gap-fix",
@@ -93,7 +107,10 @@
"overloaded-armor-bar",
"packmenu",
"packmodemenu",
"particular",
"particular-reforged",
"reauth",
"rebind-narrator",
"reblured",
"reeses-sodium-options",
"reforgium",
@@ -105,9 +122,11 @@
"seamless-loading-screen",
"seamless-loading-screen-forge",
"searchables",
"seasonhud",
"shulkerboxviewer",
"skin-layers-3d",
"smart-hud",
"smithing-template-viewer",
"smooth-font",
"smoothwater",
"sodium",
@@ -115,9 +134,9 @@
"sodium-options-api",
"sodium-rubidium-occlusion-culling-fix",
"sound",
"sound-reloader",
"sound-filters",
"sound-physics-remastered",
"sound-reloader",
"stellar-sky",
"swingthroughgrass",
"textrues-embeddium-options",
@@ -131,6 +150,7 @@
"vanillafix",
"visuality",
"waila-harvestability",
"wakes-reforged",
"wawla",
"xaeroplus",
"yungs-menu-tweaks",
@@ -140,6 +160,9 @@
"all-of-fabric-6": {
"forceIncludes": ["revelationary"]
},
"beyond-depth": {
"forceIncludes": ["particular-reforged"]
},
"create-arcane-engineering": {
"forceIncludes": ["just-enough-resources-jer"]
},

View File

@@ -1,2 +0,0 @@
minecraft ALL=(ALL) NOPASSWD:/usr/bin/pkill
minecraft ALL=(ALL) NOPASSWD:/usr/local/sbin/knockd

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -32,14 +32,15 @@ isDebugging && set -x
export HOME=/data
log "Running as uid=$(id -u) gid=$(id -g) with /data as '$(ls -lnd /data)'"
log "Image info: $(paste -d, -s /etc/image.properties)"
if [ ! -e /data/eula.txt ]; then
if ! isTrue "$EULA"; then
log ""
logError "Please accept the Minecraft EULA at"
logError " https://account.mojang.com/documents/minecraft_eula"
logError "by setting the container environment variable "
logError "EULA to \"true\""
logError "by adding the following immediately after 'docker run':"
logError " -e EULA=TRUE"
log ""
exit 1
fi
@@ -146,11 +147,11 @@ if isTrue "${ENABLE_AUTOSTOP}"; then
"${SCRIPTS:-/}start-autostop"
fi
if
if
[[ "$RCON_CMDS_STARTUP" ]] ||
[[ "$RCON_CMDS_ON_CONNECT" ]] ||
[[ "$RCON_CMDS_ON_DISCONNECT" ]] ||
[[ "$RCON_CMDS_FIRST_CONNECT" ]] ||
[[ "$RCON_CMDS_ON_DISCONNECT" ]] ||
[[ "$RCON_CMDS_FIRST_CONNECT" ]] ||
[[ "$RCON_CMDS_LAST_DISCONNECT" ]]
then
log "Starting RCON commands"
@@ -249,7 +250,7 @@ case "${TYPE^^}" in
exec "${SCRIPTS:-/}start-deployKetting" "$@"
;;
MOHIST)
MOHIST|YOUER|BANNER)
exec "${SCRIPTS:-/}start-deployMohist" "$@"
;;
@@ -273,15 +274,31 @@ case "${TYPE^^}" in
exec "${SCRIPTS:-/}start-deployLimbo" "$@"
;;
NANOLIMBO)
exec "${SCRIPTS:-/}start-deployNanoLimbo" "$@"
;;
CRUCIBLE)
exec "${SCRIPTS:-/}start-deployCrucible" "$@"
;;
LEAF)
exec "${SCRIPTS:-/}start-deployLeaf" "$@"
;;
ARCLIGHT)
exec "${SCRIPTS:-/}start-deployArcLight" "$@"
;;
POSEIDON)
exec "${SCRIPTS:-/}start-deployPoseidon" "$@"
;;
*)
logError "Invalid TYPE: '$TYPE'"
logError "Must be: VANILLA, FORGE, BUKKIT, SPIGOT, PAPER, FOLIA, PURPUR, FABRIC, QUILT,"
logError " SPONGEVANILLA, CUSTOM, MAGMA, MOHIST, CATSERVER, AIRPLANE, PUFFERFISH,"
logError " CANYON, LIMBO, CRUCIBLE"
logError " CANYON, LIMBO, NANOLIMBO, CRUCIBLE, LEAF, YOUER, BANNER"
exit 1
;;

41
scripts/start-deployArcLight Executable file
View File

@@ -0,0 +1,41 @@
#!/bin/bash
# shellcheck source=start-utils
. "${SCRIPTS:-$(dirname "$0")}/start-utils"
set -o pipefail
set -e
isDebugging && set -x
resolveVersion
: "${ARCLIGHT_RELEASE:=latest}"
: "${ARCLIGHT_TYPE:=neoforge}"
arclightReleasesUrl=https://api.github.com/repos/IzzelAliz/Arclight/releases
if [[ ${ARCLIGHT_RELEASE^^} = LATEST ]]; then
arclightReleaseUrl=${arclightReleasesUrl}/latest
else
arclightReleaseUrl=${arclightReleasesUrl}/tags/${ARCLIGHT_RELEASE}
fi
if ! downloadUrl=$(get --json-path "$.assets[?(@.name =~ /arclight-${ARCLIGHT_TYPE,,}-${VERSION}-.*\.jar/)].browser_download_url" \
--accept "application/vnd.github.v3+json" "$arclightReleaseUrl"); then
logError "Failed to access ${ARCLIGHT_RELEASE} release of Arclight"
exit 1
fi
if [[ $downloadUrl = null ]]; then
logError "Failed to locate Arclight jar for $VERSION from ${ARCLIGHT_RELEASE}"
exit 1
fi
log "Downloading Arclight from $downloadUrl"
if ! SERVER=$(get --skip-existing --output-filename -o /data "$downloadUrl"); then
logError "Arclight jar from $downloadUrl"
exit 1
fi
export SERVER
export FAMILY=HYBRID
export HYBRIDTYPE="${ARCLIGHT_TYPE,,}"
exec "${SCRIPTS:-/}start-spiget" "$@"

View File

@@ -21,9 +21,20 @@ set -eu
: "${CF_DOWNLOADS_REPO=$([ -d /downloads ] && echo '/downloads' || echo '')}"
: "${CF_MODPACK_MANIFEST:=}"
: "${CF_API_CACHE_DEFAULT_TTL:=}" # as ISO-8601 duration, such as P2D or PT12H
: "${CF_API_KEY_FILE:=}" # Path to file containing CurseForge API key
resultsFile=/data/.install-curseforge.env
if [[ -n ${CF_API_KEY_FILE} ]]; then
if [[ -r "${CF_API_KEY_FILE}" ]]; then
CF_API_KEY="$(cat "${CF_API_KEY_FILE}")"
export CF_API_KEY
else
logError "CF_API_KEY_FILE is not readable: ${CF_API_KEY_FILE}"
exit 1
fi
fi
isDebugging && set -x
ensureRemoveAllModsOff "MODPACK_PLATFORM=AUTO_CURSEFORGE"

View File

@@ -70,38 +70,19 @@ function downloadSpigot {
esac
if [[ ${VERSION^^} = LATEST ]]; then
if ! VERSION=$(restify ${getBukkitSpigotUrl} --attribute='property=og:title' | jq -r '.[0] | .attributes | select(.property == "og:title") | .content | split(" ") | .[-1]'); then
if ! downloadUrl=$(restify "${getBukkitBaseUrl}/${getbukkitFlavor}" --id='downloadr' | jq -r '.[0] | .href '); then
logError "Failed to retrieve latest version from ${getBukkitSpigotUrl} -- site might be down"
exit 1
fi
fi
if [[ -z $downloadUrl ]]; then
downloadBaseUrl="https://"
downloadSuffixUrl=".getbukkit.org/${getbukkitFlavor}/${getbukkitFlavor}-${VERSION}.jar"
if versionLessThan 1.16.5 || { [[ ${getbukkitFlavor} = "craftbukkit" ]] && [[ ${VERSION} = "1.16.5" ]] ; }; then
downloadBaseUrl+="cdn"
else
downloadBaseUrl+="download"
fi
downloadUrl="${downloadBaseUrl}${downloadSuffixUrl}"
downloadUrl="https://cdn.getbukkit.org/${getbukkitFlavor}/${getbukkitFlavor}-${VERSION}.jar"
fi
setServerVar
curlArgs=()
if [ -f "$SERVER" ] && ! isTrue "$FORCE_REDOWNLOAD"; then
# tell curl to only download when newer
curlArgs+=(-z "$SERVER")
fi
if isDebugging; then
curlArgs+=(-v)
fi
log "Downloading $match from $downloadUrl ..."
log "Downloading $match from $downloadUrl if missing ..."
tempFile="$SERVER.$$"
# HTTP error or download site responded with an HTML error page
if ! curl -fsSL -o "$tempFile" "${curlArgs[@]}" "$downloadUrl" || ( [ -f "$tempFile" ] && grep -iq "doctype html" "$tempFile" ); then
if ! SERVER=$(get -o /data --skip-existing --output-filename "$downloadUrl"); then
cat <<EOF
@@ -111,29 +92,9 @@ ERROR: failed to download from $downloadUrl
Click into the version entry to find the **exact** version.
EOF
if isDebugging && grep -iq "doctype html" "$tempFile"; then
cat "$tempFile"
exit 1
fi
if [ -f "$SERVER" ]; then
log "Continuing with existing $SERVER file"
else
# remove invalid download
rm "$tempFile"
exit 3
fi
else
if [ -f "$tempFile" ]; then
mv "$tempFile" "$SERVER"
fi
fi
JVM_OPTS="${JVM_OPTS} -DIReallyKnowWhatIAmDoingISwear"
export JVM_OPTS
export SERVER
}
function setServerVar {
@@ -157,6 +118,8 @@ else
downloadSpigot
fi
JVM_OPTS="${JVM_OPTS} -DIReallyKnowWhatIAmDoingISwear"
export JVM_OPTS
# Normalize on Spigot for operations below
export FAMILY=SPIGOT

View File

@@ -28,5 +28,6 @@ if [ ! -f ${SERVER} ]; then
fi
export FAMILY=HYBRID
export HYBRIDTYPE=forge
exec "${SCRIPTS:-/}start-spiget" "$@"

View File

@@ -56,5 +56,6 @@ fi
export SERVER
export FAMILY=HYBRID
export HYBRIDTYPE=forge
exec "${SCRIPTS:-/}start-spiget" "$@"

View File

@@ -40,5 +40,6 @@ fi
# Allow for overriding Family on custom for testing.
export FAMILY="${FAMILY:-HYBRID}"
export HYBRIDTYPE="${HYBRIDTYPE:-any}"
exec "${SCRIPTS:-/}start-spiget" "$@"

View File

@@ -28,5 +28,6 @@ export EXTRA_ARGS
export SERVER
export FAMILY=HYBRID
export HYBRIDTYPE=forge
exec "${SCRIPTS:-/}start-spiget" "$@"

51
scripts/start-deployLeaf Normal file
View File

@@ -0,0 +1,51 @@
#!/bin/bash
# shellcheck source=start-utils
. "${SCRIPTS:-$(dirname "$0")}/start-utils"
set -o pipefail
set -e
isDebugging && set -x
resolveVersion
: "${LEAF_BUILD:=LATEST}"
# Docs at https://api.leafmc.one/docs/swagger-ui/index.html
leafApiUrl="https://api.leafmc.one/v2/projects/leaf"
leafDownloadsPage="https://www.leafmc.one/download"
if ! get --exists "${leafApiUrl}/versions/${VERSION}/builds"; then
logError "Leaf builds do not exist for ${VERSION}"
logError " check ${leafDownloadsPage} for available versions"
logError " and set VERSION accordingly"
exit 1
fi
if [[ "${LEAF_BUILD^^}" == "LATEST" ]]; then
# Get the latest build number from the API, which will be the last object in the builds array
if ! buildNumber=$(
get --json-path '$.builds[-1].build' "${leafApiUrl}/versions/${VERSION}/builds"
); then
logError "failed to list Leaf builds for ${VERSION}"
exit 1
fi
LEAF_BUILD="${buildNumber}"
fi
if ! filename=$(
get --json-path='$.downloads.primary.name' --json-value-when-missing="" "${leafApiUrl}/versions/${VERSION}/builds/${LEAF_BUILD}"
); then
logError "Failed to retrieve download filename"
exit 1
fi
SERVER="/data/$filename"
if ! get --skip-existing --log-progress-each -o "${SERVER}" "${leafApiUrl}/versions/${VERSION}/builds/${LEAF_BUILD}/downloads/${filename}"; then
logError "Failed to download"
exit 1
fi
export FAMILY=SPIGOT
export SERVER
exec "${SCRIPTS:-/}start-spiget" "$@"

View File

@@ -65,4 +65,4 @@ fi
export LEVEL
export FAMILY=LIMBO
exec ${SCRIPTS:-/}start-setupWorld $@
exec ${SCRIPTS:-/}start-setupWorld "$@"

View File

@@ -25,5 +25,6 @@ fi
export SERVER
export FAMILY=HYBRID
export HYBRIDTYPE=forge
exec "${SCRIPTS:-/}start-spiget" "$@"

View File

@@ -34,5 +34,6 @@ fi
export SERVER
export FAMILY=HYBRID
export HYBRIDTYPE=forge
exec "${SCRIPTS:-/}start-spiget" "$@"

View File

@@ -9,46 +9,56 @@ isDebugging && set -x
resolveVersion
: "${MOHIST_BUILD:=lastSuccessfulBuild}"
mohistBaseUrl="https://mohistmc.com/api/v2/projects/mohist/"
mohistApiUrl="${mohistBaseUrl}${VERSION}/builds/"
# Docs at https://mohistmc.com/mohistmc-api
mohistType="${TYPE,,}"
mohistApiUrl="https://api.mohistmc.com/project/${mohistType}"
mohistDownloadsPage="https://mohistmc.com/downloadSoftware?project=${mohistType}"
function logMohistAvailableVerisons(){
logError " check ${mohistBaseUrl} for available versions"
if ! get --exists "${mohistApiUrl}/${VERSION}/builds"; then
logError "${mohistType} builds do not exist for ${VERSION}"
logError " check ${mohistDownloadsPage} for available versions"
logError " and set VERSION accordingly"
}
if ! get --exists "${mohistApiUrl}"; then
logError "Mohist builds do not exist for ${VERSION}"
logMohistAvailableVerisons
exit 1
fi
if [[ "${MOHIST_BUILD}" == "lastSuccessfulBuild" ]]; then
# Get the latest build number from the API
buildNumber=$(
get --json-path '$.builds[-1].number' "${mohistApiUrl}"
)
if ! buildNumber=$(
get --json-path '$[0].id' "${mohistApiUrl}/${VERSION}/builds"
); then
logError "failed to list ${mohistType} builds for ${VERSION}"
exit 1
fi
MOHIST_BUILD="${buildNumber}"
fi
downloadUrl=$(
get --json-path "$.builds[?(@.number==${MOHIST_BUILD})].url" "${mohistApiUrl}"
)
downloadUrl="${mohistApiUrl}/${VERSION}/builds/${MOHIST_BUILD}/download"
if [[ -z "${downloadUrl}" ]]; then
logError "Could not find build ${MOHIST_BUILD} for version ${VERSION}"
logMohistAvailableVerisons
logError " check ${mohistDownloadsPage} for available versions"
logError " and set VERSION accordingly"
exit 1
fi
SERVER="/data/mohist-${VERSION}-${MOHIST_BUILD}-server.jar"
SERVER="/data/${mohistType}-${VERSION}-${MOHIST_BUILD}-server.jar"
if [ ! -f "${SERVER}" ]; then
log "Downloading Mohist build ${MOHIST_BUILD} for ${VERSION}"
log "Downloading ${mohistType^} build ${MOHIST_BUILD} for ${VERSION}"
get -o "${SERVER}" "${downloadUrl}"
fi
export FAMILY=HYBRID
if [[ "${mohistType}" == "mohist" ]]; then
export HYBRIDTYPE=forge
elif [[ "${mohistType}" == "youer" ]]; then
export HYBRIDTYPE=neoforge
elif [[ "${mohistType}" == "banner" ]]; then
export HYBRIDTYPE=fabric
else
log "Unknown server type"
fi
export SERVER
export FAMILY=HYBRID
exec "${SCRIPTS:-/}start-spiget" "$@"

19
scripts/start-deployNanoLimbo Executable file
View File

@@ -0,0 +1,19 @@
#!/bin/bash
# shellcheck source=start-utils
. "${SCRIPTS:-/}start-utils"
isDebugging && set -x
if ! SERVER=$(mc-image-helper github download-latest-asset \
--output-directory=/data \
--name-pattern="NanoLimbo-.+?(?<!-sources)\.jar" \
Nan1t/NanoLimbo
); then
logError "Failed to download NanoLimbo"
exit 1
fi
export SERVER
export FAMILY=LIMBO
exec ${SCRIPTS:-/}start-setupMounts "$@"

View File

@@ -0,0 +1,37 @@
#!/bin/bash
# shellcheck source=start-utils
. "${SCRIPTS:-$(dirname "$0")}/start-utils"
set -o pipefail
set -e
isDebugging && set -x
resolveVersion
if [ "${VERSION}" != "b1.7.3" ]; then
logError "Poseidon server type only supports VERSION=b1.7.3"
exit 1
fi
# : "${POSEIDON_RELEASE:=latest}" placeholder until I figure out how to add version selection with mc-image-helper
: "${POSEIDON_TYPE:=poseidon}"
if [[ ${POSEIDON_TYPE^^} = UBERBUKKIT ]]; then
poseidonRepo="Moresteck/uberbukkit"
else
poseidonRepo="retromcorg/Project-Poseidon"
fi
if ! SERVER=$(mc-image-helper github download-latest-asset \
--output-directory=/data \
--name-pattern="^(?!original-).+\.jar" \
${poseidonRepo}
); then
logError "Failed to download ${POSEIDON_TYPE}"
exit 1
fi
export SERVER
export FAMILY=SPIGOT
exec "${SCRIPTS:-/}start-spiget" "$@"

View File

@@ -151,16 +151,38 @@ if isTrue "${ENABLE_JMX}"; then
log "JMX is enabled. Make sure you have port forwarding for ${JMX_PORT}"
fi
if isTrue "${USE_MEOWICE_FLAGS}"; then
java_major_version=$(mc-image-helper java-release)
if [[ $java_major_version -gt 16 ]]; then
USE_MEOWICE_GRAALVM_FLAGS="${USE_MEOWICE_GRAALVM_FLAGS:-TRUE}"
log "Java version $java_major_version using MeowIce's flags for Java 17+"
else
log "Your Java version is $java_major_version, MeowIce's flags are for Java 17+ falling back to Aikar's"
USE_MEOWICE_FLAGS=FALSE
fi
USE_AIKAR_FLAGS=TRUE
fi
if isTrue "${USE_AIKAR_FLAGS}"; then
# From https://mcflags.emc.gs/
if [[ $MAX_MEMORY ]] && (( $(normalizeMemSize "${MAX_MEMORY}") >= $(normalizeMemSize 12g) )); then
if isTrue "${USE_MEOWICE_FLAGS}"; then
log "Using MeowIce's flags"
G1NewSizePercent=28
G1MaxNewSizePercent=50
G1HeapRegionSize=16M
G1ReservePercent=15
InitiatingHeapOccupancyPercent=20
G1MixedGCCountTarget=3
G1RSetUpdatingPauseTimePercent=0
elif [[ $MAX_MEMORY ]] && (( $(normalizeMemSize "${MAX_MEMORY}") >= $(normalizeMemSize 12g) )); then
log "Using Aikar's >12GB flags"
G1NewSizePercent=40
G1MaxNewSizePercent=50
G1HeapRegionSize=16M
G1ReservePercent=15
InitiatingHeapOccupancyPercent=20
G1MixedGCCountTarget=4
G1RSetUpdatingPauseTimePercent=5
else
log "Using Aikar's flags"
G1NewSizePercent=30
@@ -168,6 +190,8 @@ if isTrue "${USE_AIKAR_FLAGS}"; then
G1HeapRegionSize=8M
G1ReservePercent=20
InitiatingHeapOccupancyPercent=15
G1MixedGCCountTarget=4
G1RSetUpdatingPauseTimePercent=5
fi
JVM_XX_OPTS="${JVM_XX_OPTS}
@@ -182,10 +206,10 @@ if isTrue "${USE_AIKAR_FLAGS}"; then
-XX:G1HeapRegionSize=${G1HeapRegionSize}
-XX:G1ReservePercent=${G1ReservePercent}
-XX:G1HeapWastePercent=5
-XX:G1MixedGCCountTarget=4
-XX:G1MixedGCCountTarget=${G1MixedGCCountTarget}
-XX:InitiatingHeapOccupancyPercent=${InitiatingHeapOccupancyPercent}
-XX:G1MixedGCLiveThresholdPercent=90
-XX:G1RSetUpdatingPauseTimePercent=5
-XX:G1RSetUpdatingPauseTimePercent=${G1RSetUpdatingPauseTimePercent}
-XX:SurvivorRatio=32
-XX:+PerfDisableSharedMem
-XX:MaxTenuringThreshold=1
@@ -194,6 +218,116 @@ if isTrue "${USE_AIKAR_FLAGS}"; then
"
fi
if isTrue "${USE_MEOWICE_FLAGS}"; then
JVM_XX_OPTS="${JVM_XX_OPTS}
-XX:+UnlockDiagnosticVMOptions
-XX:G1SATBBufferEnqueueingThresholdPercent=30
-XX:G1ConcMarkStepDurationMillis=5
-XX:+UseNUMA
-XX:-DontCompileHugeMethods
-XX:MaxNodeLimit=240000
-XX:NodeLimitFudgeFactor=8000
-XX:ReservedCodeCacheSize=400M
-XX:NonNMethodCodeHeapSize=12M
-XX:ProfiledCodeHeapSize=194M
-XX:NonProfiledCodeHeapSize=194M
-XX:NmethodSweepActivity=1
-XX:+UseFastUnorderedTimeStamps
-XX:+UseCriticalJavaThreadPriority
-XX:AllocatePrefetchStyle=3
-XX:+AlwaysActAsServerClassMachine
-XX:+UseTransparentHugePages
-XX:LargePageSizeInBytes=2M
-XX:+UseLargePages
-XX:+EagerJVMCI
-XX:+UseStringDeduplication
-XX:+UseAES
-XX:+UseAESIntrinsics
-XX:+UseFMA
-XX:+UseLoopPredicate
-XX:+RangeCheckElimination
-XX:+OptimizeStringConcat
-XX:+UseCompressedOops
-XX:+UseThreadPriorities
-XX:+OmitStackTraceInFastThrow
-XX:+RewriteBytecodes
-XX:+RewriteFrequentPairs
-XX:+UseFPUForSpilling
-XX:+UseVectorCmov
-XX:+UseXMMForArrayCopy
-XX:+EliminateLocks
-XX:+DoEscapeAnalysis
-XX:+AlignVector
-XX:+OptimizeFill
-XX:+EnableVectorSupport
-XX:+UseCharacterCompareIntrinsics
-XX:+UseCopySignIntrinsic
-XX:+UseVectorStubs
"
if [[ $(arch) == "x86_64" ]]; then
JVM_XX_OPTS="${JVM_XX_OPTS}
-XX:+UseFastStosb
-XX:+UseNewLongLShift
-XX:+UseXmmI2D
-XX:+UseXmmI2F
-XX:+UseXmmLoadAndClearUpper
-XX:+UseXmmRegToRegMoveAll
-XX:UseAVX=2
-XX:UseSSE=4
"
else
log "cpu not x86_64, disabling architecture specific flags"
fi
fi
if isTrue "${USE_MEOWICE_GRAALVM_FLAGS}"; then
if [[ $java_major_version -gt 23 ]]; then
log "Java 24 or higher detected, using modified GraalVM flags"
JVM_XX_OPTS="${JVM_XX_OPTS}
-XX:+UseFastJNIAccessors
-XX:+UseInlineCaches
-XX:+SegmentedCodeCache
-Djdk.nio.maxCachedBufferSize=262144
-Djdk.graal.UsePriorityInlining=true
-Djdk.graal.Vectorization=true
-Djdk.graal.OptDuplication=true
-Djdk.graal.DetectInvertedLoopsAsCounted=true
-Djdk.graal.LoopInversion=true
-Djdk.graal.VectorizeHashes=true
-Djdk.graal.EnterprisePartialUnroll=true
-Djdk.graal.VectorizeSIMD=true
-Djdk.graal.StripMineNonCountedLoops=true
-Djdk.graal.SpeculativeGuardMovement=true
-Djdk.graal.TuneInlinerExploration=1
-Djdk.graal.LoopRotation=true
-Djdk.graal.CompilerConfiguration=enterprise
--enable-native-access=ALL-UNNAMED
"
else
log "Using MeowIce's flags for Graalvm"
JVM_XX_OPTS="${JVM_XX_OPTS}
-XX:+UseFastJNIAccessors
-XX:+UseInlineCaches
-XX:+SegmentedCodeCache
-Djdk.nio.maxCachedBufferSize=262144
-Dgraal.UsePriorityInlining=true
-Dgraal.Vectorization=true
-Dgraal.OptDuplication=true
-Dgraal.DetectInvertedLoopsAsCounted=true
-Dgraal.LoopInversion=true
-Dgraal.VectorizeHashes=true
-Dgraal.EnterprisePartialUnroll=true
-Dgraal.VectorizeSIMD=true
-Dgraal.StripMineNonCountedLoops=true
-Dgraal.SpeculativeGuardMovement=true
-Dgraal.TuneInlinerExploration=1
-Dgraal.LoopRotation=true
-Dgraal.OptWriteMotion=true
-Dgraal.CompilerConfiguration=enterprise
"
fi
fi
if isTrue "${USE_FLARE_FLAGS}"; then
JVM_XX_OPTS="${JVM_XX_OPTS}
-XX:+UnlockDiagnosticVMOptions
@@ -360,4 +494,3 @@ else
exec mc-server-runner ${bootstrapArgs} "${mcServerRunnerArgs[@]}" java "${finalArgs[@]}"
fi
fi

View File

@@ -11,8 +11,19 @@ set -e -o pipefail
: "${PLUGINS_FILE:=}"
: "${REMOVE_OLD_MODS_DEPTH:=1} "
: "${REMOVE_OLD_MODS_INCLUDE:=*.jar,*-version.json}"
: "${CF_API_KEY_FILE:=}" # Path to file containing CurseForge API key
sum_file=/data/.generic_pack.sum
if [[ -n ${CF_API_KEY_FILE} ]]; then
if [[ -r "${CF_API_KEY_FILE}" ]]; then
CF_API_KEY="$(cat "${CF_API_KEY_FILE}")"
export CF_API_KEY
else
logError "CF_API_KEY_FILE is not readable: ${CF_API_KEY_FILE}"
exit 1
fi
fi
# shellcheck source=start-utils
. "${SCRIPTS:-/}start-utils"
isDebugging && set -x
@@ -253,7 +264,7 @@ function handleModrinthProjects() {
if [[ $MODRINTH_PROJECTS ]]; then
if isFamily HYBRID; then
loader=forge
loader=${HYBRIDTYPE}
elif isFamily VANILLA; then
loader=datapack
else
@@ -286,7 +297,7 @@ function handleCurseForgeFiles() {
if isFamily HYBRID; then
# To disambiguate mc-mods we'll assume that hybrid servers
# are blending Forge (rather than Fabric or NeoForge)
args+=(--mod-loader "forge")
args+=(--mod-loader "${HYBRIDTYPE}")
fi
;;
esac

View File

@@ -38,7 +38,7 @@ function mc-image-helper-mounts(){
: "${COPY_PLUGINS_SRC:="/plugins"}"
: "${COPY_PLUGINS_DEST:=${PLUGINS_OUT_DIR}}"
if usesPlugins && [ -d "${COPY_PLUGINS_SRC}" ]; then
if usesPlugins; then
mkdir -p "${COPY_PLUGINS_DEST}"
log "Copying any plugins from ${COPY_PLUGINS_SRC} to ${COPY_PLUGINS_DEST}"
mc-image-helper-mounts "${COPY_PLUGINS_SRC}" "${COPY_PLUGINS_DEST}"
@@ -47,7 +47,7 @@ fi
: "${COPY_MODS_SRC:="/mods"}"
: "${COPY_MODS_DEST:=${MODS_OUT_DIR}}"
if usesMods && [ -d "${COPY_MODS_SRC}" ]; then
if usesMods; then
log "Copying any mods from ${COPY_MODS_SRC} to ${COPY_MODS_DEST}"
mc-image-helper-mounts "${COPY_MODS_SRC}" "${COPY_MODS_DEST}"
fi
@@ -55,9 +55,7 @@ fi
: "${COPY_CONFIG_SRC:="/config"}"
: "${COPY_CONFIG_DEST:="/data/config"}"
if [ -d "${COPY_CONFIG_SRC}" ]; then
log "Copying any configs from ${COPY_CONFIG_SRC} to ${COPY_CONFIG_DEST}"
mc-image-helper-mounts "${COPY_CONFIG_SRC}" "${COPY_CONFIG_DEST}"
fi
log "Copying any configs from ${COPY_CONFIG_SRC} to ${COPY_CONFIG_DEST}"
mc-image-helper-mounts "${COPY_CONFIG_SRC}" "${COPY_CONFIG_DEST}"
exec "${SCRIPTS:-/}start-setupServerProperties" "$@"

View File

@@ -5,6 +5,9 @@
set -e
isDebugging && set -x
worldDownload=/data/tmp/world.zip
tmpWorldData=/data/tmp/world-data
# support absolute directories
if [[ "${LEVEL:-world}" =~ ^\/.*$ ]]; then
worldDest=${LEVEL}
@@ -26,24 +29,25 @@ if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] );
if isURL "$WORLD"; then
log "Downloading world from $WORLD"
if ! get -o /tmp/world.bin "$WORLD"; then
mkdir -p /data/tmp
if ! get -o ${worldDownload} "$WORLD"; then
logError "Failed to download world from $WORLD"
exit 1
fi
WORLD=/tmp/world.bin
WORLD=${worldDownload}
fi
if [ -f "$WORLD" ]; then
log "Extracting world"
# Stage contents so that the correct subdirectory can be picked off
mkdir -p /tmp/world-data
if ! extract "$WORLD" /tmp/world-data; then
mkdir -p ${tmpWorldData}
if ! extract "$WORLD" ${tmpWorldData}; then
logError "Extracting world from $WORLD"
exit 1
fi
baseDirs=$(find /tmp/world-data -name "level.dat" -exec dirname "{}" \;)
baseDirs=$(find ${tmpWorldData} -name "level.dat" -exec dirname "{}" \;)
if ! [[ $baseDirs ]]; then
logError "World content is not valid since level.dat could not be found"
@@ -128,4 +132,7 @@ if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] );
fi
fi
[[ -f ${worldDownload} ]] && rm ${worldDownload}
[[ -d ${tmpWorldData} ]] && rm -rf ${tmpWorldData}
exec "${SCRIPTS:-/}start-setupDatapack" "$@"

3
tests/.gitignore vendored
View File

@@ -1 +1,2 @@
data/
data/
cf_api_key.secret

View File

@@ -6,10 +6,8 @@ services:
SETUP_ONLY: "TRUE"
MODPACK_PLATFORM: AUTO_CURSEFORGE
CF_API_KEY: ${CF_API_KEY}
CF_SLUG: the-pixelmon-modpack
CF_FILENAME_MATCHER: "9.1.2"
# Use the image bundled one to ensure latest is being tested
CF_EXCLUDE_INCLUDE_FILE: /image/cf-exclude-include.json
CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/the-pixelmon-modpack/files/5954570
DEBUG: true
volumes:
- ./data:/data

View File

@@ -0,0 +1,18 @@
services:
mc:
image: ${IMAGE_TO_TEST:-itzg/minecraft-server}
environment:
EULA: "true"
SETUP_ONLY: "TRUE"
MODPACK_PLATFORM: AUTO_CURSEFORGE
CF_API_KEY_FILE: /run/secrets/cf_api_key
CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/the-pixelmon-modpack/files/5954570
DEBUG: true
volumes:
- ./data:/data
secrets:
- cf_api_key
secrets:
cf_api_key:
file: cf_api_key.secret

View File

@@ -0,0 +1,2 @@
[[ -n "$CF_API_KEY" ]] || exit 1
echo "$CF_API_KEY" > cf_api_key.secret || exit 1

View File

@@ -0,0 +1,2 @@
mc-image-helper assert fileExists "/data/mods/ExplorersCompass-1.16.5-1.1.2-forge.jar"
mc-image-helper assert fileExists "/data/forge-1.16.5-36.2.34.jar"

View File

@@ -6,7 +6,7 @@ services:
EULA: "TRUE"
SETUP_ONLY: "TRUE"
TYPE: FABRIC
VERSION: 1.18.2
VERSION: 1.20.1
# Contains mix of Forge and Fabric mods
CURSEFORGE_FILES: |
https://www.curseforge.com/minecraft/mc-mods/clumps/files/4153343

View File

@@ -1 +1 @@
architectury-api@4.12.94
architectury-api@9.2.14

View File

@@ -47,6 +47,7 @@ setupOnlyMinecraftTest(){
status=PASSED
verify=
if ! logs=$(docker compose run --rm -e SETUP_ONLY=true -e DEBUG="${DEBUG:-false}" mc 2>&1); then
status=FAILED
outputContainerLog "$logs"
result=1
elif [ -f verify.sh ]; then