Compare commits

...
33 Commits
Author SHA1 Message Date
Geoff BourneandGitHub 4cbdf520c8 Revert "Switch to permissions for auto-release workflow" (#4185) 2026-07-20 13:45:20 -05:00
Geoff BourneandGitHub a3bb7bff34 SERVER_RUNNER is expanded when exec'ed (#4183) 2026-07-19 21:35:08 -05:00
Geoff BourneandGitHub 1e77b81b32 Allow for custom SERVER_RUNNER (#4182) 2026-07-19 20:37:26 -05:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
479973c950 Update dependency itzg/mc-image-helper to v1.62.1 (#4180)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-19 19:06:29 -05:00
Geoff BourneandGitHub 2a246ee805 Added PREFER_IPv6 to simplify Java setup for IPv6 addresses and stack (#4181) 2026-07-19 16:10:01 -05:00
3c4c94e1ad Use mc-image-helper to install vanilla Minecraft. (#4165)
Co-authored-by: Geoff Bourne <itzgeoff@gmail.com>
2026-07-19 15:54:07 -05:00
Geoff BourneandGitHub cd2c5628f2 Enhance workflow conditionals for forked repositories and notifications (#4179) 2026-07-18 16:51:16 -05:00
Geoff BourneandGitHub 0a445cd8db Only trigger auto release for non-forked (#4178) 2026-07-18 15:02:29 -05:00
Geoff BourneandGitHub 537a3e43fe Use gcompat to ensure mc-image-helper runs on aarch64+alpine (#4176) 2026-07-17 07:54:30 -05:00
Geoff BourneandGitHub 17d7f01267 Corrected the "must" wording for API key with CURSEFORGE_FILES (#4174) 2026-07-16 17:57:48 -05:00
Chip Wolf ‮andGitHub 591f37bfa5 generic-packs: support oci:// references via install-oci-pack (#4164) 2026-07-16 17:29:05 -05:00
Geoff BourneandGitHub 3302bdb3cb Notify on PR merged (#4173) 2026-07-16 10:16:17 -05:00
Geoff BourneandGitHub fe9f471da7 CF_API_KEY is now baked in and available by default (#4172) 2026-07-16 09:56:52 -05:00
renovate[bot]andGitHub 159d8f6939 Update dependency itzg/mc-image-helper to v1.61.4 (#4171) 2026-07-16 06:51:42 -05:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
8f9e8db492 Update dependency itzg/mc-image-helper to v1.61.3 (#4168)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-15 18:16:55 -05:00
dependabot[bot]andGitHub e85630b3af build(deps): bump the patches group in /docs with 2 updates (#4166) 2026-07-15 07:12:23 -05:00
Geoff BourneandGitHub d18a464a77 Switch to permissions for auto-release workflow (#4163) 2026-07-13 15:40:50 -05:00
renovate[bot]andGitHub 719166908a Update dependency itzg/easy-add to v0.8.15 (#4159) 2026-07-13 10:19:29 -05:00
renovate[bot]andGitHub 66785d6ce8 Update dependency itzg/mc-monitor to v0.16.11 (#4160) 2026-07-13 09:46:28 -05:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
9cff43e8dc Update dependency itzg/mc-server-runner to v1.15.1 (#4161)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-13 07:50:31 -05:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
c17ea4cf7b Update dependency itzg/restify to v1.7.17 (#4162)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-13 07:48:25 -05:00
Geoff BourneandGitHub 641f19879a Use GLIBC 2.34 compatible knockd for Java 17 images and older (#4158) 2026-07-12 21:48:11 -05:00
Geoff BourneandGitHub de75f2e671 Use http/1.1 for CurseForge (#4155) 2026-07-11 21:23:04 -05:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
175004e656 Update dependency itzg/mc-image-helper to v1.61.2 (#4154)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-11 20:23:54 -05:00
Bas MagréandGitHub 81293634de Added: riscv64 support (#4144) 2026-07-11 17:37:36 -05:00
Geoff BourneandGitHub 3c3e49e385 Document troubleshooting of Reactor Netty's HTTP client (#4153) 2026-07-11 11:14:21 -05:00
Geoff BourneandGitHub fd55a0cc08 Added iproute2 package to provide ip tool (#4152) 2026-07-10 22:07:36 -05:00
dependabot[bot]andGitHub b0de461d1e build(deps): bump the patches group in /docs with 2 updates (#4150) 2026-07-08 19:17:06 -05:00
dependabot[bot]andGitHub ebb80ea264 build(deps): bump the updates group with 3 updates (#4149) 2026-07-08 07:29:39 -05:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
702d05e60c Update dependency itzg/mc-monitor to v0.16.10 (#4148)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-07 18:52:58 -05:00
David GaagandGitHub 32b026d0df Fix GTNH versions.json parsing (#4146) 2026-07-06 06:59:21 -05:00
Leon KampwerthandGitHub d9ee3ee68c Refactor deploy gtnh (#4141) 2026-07-05 07:43:43 -05:00
Geoff BourneandGitHub ab505fa43c Pass GH_TOKEN to containers started during tests (#4136) 2026-07-04 23:17:54 -05:00
54 changed files with 368 additions and 309 deletions
+2
View File
@@ -0,0 +1,2 @@
*.sh text eol=lf
scripts/** text eol=lf
+6 -1
View File
@@ -6,10 +6,15 @@ on:
jobs: jobs:
auto-release: auto-release:
runs-on: ubuntu-latest runs-on: ubuntu-latest
# If forked, changed to your username to enable auto-releases
if: github.repository_owner == 'itzg'
steps: steps:
- uses: zenengeo/github-auto-release-action@main - uses: zenengeo/github-auto-release-action@main
with: with:
stable-duration: 3d stable-duration: 3d
force-duration: 14d force-duration: 14d
# It is important to use a token other than the workflow allocated GITHUB_TOKEN,
# since actions prevent loops by disallowing recursive workflow triggers with that token.
# In this case, the created tag needs to trigger the "Build and Publish" workflow.
token: '${{ secrets.GH_TOKEN }}' token: '${{ secrets.GH_TOKEN }}'
+34 -21
View File
@@ -18,6 +18,7 @@ on:
- "zensical.toml" - "zensical.toml"
- ".readthedocs.yaml" - ".readthedocs.yaml"
- "renovate.json5" - "renovate.json5"
workflow_dispatch:
jobs: jobs:
build: build:
@@ -40,9 +41,13 @@ jobs:
include: include:
# JAVA 25 # JAVA 25
- variant: java25 - variant: java25
baseImage: eclipse-temurin:25-jre # NOTE: 25-jre is also Noble (currently), but this variant needs to be 25-jre-noble specifically to include riscv64
platforms: linux/amd64,linux/arm64 # Keep this aligned in verify-pr.yml also
baseImage: eclipse-temurin:25-jre-noble
platforms: linux/amd64,linux/arm64,linux/riscv64
mcVersion: latest mcVersion: latest
# forked build that include riscv64
knockdRepoOrg: Opvolger/knock
- variant: java25-alpine - variant: java25-alpine
baseImage: eclipse-temurin:25-jre-alpine baseImage: eclipse-temurin:25-jre-alpine
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
@@ -76,31 +81,35 @@ jobs:
platforms: linux/amd64,linux/arm/v7,linux/arm64 platforms: linux/amd64,linux/arm/v7,linux/arm64
mcVersion: 1.16.5 mcVersion: 1.16.5
# Pin version for pre-Java 17 # Pin version for pre-Java 17
mcHelperVersion: 1.51.3-java8 mcHelperVersion: 1.51.4-java8
# JAVA 11 # JAVA 11
- variant: java11 - variant: java11
baseImage: adoptopenjdk:11-jre-hotspot baseImage: adoptopenjdk:11-jre-hotspot
platforms: linux/amd64,linux/arm/v7,linux/arm64 platforms: linux/amd64,linux/arm/v7,linux/arm64
mcVersion: 1.16.4 mcVersion: 1.16.4
# Pin version for pre-Java 17 # Pin version for pre-Java 17
mcHelperVersion: 1.51.3-java8 mcHelperVersion: 1.51.4-java8
# JAVA 8: NOTE: Unable to go past 8u312 because of Forge dependencies # JAVA 8: NOTE: Unable to go past 8u312 because of Forge dependencies
- variant: java8 - variant: java8
baseImage: eclipse-temurin:8u312-b07-jre-focal baseImage: eclipse-temurin:8u312-b07-jre-focal
platforms: linux/amd64,linux/arm/v7,linux/arm64 platforms: linux/amd64,linux/arm/v7,linux/arm64
mcVersion: 1.12.2 mcVersion: 1.12.2
# Pin version for Java 8, also be sure to set in verify-pr.yml # Pin version for Java 8, also be sure to set in verify-pr.yml
mcHelperVersion: 1.51.3-java8 mcHelperVersion: 1.51.4-java8
- variant: java8-jdk - variant: java8-jdk
baseImage: eclipse-temurin:8u312-b07-jdk-focal baseImage: eclipse-temurin:8u312-b07-jdk-focal
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
mcVersion: 1.12.2 mcVersion: 1.12.2
# Pin version for Java 8, also be sure to set in verify-pr.yml # Pin version for Java 8, also be sure to set in verify-pr.yml
mcHelperVersion: 1.51.3-java8 mcHelperVersion: 1.51.4-java8
env: env:
# Assume they line up, but when forked change to your Docker Hub username
DOCKER_HUB_ORG: ${{ github.repository_owner }}
IMAGE_TO_TEST: "${{ github.repository_owner }}/minecraft-server:test-${{ matrix.variant }}-${{ github.run_id }}" IMAGE_TO_TEST: "${{ github.repository_owner }}/minecraft-server:test-${{ matrix.variant }}-${{ github.run_id }}"
HAS_IMAGE_REPO_ACCESS: ${{ secrets.DOCKER_USER != '' && secrets.DOCKER_PASSWORD != '' }} HAS_IMAGE_REPO_ACCESS: ${{ secrets.DOCKER_USER != '' && secrets.DOCKER_PASSWORD != '' }}
MAIN_VARIANT: java25 MAIN_VARIANT: java25
PUSH: ${{ github.repository_owner == 'itzg' }}
IMAGE_AUTHOR: "Geoff Bourne <itzgeoff@gmail.com>"
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- name: Checkout - name: Checkout
@@ -111,12 +120,10 @@ jobs:
- name: Docker meta - name: Docker meta
id: meta id: meta
uses: docker/metadata-action@v6.1.0 uses: docker/metadata-action@v6.2.0
with: with:
# NOTE for forks: if your Docker Hub organization doesn't match your Github repo's,
# then the use of ${{ github.repository_owner }} will need to be replaced.
images: | images: |
${{ github.repository_owner }}/minecraft-server ${{ env.DOCKER_HUB_ORG }}/minecraft-server
ghcr.io/${{ github.repository_owner }}/minecraft-server ghcr.io/${{ github.repository_owner }}/minecraft-server
tags: | tags: |
# Apply the variant as a moving tag for most recent commit per variant # Apply the variant as a moving tag for most recent commit per variant
@@ -138,13 +145,13 @@ jobs:
flavor: | flavor: |
latest=${{ matrix.variant == env.MAIN_VARIANT && github.ref_name == github.event.repository.default_branch }} latest=${{ matrix.variant == env.MAIN_VARIANT && github.ref_name == github.event.repository.default_branch }}
labels: | labels: |
org.opencontainers.image.authors=Geoff Bourne <itzgeoff@gmail.com> org.opencontainers.image.authors=${{ env.IMAGE_AUTHOR }}
- name: Setup Docker Buildx - name: Setup Docker Buildx
uses: docker/setup-buildx-action@v4 uses: docker/setup-buildx-action@v4
- name: Set up QEMU - name: Set up QEMU
uses: docker/setup-qemu-action@v4.1.0 uses: docker/setup-qemu-action@v4.2.0
- name: Build for test - name: Build for test
uses: docker/build-push-action@v7 uses: docker/build-push-action@v7
@@ -159,6 +166,7 @@ jobs:
build-args: | build-args: |
BASE_IMAGE=${{ matrix.baseImage }} BASE_IMAGE=${{ matrix.baseImage }}
${{ matrix.mcHelperVersion && format('MC_HELPER_VERSION={0}', matrix.mcHelperVersion) }} ${{ matrix.mcHelperVersion && format('MC_HELPER_VERSION={0}', matrix.mcHelperVersion) }}
${{ matrix.knockdRepoOrg && format('KNOCKD_REPO_ORG={0}', matrix.knockdRepoOrg) }}
cache-from: type=gha,scope=${{ matrix.variant }} cache-from: type=gha,scope=${{ matrix.variant }}
# no cache-to to avoid cross-cache update from next build step # no cache-to to avoid cross-cache update from next build step
@@ -172,14 +180,14 @@ jobs:
tests/test.sh tests/test.sh
- name: Login to DockerHub - name: Login to DockerHub
uses: docker/login-action@v4.2.0 uses: docker/login-action@v4.4.0
if: env.HAS_IMAGE_REPO_ACCESS if: env.HAS_IMAGE_REPO_ACCESS
with: with:
username: ${{ secrets.DOCKER_USER }} username: ${{ secrets.DOCKER_USER }}
password: ${{ secrets.DOCKER_PASSWORD }} password: ${{ secrets.DOCKER_PASSWORD }}
- name: Login to GHCR - name: Login to GHCR
uses: docker/login-action@v4.2.0 uses: docker/login-action@v4.4.0
if: env.HAS_IMAGE_REPO_ACCESS if: env.HAS_IMAGE_REPO_ACCESS
with: with:
registry: ghcr.io registry: ghcr.io
@@ -193,13 +201,16 @@ jobs:
platforms: ${{ matrix.platforms }} platforms: ${{ matrix.platforms }}
push: > push: >
${{ ${{
github.ref_type == 'tag' env.PUSH &&
|| github.ref_name == github.event.repository.default_branch (
|| startsWith(github.ref_name, 'test/') github.ref_type == 'tag'
|| ( github.event_name == 'pull_request' || github.ref_name == github.event.repository.default_branch
&& env.HAS_IMAGE_REPO_ACCESS || startsWith(github.ref_name, 'test/')
&& contains(github.event.pull_request.labels.*.name, 'ci/push-image') || ( github.event_name == 'pull_request'
) && env.HAS_IMAGE_REPO_ACCESS
&& contains(github.event.pull_request.labels.*.name, 'ci/push-image')
)
)
}} }}
tags: ${{ steps.meta.outputs.tags }} tags: ${{ steps.meta.outputs.tags }}
# ensure latest base image is used # ensure latest base image is used
@@ -215,5 +226,7 @@ jobs:
VERSION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }} VERSION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }}
REVISION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }} REVISION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
${{ matrix.mcHelperVersion && format('MC_HELPER_VERSION={0}', matrix.mcHelperVersion) }} ${{ matrix.mcHelperVersion && format('MC_HELPER_VERSION={0}', matrix.mcHelperVersion) }}
${{ matrix.knockdRepoOrg && format('KNOCKD_REPO_ORG={0}', matrix.knockdRepoOrg) }}
IMAGE_AUTHOR=${{ env.IMAGE_AUTHOR }}
cache-from: type=gha,scope=${{ matrix.variant }} cache-from: type=gha,scope=${{ matrix.variant }}
cache-to: type=gha,mode=max,scope=${{ matrix.variant }} cache-to: type=gha,mode=max,scope=${{ matrix.variant }}
+1
View File
@@ -16,6 +16,7 @@ jobs:
discord: discord:
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 5 timeout-minutes: 5
if: github.repository_owner == 'itzg'
steps: steps:
- name: on-publish - name: on-publish
if: github.event_name == 'release' && github.event.action == 'published' if: github.event_name == 'release' && github.event.action == 'published'
@@ -7,9 +7,13 @@ on:
- labeled - labeled
- unlabeled - unlabeled
- closed - closed
pull_request_target:
types:
- closed
- labeled
jobs: jobs:
notify: notify:
if: github.repository_owner == 'itzg'
uses: itzg/github-workflows/.github/workflows/issues-notify-discord.yml@main uses: itzg/github-workflows/.github/workflows/issues-notify-discord.yml@main
with: with:
triageLabel: 'status/needs triage' triageLabel: 'status/needs triage'
+1
View File
@@ -7,6 +7,7 @@ on:
jobs: jobs:
check: check:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
if: github.repository_owner == 'itzg'
permissions: permissions:
issues: write issues: write
pull-requests: write pull-requests: write
+12 -2
View File
@@ -29,25 +29,33 @@ jobs:
include: include:
# JAVA 21/25: # JAVA 21/25:
- variant: java25 - variant: java25
baseImage: eclipse-temurin:25-jre # stay aligned with build.yml
baseImage: eclipse-temurin:25-jre-noble
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
mcVersion: latest mcVersion: latest
- variant: java25-alpine - variant: java25-alpine
baseImage: eclipse-temurin:25-jre-alpine baseImage: eclipse-temurin:25-jre-alpine
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
mcVersion: latest mcVersion: latest
# For GLIBC_2.34 support (and Alpine)
knockdRepoOrg: Metalcape/knock
# JAVA 17: # JAVA 17:
- variant: java17 - variant: java17
# jammy doesn't work until minecraft updates to https://github.com/netty/netty/issues/12343 # jammy doesn't work until minecraft updates to https://github.com/netty/netty/issues/12343
baseImage: eclipse-temurin:17-jre-focal baseImage: eclipse-temurin:17-jre-focal
platforms: linux/amd64 platforms: linux/amd64
mcVersion: 1.20.4 mcVersion: 1.20.4
# For GLIBC_2.34 support
knockdRepoOrg: Metalcape/knock
# JAVA 8:
- variant: java8 - variant: java8
baseImage: eclipse-temurin:8u312-b07-jre-focal baseImage: eclipse-temurin:8u312-b07-jre-focal
platforms: linux/amd64 platforms: linux/amd64
mcVersion: 1.12.2 mcVersion: 1.12.2
# For GLIBC_2.34 support
knockdRepoOrg: Metalcape/knock
# Pin version for Java 8, be sure to also set in build.yml # Pin version for Java 8, be sure to also set in build.yml
mcHelperVersion: 1.51.3-java8 mcHelperVersion: 1.51.4-java8
env: env:
IMAGE_TO_TEST: ${{ github.repository_owner }}/minecraft-server:test-${{ matrix.variant }}-${{ github.run_id }} IMAGE_TO_TEST: ${{ github.repository_owner }}/minecraft-server:test-${{ matrix.variant }}-${{ github.run_id }}
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
@@ -70,6 +78,7 @@ jobs:
build-args: | build-args: |
BASE_IMAGE=${{ matrix.baseImage }} BASE_IMAGE=${{ matrix.baseImage }}
${{ matrix.mcHelperVersion && format('MC_HELPER_VERSION={0}', matrix.mcHelperVersion) }} ${{ matrix.mcHelperVersion && format('MC_HELPER_VERSION={0}', matrix.mcHelperVersion) }}
${{ matrix.knockdRepoOrg && format('KNOCKD_REPO_ORG={0}', matrix.knockdRepoOrg) }}
cache-from: type=gha,scope=${{ matrix.variant }} cache-from: type=gha,scope=${{ matrix.variant }}
- name: Build for test - name: Build for test
@@ -87,6 +96,7 @@ jobs:
build-args: | build-args: |
BASE_IMAGE=${{ matrix.baseImage }} BASE_IMAGE=${{ matrix.baseImage }}
${{ matrix.mcHelperVersion && format('MC_HELPER_VERSION={0}', matrix.mcHelperVersion) }} ${{ matrix.mcHelperVersion && format('MC_HELPER_VERSION={0}', matrix.mcHelperVersion) }}
${{ matrix.knockdRepoOrg && format('KNOCKD_REPO_ORG={0}', matrix.knockdRepoOrg) }}
cache-from: type=gha,scope=${{ matrix.variant }} cache-from: type=gha,scope=${{ matrix.variant }}
- name: Run tests - name: Run tests
+7 -5
View File
@@ -12,6 +12,8 @@ ARG EXTRA_DEB_PACKAGES=""
ARG EXTRA_DNF_PACKAGES="" ARG EXTRA_DNF_PACKAGES=""
ARG EXTRA_ALPINE_PACKAGES="" ARG EXTRA_ALPINE_PACKAGES=""
ARG FORCE_INSTALL_PACKAGES=1 ARG FORCE_INSTALL_PACKAGES=1
ARG KNOCKD_VERSION=0.8.1
ARG KNOCKD_REPO_ORG=Metalcape/knock
RUN --mount=target=/build,source=build \ RUN --mount=target=/build,source=build \
TARGET=${TARGETARCH}${TARGETVARIANT} \ TARGET=${TARGETARCH}${TARGETVARIANT} \
/build/run.sh install-packages /build/run.sh install-packages
@@ -26,12 +28,12 @@ ARG APPS_REV=1
ARG GITHUB_BASEURL=https://github.com ARG GITHUB_BASEURL=https://github.com
# renovate: datasource=github-releases packageName=itzg/easy-add # renovate: datasource=github-releases packageName=itzg/easy-add
ARG EASY_ADD_VERSION=0.8.14 ARG EASY_ADD_VERSION=0.8.15
ADD ${GITHUB_BASEURL}/itzg/easy-add/releases/download/${EASY_ADD_VERSION}/easy-add_${TARGETOS}_${TARGETARCH}${TARGETVARIANT} /usr/bin/easy-add 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 RUN chmod +x /usr/bin/easy-add
# renovate: datasource=github-releases packageName=itzg/restify # renovate: datasource=github-releases packageName=itzg/restify
ARG RESTIFY_VERSION=1.7.16 ARG RESTIFY_VERSION=1.7.17
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--var version=${RESTIFY_VERSION} --var app=restify --file {{.app}} \ --var version=${RESTIFY_VERSION} --var app=restify --file {{.app}} \
--from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz --from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
@@ -43,19 +45,19 @@ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz --from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
# renovate: datasource=github-releases packageName=itzg/mc-monitor # renovate: datasource=github-releases packageName=itzg/mc-monitor
ARG MC_MONITOR_VERSION=0.16.8 ARG MC_MONITOR_VERSION=0.16.11
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--var version=${MC_MONITOR_VERSION} --var app=mc-monitor --file {{.app}} \ --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 --from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
# renovate: datasource=github-releases packageName=itzg/mc-server-runner # renovate: datasource=github-releases packageName=itzg/mc-server-runner
ARG MC_SERVER_RUNNER_VERSION=1.15.0 ARG MC_SERVER_RUNNER_VERSION=1.15.1
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--var version=${MC_SERVER_RUNNER_VERSION} --var app=mc-server-runner --file {{.app}} \ --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 --from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
# renovate: datasource=github-releases packageName=itzg/mc-image-helper versioning=loose # renovate: datasource=github-releases packageName=itzg/mc-image-helper versioning=loose
ARG MC_HELPER_VERSION=1.61.1 ARG MC_HELPER_VERSION=1.62.1
ARG MC_HELPER_BASE_URL=${GITHUB_BASEURL}/itzg/mc-image-helper/releases/download/${MC_HELPER_VERSION} 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 # used for cache busting local copy of mc-image-helper
ARG MC_HELPER_REV=1 ARG MC_HELPER_REV=1
+3 -1
View File
@@ -17,6 +17,7 @@ apk add --no-cache -U \
bash \ bash \
curl \ curl \
iputils \ iputils \
iproute2 \
git \ git \
git-lfs \ git-lfs \
jq \ jq \
@@ -34,10 +35,11 @@ apk add --no-cache -U \
libcap \ libcap \
numactl \ numactl \
jattach \ jattach \
gcompat \
${EXTRA_ALPINE_PACKAGES} ${EXTRA_ALPINE_PACKAGES}
# Download and install patched knockd # Download and install patched knockd
curl -fsSL -o /tmp/knock.tar.gz https://github.com/Metalcape/knock/releases/download/0.8.1/knock-0.8.1-alpine-amd64.tar.gz curl -fsSL -o /tmp/knock.tar.gz "https://github.com/${KNOCKD_REPO_ORG}/releases/download/${KNOCKD_VERSION}/knock-${KNOCKD_VERSION}-alpine-amd64.tar.gz"
tar -xf /tmp/knock.tar.gz -C /usr/local/ && rm /tmp/knock.tar.gz tar -xf /tmp/knock.tar.gz -C /usr/local/ && rm /tmp/knock.tar.gz
ln -s /usr/local/sbin/knockd /usr/sbin/knockd ln -s /usr/local/sbin/knockd /usr/sbin/knockd
setcap cap_net_raw=ep /usr/local/sbin/knockd setcap cap_net_raw=ep /usr/local/sbin/knockd
+1
View File
@@ -33,6 +33,7 @@ dnf install -y \
sudo \ sudo \
net-tools \ net-tools \
iputils \ iputils \
iproute \
curl \ curl \
git \ git \
jq \ jq \
+2 -1
View File
@@ -14,6 +14,7 @@ apt-get install -y \
sudo \ sudo \
net-tools \ net-tools \
iputils-ping \ iputils-ping \
iproute2 \
curl \ curl \
git \ git \
git-lfs \ git-lfs \
@@ -37,7 +38,7 @@ apt-get install -y \
apt-get clean apt-get clean
# Download and install patched knockd # Download and install patched knockd
curl -fsSL -o /tmp/knock.tar.gz https://github.com/Metalcape/knock/releases/download/0.8.1/knock-0.8.1-$TARGET.tar.gz curl -fsSL -o /tmp/knock.tar.gz "https://github.com/${KNOCKD_REPO_ORG}/releases/download/${KNOCKD_VERSION}/knock-${KNOCKD_VERSION}-$TARGET.tar.gz"
tar -xf /tmp/knock.tar.gz -C /usr/local/ && rm /tmp/knock.tar.gz tar -xf /tmp/knock.tar.gz -C /usr/local/ && rm /tmp/knock.tar.gz
ln -s /usr/local/sbin/knockd /usr/sbin/knockd ln -s /usr/local/sbin/knockd /usr/sbin/knockd
setcap cap_net_raw=ep /usr/local/sbin/knockd setcap cap_net_raw=ep /usr/local/sbin/knockd
+11
View File
@@ -179,6 +179,10 @@ such as:
You may configure the use of an HTTP/HTTPS proxy by passing the proxy's "host:port" via the environment variable `PROXY`. In [the example compose file](https://github.com/itzg/docker-minecraft-server/blob/master/examples/proxied/compose.yml) it references a Squid proxy. The host and port can be separately passed via the environment variables `PROXY_HOST` and `PROXY_PORT`. A `|` delimited list of hosts to exclude from proxying can be passed via `PROXY_NON_PROXY_HOSTS`. You may configure the use of an HTTP/HTTPS proxy by passing the proxy's "host:port" via the environment variable `PROXY`. In [the example compose file](https://github.com/itzg/docker-minecraft-server/blob/master/examples/proxied/compose.yml) it references a Squid proxy. The host and port can be separately passed via the environment variables `PROXY_HOST` and `PROXY_PORT`. A `|` delimited list of hosts to exclude from proxying can be passed via `PROXY_NON_PROXY_HOSTS`.
## Prefer IPv6 Addresses and Stack
The image can be configured to prefer IPv6 addresses and stack by setting the environment variable `PREFER_IPV6` to "true". This will ensure the Java properties `java.net.preferIPv6Addresses` and `java.net.preferIPv6Stack` are set accordingly for mc-image-helper and the Minecraft server process.
## Using "noconsole" option ## Using "noconsole" option
Some older versions (pre-1.14) of Spigot required `--noconsole` to be passed when detaching stdin, which can be done by setting `-e CONSOLE=FALSE`. Some older versions (pre-1.14) of Spigot required `--noconsole` to be passed when detaching stdin, which can be done by setting `-e CONSOLE=FALSE`.
@@ -198,6 +202,13 @@ Be sure to also increase the shutdown timeout described [here for docker compose
If you are using a host-attached data directory, then you can have the image setup the Minecraft server files and stop prior to launching the server process by setting `SETUP_ONLY` to `true`. If you are using a host-attached data directory, then you can have the image setup the Minecraft server files and stop prior to launching the server process by setting `SETUP_ONLY` to `true`.
## Custom server runner
By default, the image finishes startup by exec'ing [mc-server-runner](https://github.com/itzg/mc-server-runner) to run the Minecraft server itself. This can be replaced by setting the environment variable `SERVER_RUNNER`. The arguments passed will start with ones specific to mc-server-runner, followed by `--`, and then the actual `java -jar` arguments or equivalent server entry script, such as `run.sh` for Forge.
> [!TIP]
> The `SERVER_RUNNER` variable is expanded when passed to `exec` so that `mc-server-runner` can be wrapped by another executable that is mounted into the container.
## Enable Flare Flags ## Enable Flare Flags
To enable the JVM flags required to fully support the [Flare profiling suite](https://blog.airplane.gg/flare), set the following variable: To enable the JVM flags required to fully support the [Flare profiling suite](https://blog.airplane.gg/flare), set the following variable:
+8 -1
View File
@@ -51,4 +51,11 @@ When exec'ed interactively into the container, jattach can be invoked against th
```shell ```shell
jattach $(pgrep java) threaddump jattach $(pgrep java) threaddump
``` ```
## Networking errors
If observing network error/exceptions that involve the term "reactor.netty.http.client", then further tracing logs can be enabled by setting the following environment variables:
- `FETCH_WIRETAP` to `true`
- `HELPER_LOGGING_LEVEL` to `trace`
+2 -2
View File
@@ -4,9 +4,9 @@ Mods and plugins can be auto-downloaded and upgraded from CurseForge by setting
A specific file can be omitted from each reference to allow for auto-selecting the newest version of the selected mod/plugin. The resolved `VERSION` and `TYPE` will be taken into consideration for selecting the appropriate file. A specific file can be omitted from each reference to allow for auto-selecting the newest version of the selected mod/plugin. The resolved `VERSION` and `TYPE` will be taken into consideration for selecting the appropriate file.
!!! warning "CurseForge API key usage" !!! info "CurseForge API key usage"
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). A CurseForge API key is _now_ included by this image; however, you can always supply your own instead. A CurseForge API key can 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 ## Project-file references
+20
View File
@@ -151,6 +151,26 @@ GENERIC_PACKS_SUFFIX=.zip
would expand to `https://cdn.example.org/configs-v9.0.1.zip,https://cdn.example.org/mods-v4.3.6.zip`. would expand to `https://cdn.example.org/configs-v9.0.1.zip,https://cdn.example.org/mods-v4.3.6.zip`.
### Generic packs from an OCI registry
An entry can also reference a pack stored as an [OCI](https://opencontainers.org/) artifact in a container registry by prefixing it with `oci://`. The reference may use a tag or an immutable `@sha256:` digest:
```
GENERIC_PACKS=oci://ghcr.io/itzg/oci-modpack-template/tech:latest,oci://ghcr.io/itzg/oci-modpack-template/magic:latest
```
OCI, URL, and local-path entries can be mixed in the same list and are applied in the order given. Each artifact's layers are pulled into a content-addressed cache under `/data/packs/oci`, so a digest already on disk (for example a base layer shared between packs) is not downloaded again. `GENERIC_PACKS_PREFIX`/`GENERIC_PACKS_SUFFIX`, `GENERIC_PACKS_DISABLE_MODS`, and the update/checksum behaviour below all apply to OCI entries exactly as they do to URLs.
The artifact must be a Minecraft modpack artifact (artifact type `application/vnd.itzg.minecraft.modpack.v1+json` with `…modpack.layer.v1.tar+gzip` layers); any other reference is rejected before its contents touch `/data`. Validation and registry authentication are handled by `mc-image-helper`.
For a private registry, point `GENERIC_PACKS_OCI_AUTH_FILE` at a registry login file (the `auth.json`/`config.json` produced by `docker login`, `podman login`, etc.):
```
GENERIC_PACKS_OCI_AUTH_FILE=/run/secrets/registry-auth.json
```
When it is unset, a credentials file at `~/.config/containers/auth.json` or `~/.docker/config.json` is used if present, otherwise the pull is anonymous.
If applying large generic packs, the update can be time-consuming. To skip the update set `SKIP_GENERIC_PACK_UPDATE_CHECK` to "true". Conversely, the generic pack(s) can be forced to be applied by setting `FORCE_GENERIC_PACK_UPDATE` to "true". If applying large generic packs, the update can be time-consuming. To skip the update set `SKIP_GENERIC_PACK_UPDATE_CHECK` to "true". Conversely, the generic pack(s) can be forced to be applied by setting `FORCE_GENERIC_PACK_UPDATE` to "true".
The most time-consuming portion of the generic pack update is generating and comparing the SHA1 checksum. To skip the checksum generation, set `SKIP_GENERIC_PACK_CHECKSUM` to "true". The most time-consuming portion of the generic pack update is generating and comparing the SHA1 checksum. To skip the checksum generation, set `SKIP_GENERIC_PACK_CHECKSUM` to "true".
+3 -3
View File
@@ -10,16 +10,16 @@ mergedeep==1.3.4
mkdocs==1.6.1 mkdocs==1.6.1
mkdocs-autorefs==1.4.4 mkdocs-autorefs==1.4.4
mkdocs-get-deps==0.2.2 mkdocs-get-deps==0.2.2
mkdocstrings==1.0.4 mkdocstrings==1.0.6
mkdocstrings-python==2.0.5 mkdocstrings-python==2.0.5
packaging==26.2 packaging==26.2
pathspec==1.1.1 pathspec==1.1.1
platformdirs==4.10.0 platformdirs==4.10.0
Pygments==2.20.0 Pygments==2.20.0
pymdown-extensions==11.0 pymdown-extensions==11.0.1
python-dateutil==2.9.0.post0 python-dateutil==2.9.0.post0
PyYAML==6.0.3 PyYAML==6.0.3
pyyaml_env_tag==1.1 pyyaml_env_tag==1.1
six==1.17.0 six==1.17.0
watchdog==6.0.0 watchdog==6.0.0
zensical==0.0.46 zensical==0.0.50
@@ -4,9 +4,9 @@ To manage a CurseForge modpack automatically with upgrade support, pinned or lat
## API Key ## API Key
!!! warning "CurseForge API key usage" !!! info "CurseForge API key usage"
A CurseForge API key is **required** to use this feature. Go to their [developer console](https://console.curseforge.com/), generate an API key, and set the environment variable `CF_API_KEY`. A CurseForge API key is _now_ included by this image; however, you can always supply your own instead. Go to their [developer console](https://console.curseforge.com/), generate an API key, and set the environment variable `CF_API_KEY`.
When entering your API Key in a docker compose file you will need to escape any `$` character with a second `$`. Refer to [this compose file reference section](https://docs.docker.com/compose/compose-file/compose-file-v3/#variable-substitution) for more information. When entering your API Key in a docker compose file you will need to escape any `$` character with a second `$`. Refer to [this compose file reference section](https://docs.docker.com/compose/compose-file/compose-file-v3/#variable-substitution) for more information.
@@ -79,13 +79,11 @@ Pass a page URL to the modpack or a specific file with `CF_PAGE_URL` such as the
environment: environment:
# ... # ...
MODPACK_PLATFORM: AUTO_CURSEFORGE MODPACK_PLATFORM: AUTO_CURSEFORGE
# allocate from https://console.curseforge.com/ and set in .env file
CF_API_KEY: ${CF_API_KEY}
CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/all-the-mods-8 CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/all-the-mods-8
``` ```
```title="Using docker run" ```title="Using docker run"
docker run -e CF_API_KEY=${CF_API_KEY} -e TYPE=AUTO_CURSEFORGE -e CF_PAGE_URL=https://www.curseforge.com/minecraft/modpacks/all-the-mods-8 docker run -e TYPE=AUTO_CURSEFORGE -e CF_PAGE_URL=https://www.curseforge.com/minecraft/modpacks/all-the-mods-8
``` ```
Instead of a URL, the modpack slug can be provided as `CF_SLUG`. The slug is the short identifier visible in the URL after "/modpacks/", such as Instead of a URL, the modpack slug can be provided as `CF_SLUG`. The slug is the short identifier visible in the URL after "/modpacks/", such as
@@ -98,13 +96,11 @@ Instead of a URL, the modpack slug can be provided as `CF_SLUG`. The slug is the
environment: environment:
# ... # ...
MODPACK_PLATFORM: AUTO_CURSEFORGE MODPACK_PLATFORM: AUTO_CURSEFORGE
# allocate from https://console.curseforge.com/ and set in .env file
CF_API_KEY: ${CF_API_KEY}
CF_SLUG: all-the-mods-8 CF_SLUG: all-the-mods-8
``` ```
```title="Using docker run" ```title="Using docker run"
docker run -e CF_API_KEY=${CF_API_KEY} -e TYPE=AUTO_CURSEFORGE -e CF_SLUG=all-the-mods-8 docker run -e TYPE=AUTO_CURSEFORGE -e CF_SLUG=all-the-mods-8
``` ```
### Pinning modpack and mod loader versions ### Pinning modpack and mod loader versions
@@ -148,7 +144,6 @@ By default, AUTO_CURSEFORGE will use the exact modloader version declared by the
```yaml ```yaml
environment: environment:
MODPACK_PLATFORM: AUTO_CURSEFORGE MODPACK_PLATFORM: AUTO_CURSEFORGE
CF_API_KEY: ${CF_API_KEY}
CF_SLUG: all-the-mods-8 CF_SLUG: all-the-mods-8
CF_MOD_LOADER_VERSION: "43.4.22" CF_MOD_LOADER_VERSION: "43.4.22"
``` ```
@@ -197,8 +192,6 @@ If you wish to use an unpublished modpack zip, set the container path to the fil
environment: environment:
EULA: true EULA: true
MODPACK_PLATFORM: AUTO_CURSEFORGE MODPACK_PLATFORM: AUTO_CURSEFORGE
# allocate from https://console.curseforge.com/ and set in .env file
CF_API_KEY: ${CF_API_KEY}
CF_MODPACK_MANIFEST: /manifests/manifest.json CF_MODPACK_MANIFEST: /manifests/manifest.json
CF_SLUG: "custom" CF_SLUG: "custom"
volumes: volumes:
@@ -35,7 +35,7 @@ For optimal performance choose java25 with GTNH 2.8.0 and later.
## Config backups ## Config backups
During version upgrade, the server will replace all config files to make sure all new features are setup as intended. The old config files are stored in a backup folder in the data directory, for you to use as reference for manual reapplication of your changed settings. Set the environment variable `GTNH_DELETE_BACKUPS` to true to delete all backup folders at startup. During version upgrade, the server will replace all config files to make sure all new features are setup as intended. The old config files are stored in a backup folder in the data directory, for you to use as reference for manual reapplication of your changed settings. The folder name starts with `gtnh-upgrade-` followed by a timestamp. Set the environment variable `GTNH_DELETE_BACKUPS` to true to delete all backup folders at startup.
## server.properties defaults ## server.properties defaults
+14 -14
View File
@@ -10,20 +10,20 @@ or explicitly include the tag, such as
where `<tag>` refers to the first column of this table: where `<tag>` refers to the first column of this table:
| Tag | Java version | Linux | JVM Type | Architecture | Note | | Tag | Java version | Linux | JVM Type | Architecture | Note |
|----------------|--------------|--------|--------------------|---------------------|------| |---------------|--------------|--------|-------------|-----------------------|------|
| latest | 25 | Ubuntu | Hotspot | amd64, arm64 | | | latest | 25 | Ubuntu | Hotspot | amd64, arm64, riscv64 | |
| stable | 25 | Ubuntu | Hotspot | amd64, arm64 | | | stable | 25 | Ubuntu | Hotspot | amd64, arm64, riscv64 | |
| java25 | 25 | Ubuntu | Hotspot | amd64, arm64 | | | java25 | 25 | Ubuntu | Hotspot | amd64, arm64, riscv64 | |
| java25-alpine | 25 | Alpine | Hotspot | amd64, arm64 | | | java25-alpine | 25 | Alpine | Hotspot | amd64, arm64 | |
| java25-jdk | 25 | Ubuntu | Hotspot+JDK | amd64, arm64 | | | java25-jdk | 25 | Ubuntu | Hotspot+JDK | amd64, arm64 | |
| java21 | 21 | Ubuntu | Hotspot | amd64, arm64 | | | java21 | 21 | Ubuntu | Hotspot | amd64, arm64 | |
| java21-jdk | 21 | Ubuntu | Hotspot+JDK | amd64, arm64 | | | java21-jdk | 21 | Ubuntu | Hotspot+JDK | amd64, arm64 | |
| java21-alpine | 21 | Alpine | Hotspot | amd64, arm64 | | | java21-alpine | 21 | Alpine | Hotspot | amd64, arm64 | |
| java17 | 17 | Ubuntu | Hotspot | amd64, arm64, armv7 | | | java17 | 17 | Ubuntu | Hotspot | amd64, arm64, armv7 | |
| java16 | 16 | Ubuntu | Hotspot | amd64, arm64, armv7 | (1) | | java16 | 16 | Ubuntu | Hotspot | amd64, arm64, armv7 | (1) |
| java11 | 11 | Ubuntu | Hotspot | amd64, arm64, armv7 | | | java11 | 11 | Ubuntu | Hotspot | amd64, arm64, armv7 | |
| java8 | 8 | Ubuntu | Hotspot | amd64, arm64, armv7 | | | java8 | 8 | Ubuntu | Hotspot | amd64, arm64, armv7 | |
Notes Notes
@@ -4,11 +4,6 @@ services:
environment: environment:
EULA: true EULA: true
MODPACK_PLATFORM: AUTO_CURSEFORGE MODPACK_PLATFORM: AUTO_CURSEFORGE
# 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$$....
# Refer to https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/#api-key
CF_API_KEY: ${CF_API_KEY}
CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/all-of-fabric-7 CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/all-of-fabric-7
# CF_FILENAME_MATCHER: 1.2.2 # CF_FILENAME_MATCHER: 1.2.2
CF_OVERRIDES_EXCLUSIONS: | CF_OVERRIDES_EXCLUSIONS: |
@@ -8,11 +8,6 @@ services:
environment: environment:
EULA: true EULA: true
MOD_PLATFORM: AUTO_CURSEFORGE MOD_PLATFORM: AUTO_CURSEFORGE
# 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$$....
# Refer to https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/#api-key
CF_API_KEY: ${CF_API_KEY}
CF_SLUG: all-the-mods-10 CF_SLUG: all-the-mods-10
# Optional: select a specific version/file # Optional: select a specific version/file
# CF_FILENAME_MATCHER: "1.17" # CF_FILENAME_MATCHER: "1.17"
@@ -6,11 +6,6 @@ services:
environment: environment:
EULA: "true" EULA: "true"
MODPACK_PLATFORM: AUTO_CURSEFORGE MODPACK_PLATFORM: AUTO_CURSEFORGE
# 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$$....
# Refer to https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/#api-key
CF_API_KEY: ${CF_API_KEY}
CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/all-the-mods-8 CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/all-the-mods-8
# CF_FILENAME_MATCHER: "1.1.0" # CF_FILENAME_MATCHER: "1.1.0"
MEMORY: 4G MEMORY: 4G
@@ -6,11 +6,6 @@ services:
environment: environment:
EULA: "true" EULA: "true"
MODPACK_PLATFORM: AUTO_CURSEFORGE MODPACK_PLATFORM: AUTO_CURSEFORGE
# 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$$....
# Refer to https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/#api-key
CF_API_KEY: ${CF_API_KEY}
CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/all-the-mods-9 CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/all-the-mods-9
# Optional: select a specific version/file # Optional: select a specific version/file
#CF_FILENAME_MATCHER: "0.2.34" #CF_FILENAME_MATCHER: "0.2.34"
@@ -9,7 +9,6 @@ services:
EULA: true EULA: true
ALLOW_FLIGHT: true ALLOW_FLIGHT: true
MOD_PLATFORM: AUTO_CURSEFORGE MOD_PLATFORM: AUTO_CURSEFORGE
CF_API_KEY: ${CF_API_KEY}
CF_SLUG: craftoria CF_SLUG: craftoria
MOTD: | MOTD: |
A %TYPE% server on %VERSION% A %TYPE% server on %VERSION%
@@ -4,8 +4,6 @@ services:
environment: environment:
EULA: "TRUE" EULA: "TRUE"
MODPACK_PLATFORM: AUTO_CURSEFORGE MODPACK_PLATFORM: AUTO_CURSEFORGE
# Allocate API key from https://console.curseforge.com/
CF_API_KEY: ${CF_API_KEY}
# Example of overriding modloader version for a Fabric modpack # Example of overriding modloader version for a Fabric modpack
# Refer to https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/#api-key # Refer to https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/#api-key
CF_SLUG: "cobblemon-fabric" CF_SLUG: "cobblemon-fabric"
@@ -9,11 +9,6 @@ services:
environment: environment:
EULA: "TRUE" EULA: "TRUE"
TYPE: AUTO_CURSEFORGE TYPE: AUTO_CURSEFORGE
# 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$$....
# Refer to https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/#api-key
CF_API_KEY: ${CF_API_KEY}
CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/ftb-evolution CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/ftb-evolution
# This modpack includes an override client-side only mod that will prevent the server from starting. # This modpack includes an override client-side only mod that will prevent the server from starting.
# For more information on override exclusions see: # For more information on override exclusions see:
@@ -4,11 +4,6 @@ services:
environment: environment:
EULA: true EULA: true
MODPACK_PLATFORM: AUTO_CURSEFORGE MODPACK_PLATFORM: AUTO_CURSEFORGE
# 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$$....
# Refer to https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/#api-key
CF_API_KEY: ${CF_API_KEY}
CF_MODPACK_MANIFEST: /manifests/manifest.json CF_MODPACK_MANIFEST: /manifests/manifest.json
CF_SLUG: "custom" CF_SLUG: "custom"
MEMORY: 2G MEMORY: 2G
@@ -6,11 +6,6 @@ services:
environment: environment:
EULA: "true" EULA: "true"
MODPACK_PLATFORM: AUTO_CURSEFORGE MODPACK_PLATFORM: AUTO_CURSEFORGE
# 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$$....
# Refer to https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/#api-key
CF_API_KEY: ${CF_API_KEY}
CF_SLUG: one-block-modded CF_SLUG: one-block-modded
# Modpack client zip must be manually downloaded from # Modpack client zip must be manually downloaded from
# https://www.curseforge.com/minecraft/modpacks/one-block-modded # https://www.curseforge.com/minecraft/modpacks/one-block-modded
@@ -6,11 +6,6 @@ services:
environment: environment:
EULA: "true" EULA: "true"
MODPACK_PLATFORM: AUTO_CURSEFORGE MODPACK_PLATFORM: AUTO_CURSEFORGE
# 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$$....
# Refer to https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/#api-key
CF_API_KEY: ${CF_API_KEY}
CF_SLUG: the-pixelmon-modpack CF_SLUG: the-pixelmon-modpack
CF_FILENAME_MATCHER: "9.1.2" CF_FILENAME_MATCHER: "9.1.2"
MEMORY: 4G MEMORY: 4G
@@ -6,11 +6,6 @@ services:
environment: environment:
EULA: "true" EULA: "true"
MODPACK_PLATFORM: AUTO_CURSEFORGE MODPACK_PLATFORM: AUTO_CURSEFORGE
# 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$$....
# Refer to https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/#api-key
CF_API_KEY: ${CF_API_KEY}
CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/prominence-2-rpg CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/prominence-2-rpg
CF_FILENAME_MATCHER: "2.8.7" CF_FILENAME_MATCHER: "2.8.7"
MEMORY: 4G MEMORY: 4G
@@ -7,11 +7,6 @@ services:
environment: environment:
EULA: "true" EULA: "true"
MODPACK_PLATFORM: AUTO_CURSEFORGE MODPACK_PLATFORM: AUTO_CURSEFORGE
# 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$$....
# Refer to https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/#api-key
CF_API_KEY: ${CF_API_KEY}
CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/roguelike-adventures-and-dungeons-2 CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/roguelike-adventures-and-dungeons-2
# Optional: select a specific version/file # Optional: select a specific version/file
#CF_FILENAME_MATCHER: "0.2.34" #CF_FILENAME_MATCHER: "0.2.34"
@@ -6,7 +6,6 @@ services:
MODPACK_PLATFORM: AUTO_CURSEFORGE MODPACK_PLATFORM: AUTO_CURSEFORGE
CF_SLUG: skyfactory-4 CF_SLUG: skyfactory-4
CF_FILENAME_MATCHER: 4.2.4 CF_FILENAME_MATCHER: 4.2.4
CF_API_KEY: ${CF_API_KEY}
MEMORY: 3G MEMORY: 3G
ports: ports:
- "25565:25565" - "25565:25565"
@@ -10,11 +10,6 @@ services:
# Comment out the following to get the latest version or pick a version from # 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 # https://www.curseforge.com/minecraft/modpacks/skyfactory-5/files/all?page=1&pageSize=20
CF_FILENAME_MATCHER: 5.0.8 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$$....
# Refer to https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/#api-key
CF_API_KEY: ${CF_API_KEY}
MEMORY: 4G MEMORY: 4G
ports: ports:
- "25565:25565" - "25565:25565"
@@ -6,11 +6,6 @@ services:
environment: environment:
EULA: "true" EULA: "true"
MODPACK_PLATFORM: AUTO_CURSEFORGE MODPACK_PLATFORM: AUTO_CURSEFORGE
# 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$$....
# Refer to https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/#api-key
CF_API_KEY: ${CF_API_KEY}
CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/minecraft-eternal/files/4102634 CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/minecraft-eternal/files/4102634
MEMORY: 4G MEMORY: 4G
volumes: volumes:
@@ -6,11 +6,6 @@ services:
environment: environment:
EULA: "true" EULA: "true"
MODPACK_PLATFORM: AUTO_CURSEFORGE MODPACK_PLATFORM: AUTO_CURSEFORGE
# 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$$....
# Refer to https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/#api-key
CF_API_KEY: ${CF_API_KEY}
CF_FORCE_SYNCHRONIZE: "true" CF_FORCE_SYNCHRONIZE: "true"
CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/valhelsia-5/files/4429560 CF_PAGE_URL: https://www.curseforge.com/minecraft/modpacks/valhelsia-5/files/4429560
MEMORY: 4G MEMORY: 4G
@@ -6,11 +6,6 @@ services:
environment: environment:
EULA: "true" EULA: "true"
MODPACK_PLATFORM: AUTO_CURSEFORGE MODPACK_PLATFORM: AUTO_CURSEFORGE
# 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$$....
# Refer to https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/#api-key
CF_API_KEY: ${CF_API_KEY}
CF_SLUG: vault-hunters-1-18-2 CF_SLUG: vault-hunters-1-18-2
MOTD: "§4----- §2 Vault Hunters: 1.18.2 §4 -----§r\\n §4------ §e vaulthunters.gg §4------" MOTD: "§4----- §2 Vault Hunters: 1.18.2 §4 -----§r\\n §4------ §e vaulthunters.gg §4------"
MEMORY: 6G # 4G for base server + 2G per player MEMORY: 6G # 4G for base server + 2G per player
-5
View File
@@ -4,11 +4,6 @@ services:
environment: environment:
EULA: true EULA: true
MODPACK_PLATFORM: AUTO_CURSEFORGE MODPACK_PLATFORM: AUTO_CURSEFORGE
# 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$$....
# Refer to https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/#api-key
CF_API_KEY: ${CF_API_KEY}
CF_SLUG: better-mc-fabric-bmc1 CF_SLUG: better-mc-fabric-bmc1
# CF_FILENAME_MATCHER: v18.5 # CF_FILENAME_MATCHER: v18.5
MEMORY: 4G MEMORY: 4G
@@ -4,11 +4,6 @@ services:
environment: environment:
EULA: true EULA: true
TYPE: FORGE TYPE: FORGE
# 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$$....
# Refer to https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/#api-key
CF_API_KEY: ${CF_API_KEY}
VERSION: 1.19.2 VERSION: 1.19.2
CURSEFORGE_FILES: | CURSEFORGE_FILES: |
geckolib # some comment geckolib # some comment
+2 -6
View File
@@ -1,6 +1,7 @@
name: mc-rconcmd
services: services:
minecraft: minecraft:
image: ${IMAGE_TO_TEST:-itzg/minecraft-server} image: itzg/minecraft-server
ports: ports:
- "25565:25565" - "25565:25565"
volumes: volumes:
@@ -12,11 +13,6 @@ services:
CURSEFORGE_FILES: | CURSEFORGE_FILES: |
fabric-api fabric-api
chunky-pregenerator chunky-pregenerator
# 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$$....
# Refer to https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/#api-key
CF_API_KEY: ${CF_API_KEY}
# YAML Heredoc, be sure to use '|-' this will remove the first newline and final new line. # YAML Heredoc, be sure to use '|-' this will remove the first newline and final new line.
# This is versus '|' that will leaving with two empty strings at top and bottom. # This is versus '|' that will leaving with two empty strings at top and bottom.
RCON_CMDS_STARTUP: |- RCON_CMDS_STARTUP: |-
-5
View File
@@ -5,11 +5,6 @@ services:
EULA: true EULA: true
TYPE: KETTING TYPE: KETTING
VERSION: 1.20.1 VERSION: 1.20.1
# 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$$....
# Refer to https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/#api-key
CF_API_KEY: "${CF_API_KEY}"
CURSEFORGE_FILES: https://www.curseforge.com/minecraft/mc-mods/aquaculture CURSEFORGE_FILES: https://www.curseforge.com/minecraft/mc-mods/aquaculture
ports: ports:
- "25565:25565" - "25565:25565"
-5
View File
@@ -4,11 +4,6 @@ services:
environment: environment:
EULA: true EULA: true
MODPACK_PLATFORM: AUTO_CURSEFORGE MODPACK_PLATFORM: AUTO_CURSEFORGE
# 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$$....
# Refer to https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/mod-platforms/auto-curseforge/#api-key
CF_API_KEY: ${CF_API_KEY}
CF_SLUG: rlcraft CF_SLUG: rlcraft
CF_FILENAME_MATCHER: 2.9.3 CF_FILENAME_MATCHER: 2.9.3
CF_FORCE_SYNCHRONIZE: true CF_FORCE_SYNCHRONIZE: true
+3 -3
View File
@@ -5,7 +5,7 @@
"java": "25", "java": "25",
"distribution": "ubuntu", "distribution": "ubuntu",
"jvm": "hotspot", "jvm": "hotspot",
"architectures": ["amd64", "arm64"], "architectures": ["amd64", "arm64", "riscv64"],
"lts": true "lts": true
}, },
{ {
@@ -14,7 +14,7 @@
"java": "25", "java": "25",
"distribution": "ubuntu", "distribution": "ubuntu",
"jvm": "hotspot", "jvm": "hotspot",
"architectures": ["amd64", "arm64"], "architectures": ["amd64", "arm64", "riscv64"],
"lts": true "lts": true
}, },
{ {
@@ -22,7 +22,7 @@
"java": "25", "java": "25",
"distribution": "ubuntu", "distribution": "ubuntu",
"jvm": "hotspot", "jvm": "hotspot",
"architectures": ["amd64", "arm64"] "architectures": ["amd64", "arm64", "riscv64"]
}, },
{ {
"tag": "java25-alpine", "tag": "java25-alpine",
+12
View File
@@ -7,6 +7,7 @@ IFS=$'\n\t'
: "${EULA:=}" : "${EULA:=}"
: "${PROXY:=}" : "${PROXY:=}"
: "${PREFER_IPV6:=false}"
: "${ENABLE_AUTOPAUSE:=false}" : "${ENABLE_AUTOPAUSE:=false}"
: "${ENABLE_AUTOSTOP:=false}" : "${ENABLE_AUTOSTOP:=false}"
: "${RCON_CMDS_STARTUP:=}" : "${RCON_CMDS_STARTUP:=}"
@@ -28,11 +29,22 @@ shopt -s nullglob
isDebugging && set -x isDebugging && set -x
if isTrue "$PREFER_IPV6"; then
MC_IMAGE_HELPER_OPTS+="-Djava.net.preferIPv6Addresses=true -Djava.net.preferIPv6Stack=true"
export MC_IMAGE_HELPER_OPTS
JVM_DD_OPTS+="java.net.preferIPv6Addresses=true java.net.preferIPv6Stack=true"
export JVM_DD_OPTS
fi
if (( $(mc-image-helper java-release) >= 17 )); then if (( $(mc-image-helper java-release) >= 17 )); then
MC_IMAGE_HELPER_OPTS+=" --enable-native-access=ALL-UNNAMED" MC_IMAGE_HELPER_OPTS+=" --enable-native-access=ALL-UNNAMED"
export MC_IMAGE_HELPER_OPTS export MC_IMAGE_HELPER_OPTS
fi fi
if [[ $(getDistro) == alpine ]]; then
export LD_PRELOAD=/lib/libgcompat.so.0
fi
export HOME=/data export HOME=/data
log "Running as uid=$(id -u) gid=$(id -g) with /data as '$(ls -lnd /data)'" log "Running as uid=$(id -u) gid=$(id -g) with /data as '$(ls -lnd /data)'"
+2
View File
@@ -24,6 +24,7 @@ set -eu
: "${CF_API_CACHE_DEFAULT_TTL:=}" # as ISO-8601 duration, such as P2D or PT12H : "${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 : "${CF_API_KEY_FILE:=}" # Path to file containing CurseForge API key
: "${CF_MOD_LOADER_VERSION:=}" # Override mod loader version : "${CF_MOD_LOADER_VERSION:=}" # Override mod loader version
: "${CF_USE_HTTP2:=false}" # CF downloads are faster with HTTP 1.1
resultsFile=/data/.install-curseforge.env resultsFile=/data/.install-curseforge.env
@@ -46,6 +47,7 @@ args=(
--force-synchronize="$CF_FORCE_SYNCHRONIZE" --force-synchronize="$CF_FORCE_SYNCHRONIZE"
--force-reinstall-modloader="$CF_FORCE_REINSTALL_MODLOADER" --force-reinstall-modloader="$CF_FORCE_REINSTALL_MODLOADER"
--overrides-skip-existing="$CF_OVERRIDES_SKIP_EXISTING" --overrides-skip-existing="$CF_OVERRIDES_SKIP_EXISTING"
--use-http2="$CF_USE_HTTP2"
) )
setArg() { setArg() {
arg="${1?}" arg="${1?}"
+119 -92
View File
@@ -7,13 +7,14 @@
function getGTNHdownloadPath(){ function getGTNHdownloadPath(){
gtnh_download_path="" gtnh_download_path=""
local release_object="" local release_object=""
local current_java_version=$(mc-image-helper java-release) local current_java_version=""
current_java_version=$(mc-image-helper java-release)
# Select release JSON object # Select release JSON object
if [ "$GTNH_PACK_VERSION" == "latest-dev" ]; then if [ "$GTNH_PACK_VERSION" == "latest-dev" ]; then
if ! release_object="$( if ! release_object="$(
curl -fsSL "https://downloads.gtnewhorizons.com/versions.json" \ curl -fsSL "https://downloads.gtnewhorizons.com/versions.json" \
| jq -r '.versions|to_entries|sort_by(.value.releaseDate)|map(select(.value.title=="Beta release"))|.[-1]' | jq -r '(.versions // .)|to_entries|sort_by(.value.releaseDate)|map(select(.value.title=="Beta release"))|.[-1]'
)"; then logError "Failed to retrieve release from https://downloads.gtnewhorizons.com/versions.json" )"; then logError "Failed to retrieve release from https://downloads.gtnewhorizons.com/versions.json"
exit 1 exit 1
fi fi
@@ -22,7 +23,7 @@ function getGTNHdownloadPath(){
elif [ "$GTNH_PACK_VERSION" == "latest" ]; then elif [ "$GTNH_PACK_VERSION" == "latest" ]; then
if ! release_object="$( if ! release_object="$(
curl -fsSL "https://downloads.gtnewhorizons.com/versions.json" \ curl -fsSL "https://downloads.gtnewhorizons.com/versions.json" \
| jq -r '.versions|to_entries|sort_by(.value.releaseDate)|map(select(.value.title=="Stable release"))|.[-1]' | jq -r '(.versions // .)|to_entries|sort_by(.value.releaseDate)|map(select(.value.title=="Stable release"))|.[-1]'
)"; then logError "Failed to retrieve release from https://downloads.gtnewhorizons.com/versions.json" )"; then logError "Failed to retrieve release from https://downloads.gtnewhorizons.com/versions.json"
exit 1 exit 1
fi fi
@@ -31,13 +32,18 @@ function getGTNHdownloadPath(){
else else
if ! release_object="$( if ! release_object="$(
curl -fsSL "https://downloads.gtnewhorizons.com/versions.json" \ curl -fsSL "https://downloads.gtnewhorizons.com/versions.json" \
| jq -r --arg USRIN "$GTNH_PACK_VERSION" '.versions|to_entries|sort_by(.value.releaseDate)|map(select(.key==$USRIN))|.[]' | jq -r --arg USRIN "$GTNH_PACK_VERSION" '(.versions // .)|to_entries|sort_by(.value.releaseDate)|map(select(.key==$USRIN))|.[]'
)"; then logError "Failed to retrieve release from https://downloads.gtnewhorizons.com/versions.json" )"; then logError "Failed to retrieve release from https://downloads.gtnewhorizons.com/versions.json"
exit 1 exit 1
fi fi
log "Selected $(jq -r '.key' <<< "$release_object") as matching version for download." log "Selected $(jq -r '.key' <<< "$release_object") as matching version for download."
fi fi
if [[ -z $release_object ]]; then
logError "No release found for GTNH_PACK_VERSION=$GTNH_PACK_VERSION. Please check if the version is valid."
exit 1
fi
# Select compatible server files for java version # Select compatible server files for java version
if (( current_java_version == 8 )); then if (( current_java_version == 8 )); then
@@ -59,6 +65,10 @@ function getGTNHdownloadPath(){
fi fi
if [[ -z $gtnh_download_path ]]; then
logError "Server files not found! Please check if the selected GTNH_PACK_VERSION=$GTNH_PACK_VERSION is valid."
exit 1
fi
debug "Download source URL: $gtnh_download_path" debug "Download source URL: $gtnh_download_path"
} }
@@ -70,80 +80,125 @@ function deleteGTNHbackup(){
fi fi
} }
function downloadGTNH(){
local gtnh_download=""
base_dir=/data/.tmp/gtnh_base
debug "Creating temporary /data/.tmp/packs folder for GTNH download"
mkdir -p /data/.tmp/packs
trap 'rm -rf /data/.tmp' EXIT
log "Downloading $gtnh_download_path."
if ! gtnh_download=$(mc-image-helper get -o /data/.tmp/packs --output-filename --skip-up-to-date "$gtnh_download_path"); then
logError "Failed to download $gtnh_download_path"
exit 1
fi
debug "Downloaded GTNH server files to $gtnh_download"
# Unpacking Server files into temporary directory
log "Unpacking Server Files into $base_dir"
mkdir -p "${base_dir}"
extract "${gtnh_download}" "${base_dir}"
# Remove any eula file since container manages it
debug "Removing eula.txt from $base_dir"
rm -f "${base_dir}/eula.txt"
# recalculate the actual base directory of content
if ! base_dir=$(mc-image-helper find \
--max-depth=3 --type=directory --name=mods,config \
--only-shallowest --fail-no-matches --format '%h' \
"$base_dir"); then
logError "Unable to find content base of downloaded Server Files"
exit 1
fi
debug "Base directory of unpacked Server Files: $base_dir"
}
function updateGTNHresource(){
local resource="$1"
local new_resource="$2"
log "Trying to update $resource"
if [[ -z "$resource" ]]; then
logWarning "No resource specified for update"
return 0
fi
if [[ -e "$resource" ]]; then
log "Deleting existing resource: $resource"
if ! rm -rf "$resource"; then
logError "Failed to delete resource: $resource"
exit 1
fi
fi
if [[ -d "$new_resource" ]]; then
log "Copying $new_resource to /data"
if ! cp -r "$new_resource" "/data/"; then
logError "Failed to copy $new_resource to /data"
exit 1
fi
return 0
fi
if [[ -f "$new_resource" ]]; then
log "Copying $new_resource to /data"
if ! cp "$new_resource" "/data/"; then
logError "Failed to copy $new_resource to /data"
exit 1
fi
return 0
fi
logWarning "Resource update failed: $new_resource does not exist!"
return 0
}
function updateGTNH(){ function updateGTNH(){
# Get the current date and time # Get the current date and time
current_datetime=$(date +%Y-%m-%dT%H:%M) local current_datetime=""
current_datetime=$(date +%Y-%m-%dT+%H%M)
# Define folders and files to update # Define folders and files to update
folders_to_update=("libraries" "mods" "resources" "scripts") # base_dir is already defined in handleGTNH function
files_to_update=("lwjgl3ify-forgePatches.jar" "java9args.txt" "startserver-java9.bat" "startserver-java9.sh" "forge-1.7.10-10.13.4.1614-1.7.10-universal.jar" "startserver.bat" "startserver.sh" "server-icon.png") local folders_to_update=("libraries" "mods" "resources" "scripts")
config_folder="config" local files_to_update=("lwjgl3ify-forgePatches.jar" "java9args.txt" "startserver-java9.bat" "startserver-java9.sh" "forge-1.7.10-10.13.4.1614-1.7.10-universal.jar" "startserver.bat" "startserver.sh" "server-icon.png")
backup_folder="/data/gtnh-upgrade-$current_datetime" local config_folder="config"
journey_map_folder="JourneyMapServer" local backup_folder="/data/gtnh-upgrade-$current_datetime"
local journey_map_folder="JourneyMapServer"
# Delete specified folders if they exist
for folder in "${folders_to_update[@]}"; do
folder_path="/data/$folder"
if [[ -d "$folder_path" ]]; then
log "Deleting folder: $folder_path"
rm -rf "$folder_path"
fi
done
# Delete specific files if they exist
for file in "${files_to_update[@]}"; do
file_path="/data/$file"
if [[ -f "$file_path" ]]; then
log "Deleting file: $file_path"
rm -f "$file_path"
fi
done
# Backup the config folder # Backup the config folder
if [[ -d "/data/$config_folder" ]]; then if [[ -d "/data/$config_folder" ]]; then
log "Creating backup of /data/$config_folder at $backup_folder" log "Creating backup of /data/$config_folder at $backup_folder"
cp -r "/data/$config_folder" "$backup_folder" cp -r "/data/$config_folder" "$backup_folder"
log "Deleting original /data/$config_folder"
rm -rf "/data/$config_folder"
fi fi
# Updating the required folders in data directory # Update resources from unpacked server files to /data
for folder in "${folders_to_update[@]}" "$config_folder"; do for resource in "${folders_to_update[@]}" "$config_folder" "${files_to_update[@]}"; do
if [[ -d "$base_dir/$folder" ]]; then local resource_path="/data/$resource"
log "Copying $folder to /data" local new_resource_path="$base_dir/$resource"
cp -r "$base_dir/$folder" "/data/"
else
logWarning "Folder $folder not found in the unzipped data!"
fi
done
# Copy specific files to the /data directory
for file in "${files_to_update[@]}"; do
if [[ -f "$base_dir/$file" ]]; then
log "Copying $file to /data"
cp "$base_dir/$file" "/data/"
else
logWarning "File $file not found in the unzipped data!"
fi
done
# Ensure the config folder exists debug "Updating resource: $resource_path with new resource: $new_resource_path"
if [[ ! -d "$config_folder" ]]; then updateGTNHresource "$resource_path" "$new_resource_path"
log "$config_folder does not exist. Creating it now." done
mkdir -p "$config_folder"
fi
# Restore JourneyMapServer folder from backup # Restore JourneyMapServer folder from backup
if [[ -d "$backup_folder/$journey_map_folder" ]]; then if [[ -d "$backup_folder/$journey_map_folder" ]]; then
log "Restoring $journey_map_folder to $config_folder" if [[ ! -d "/data/$config_folder" ]]; then
cp -r "$backup_folder/$journey_map_folder" "$config_folder/" log "/data/$config_folder folder does not exist. Creating it now."
mkdir -p "/data/$config_folder"
fi
log "Restoring $journey_map_folder to /data/$config_folder"
cp -r "$backup_folder/$journey_map_folder" "/data/$config_folder/"
else else
logWarning "$journey_map_folder not found in backup!" logWarning "$journey_map_folder not found in backup!"
fi fi
# Copy the changelog file to /data # Copy the changelog file to /data
local gtnh_changelog_file=""
gtnh_changelog_file=$(mc-image-helper find --max-depth=1 --type=file --name=changelog*.md "$base_dir") gtnh_changelog_file=$(mc-image-helper find --max-depth=1 --type=file --name=changelog*.md "$base_dir")
if [[ -n "$gtnh_changelog_file" ]]; then if [[ -n "$gtnh_changelog_file" ]]; then
debug "Found changelog file: $gtnh_changelog_file"
log "Copying changelog file to /data" log "Copying changelog file to /data"
cp -f "$gtnh_changelog_file" /data/ cp -f "$gtnh_changelog_file" /data/
fi fi
@@ -163,46 +218,16 @@ function handleGTNH() {
if [[ -n "$GTNH_PACK_VERSION" ]] && isFalse "$SKIP_GTNH_UPDATE_CHECK" ; then if [[ -n "$GTNH_PACK_VERSION" ]] && isFalse "$SKIP_GTNH_UPDATE_CHECK" ; then
getGTNHdownloadPath getGTNHdownloadPath
if [[ -z $gtnh_download_path ]]; then
logError "Server files not found for GTNH_PACK_VERSION=$GTNH_PACK_VERSION! Download not possible!"
exit 1
fi
log "Server files located! Will proceed update $gtnh_download_path." log "Server files located! Will proceed update $gtnh_download_path."
# Decide if update or install is needed or not. # Decide if update or install is needed or not.
if [[ ! -f /data/.gtnh-version || "$(basename "$gtnh_download_path")" != "$(cat /data/.gtnh-version)" ]]; then if [[ ! -f /data/.gtnh-version || "$(basename "$gtnh_download_path")" != "$(cat /data/.gtnh-version)" ]]; then
log "Update/Install required: /data/.gtnh-version is missing or does not match the selected version $(basename "$gtnh_download_path")." log "Update/Install required: /data/.gtnh-version is missing or does not match the selected version $(basename "$gtnh_download_path")."
mkdir -p /data/packs # Download and unpack GTNH server files
log "Downloading $gtnh_download_path." downloadGTNH
if ! gtnh_download=$(mc-image-helper get -o /data/packs --output-filename --skip-up-to-date "$gtnh_download_path"); then log "GTNH server files downloaded and unpacked to $base_dir."
logError "Failed to download $gtnh_download_path"
exit 1
fi
# Unpacking Server files into temporary directory
log "Unpacking Server Files..."
original_base_dir=/data/.tmp/gtnh_base
base_dir=$original_base_dir
rm -rf "${base_dir}"
mkdir -p "${base_dir}"
extract "${gtnh_download}" "${base_dir}"
trap 'rm -rf /data/.tmp' EXIT
# Removing downloaded zip
rm -f "$gtnh_download"
# Remove any eula file since container manages it
rm -f "${base_dir}/eula.txt"
# recalculate the actual base directory of content
if ! base_dir=$(mc-image-helper find \
--max-depth=3 --type=directory --name=mods,config \
--only-shallowest --fail-no-matches --format '%h' \
"$base_dir"); then
logError "Unable to find content base of downloaded Server Files"
exit 1
fi
# Split installation from update path. Check for version file. # Split installation from update path. Check for version file.
if [[ -f /data/.gtnh-version ]]; then if [[ -f /data/.gtnh-version ]]; then
@@ -212,10 +237,12 @@ function handleGTNH() {
log "No .gtnh-version file detected! Assuming no old server exists. Proceed installing new server..." log "No .gtnh-version file detected! Assuming no old server exists. Proceed installing new server..."
cp -R -f "${base_dir}"/* /data cp -R -f "${base_dir}"/* /data
fi fi
# Update .gtnh-version # Update .gtnh-version
basename "$gtnh_download_path" > /data/.gtnh-version basename "$gtnh_download_path" > /data/.gtnh-version
# Cleaning up
rm -rf "$original_base_dir" # Cleaning up temporary files
rm -rf /data/.tmp
else else
log "No update required: /data/.gtnh-version matches the selected version $(basename "$gtnh_download_path")." log "No update required: /data/.gtnh-version matches the selected version $(basename "$gtnh_download_path")."
+16 -40
View File
@@ -5,52 +5,28 @@
isDebugging && set -x isDebugging && set -x
set -o pipefail set -o pipefail
resolveVersion resultsFile=/data/.install-vanilla.env
export SERVER="minecraft_server.${VERSION// /_}.jar"
if [ ! -e "$SERVER" ] || [ -n "$FORCE_REDOWNLOAD" ]; then args=(
debug "Finding version manifest for $VERSION" --output-directory=/data
versionManifestUrl=$(get 'https://launchermeta.mojang.com/mc/game/version_manifest.json' | jq --arg VERSION "$VERSION" --raw-output '[.versions[]|select(.id == $VERSION)][0].url') --results-file="${resultsFile}"
result=$? --version="${VERSION}"
if [ $result != 0 ]; then )
logError "Failed to obtain version manifest URL ($result)"
exit 1
fi
if [ "$versionManifestUrl" = "null" ]; then
logError "Couldn't find a matching manifest entry for $VERSION"
exit 1
fi
debug "Found version manifest at $versionManifestUrl"
if ! serverDownloadUrl=$(get --json-path '$.downloads.server.url' "${versionManifestUrl}"); then if isTrue "${FORCE_REDOWNLOAD}"; then
logError "Failed to obtain version manifest from $versionManifestUrl ($result)" log "Forcing re-install of Minecraft"
exit 1 args+=(--force-reinstall)
elif [ "$serverDownloadUrl" = "null" ]; then
logError "There is not a server download for version $VERSION"
exit 1
fi
log "Downloading $VERSION server..."
debug "Downloading server from $serverDownloadUrl"
get -o "$SERVER" "$serverDownloadUrl"
result=$?
if [ $result != 0 ]; then
logError "Failed to download server from $serverDownloadUrl ($result)"
exit 1
fi
fi fi
minecraftServerJarPath=/data/minecraft_server.jar
if versionLessThan 1.6; then if ! mc-image-helper install-vanilla "${args[@]}"; then
if ! [[ -L $minecraftServerJarPath && $minecraftServerJarPath -ef "/data/$SERVER" ]]; then logError "Failed to install vanilla Minecraft version $VERSION"
rm -f $minecraftServerJarPath exit 1
ln -s "/data/$SERVER" $minecraftServerJarPath
fi
SERVER=minecraft_server.jar
elif [[ -L $minecraftServerJarPath ]]; then
rm -f $minecraftServerJarPath
fi fi
applyResultsFile "${resultsFile}"
log "Successfully setup vanilla Minecraft version $VERSION"
isDebugging && ls -l isDebugging && ls -l
export FAMILY=VANILLA export FAMILY=VANILLA
exec "$(dirname "$0")/start-setupWorld" "$@" exec "$(dirname "$0")/start-setupWorld" "$@"
+8 -7
View File
@@ -3,6 +3,7 @@
: "${DEBUG_EXEC:=false}" : "${DEBUG_EXEC:=false}"
: "${SETUP_ONLY:=false}" : "${SETUP_ONLY:=false}"
: "${CUSTOM_JAR_EXEC:=}" : "${CUSTOM_JAR_EXEC:=}"
: "${SERVER_RUNNER:=mc-server-runner}"
# shellcheck source=start-utils # shellcheck source=start-utils
. "$(dirname "$0")/start-utils" . "$(dirname "$0")/start-utils"
@@ -96,7 +97,7 @@ fi
if versionLessThan 1.7; then if versionLessThan 1.7; then
: # No patch required here. : # No patch required here.
elif versionLessThan 1.18.1; then elif versionLessThan 1.18.1; then
if isTrue ${SKIP_LOG4J_PATCHER:-false}; then if isTrue "${SKIP_LOG4J_PATCHER:-false}"; then
log "Skipping Log4jPatcher, make sure you are not affected" log "Skipping Log4jPatcher, make sure you are not affected"
else else
JVM_OPTS="-javaagent:/image/Log4jPatcher.jar ${JVM_OPTS}" JVM_OPTS="-javaagent:/image/Log4jPatcher.jar ${JVM_OPTS}"
@@ -496,7 +497,7 @@ if [[ ${TYPE} == "CURSEFORGE" && "${SERVER}" ]]; then
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 ${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+=(--shell bash)
@@ -550,18 +551,18 @@ fi
JVM_ARGS=${JVM_ARGS//$'\n'/} JVM_ARGS=${JVM_ARGS//$'\n'/}
sed -i "s~JAVA_ARGS=.*~JAVA_ARGS=\"${JVM_ARGS}\"~" "${FTB_DIR}/variables.txt" sed -i "s~JAVA_ARGS=.*~JAVA_ARGS=\"${JVM_ARGS}\"~" "${FTB_DIR}/variables.txt"
fi fi
exec mc-server-runner "${mcServerRunnerArgs[@]}" "${finalArgs[@]}" exec ${SERVER_RUNNER} "${mcServerRunnerArgs[@]}" -- "${finalArgs[@]}"
elif [[ $SERVER =~ run.sh ]]; then elif [[ $SERVER =~ 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
if isTrue ${SETUP_ONLY}; then if isTrue "${SETUP_ONLY}"; then
echo "SETUP_ONLY: bash ${SERVER}" echo "SETUP_ONLY: bash ${SERVER}"
exit exit
fi fi
if isTrue "${DEBUG_EXEC}"; then if isTrue "${DEBUG_EXEC}"; then
set -x set -x
fi fi
exec mc-server-runner "${mcServerRunnerArgs[@]}" --shell bash "${SERVER}" $EXTRA_ARGS exec ${SERVER_RUNNER} "${mcServerRunnerArgs[@]}" --shell bash -- "${SERVER}" $EXTRA_ARGS
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 $bootstrapPath ]; then if [ -f $bootstrapPath ]; then
@@ -590,7 +591,7 @@ else
"$@" $EXTRA_ARGS "$@" $EXTRA_ARGS
) )
if isTrue ${SETUP_ONLY}; then if isTrue "${SETUP_ONLY}"; then
echo "SETUP_ONLY: java ${finalArgs[*]}" echo "SETUP_ONLY: java ${finalArgs[*]}"
exit exit
fi fi
@@ -599,5 +600,5 @@ else
set -x set -x
fi fi
exec mc-server-runner ${bootstrapArgs} "${mcServerRunnerArgs[@]}" java "${finalArgs[@]}" exec ${SERVER_RUNNER} ${bootstrapArgs} "${mcServerRunnerArgs[@]}" -- java "${finalArgs[@]}"
fi fi
+36 -2
View File
@@ -10,6 +10,7 @@ set -e -o pipefail
: "${REMOVE_OLD_MODS_DEPTH:=1} " : "${REMOVE_OLD_MODS_DEPTH:=1} "
: "${REMOVE_OLD_MODS_INCLUDE:=*.jar,*-version.json}" : "${REMOVE_OLD_MODS_INCLUDE:=*.jar,*-version.json}"
: "${CF_API_KEY_FILE:=}" # Path to file containing CurseForge API key : "${CF_API_KEY_FILE:=}" # Path to file containing CurseForge API key
: "${CF_USE_HTTP2:=false}" # CF downloads are faster with HTTP 1.1
: "${MODRINTH_LOADER:=}" : "${MODRINTH_LOADER:=}"
# shellcheck source=start-utils # shellcheck source=start-utils
@@ -180,7 +181,38 @@ function handleGenericPacks() {
packFiles=() packFiles=()
for packEntry in "${packs[@]}"; do for packEntry in "${packs[@]}"; do
pack="${GENERIC_PACKS_PREFIX}${packEntry}${GENERIC_PACKS_SUFFIX}" pack="${GENERIC_PACKS_PREFIX}${packEntry}${GENERIC_PACKS_SUFFIX}"
if isURL "${pack}"; then if isOCIRef "${pack}"; then
# All OCI refs share one staging dir so layers common to multiple
# sibling artifacts (the point of layered distribution) are pulled
# exactly once across all of GENERIC_PACKS.
mkdir -p /data/packs/oci /data/.tmp
log "Pulling OCI generic pack from $pack"
# A list file is used rather than stdout because mc-image-helper INFO
# logs share that stream; it holds one absolute layer path per line in
# apply order.
layerListFile=$(mktemp -p /data/.tmp)
ociArgs=(install-oci-pack
--ref "$pack"
--output-directory /data/packs/oci
--filename-strategy digest
--layer-list-file "$layerListFile")
if [[ "${GENERIC_PACKS_OCI_AUTH_FILE:-}" ]]; then
ociArgs+=(--auth-file "${GENERIC_PACKS_OCI_AUTH_FILE}")
fi
if ! mc-image-helper "${ociArgs[@]}"; then
logError "Failed to pull OCI generic pack $pack"
logError "(OCI generic packs require mc-image-helper with install-oci-pack support)"
rm -f "$layerListFile"
exit 2
fi
mapfile -t ociLayers < "$layerListFile"
rm -f "$layerListFile"
if [ ${#ociLayers[@]} -eq 0 ]; then
logError "OCI generic pack $pack resolved to zero layers"
exit 2
fi
packFiles+=("${ociLayers[@]}")
elif isURL "${pack}"; then
mkdir -p /data/packs mkdir -p /data/packs
log "Downloading generic pack from $pack" log "Downloading generic pack from $pack"
if ! outfile=$(get -o /data/packs --output-filename --skip-up-to-date "$pack"); then if ! outfile=$(get -o /data/packs --output-filename --skip-up-to-date "$pack"); then
@@ -296,7 +328,9 @@ function handleModrinthProjects() {
} }
function handleCurseForgeFiles() { function handleCurseForgeFiles() {
args=() args=(
--use-http2="$CF_USE_HTTP2"
)
if usesMods && ! usesPlugins; then if usesMods && ! usesPlugins; then
args+=(--default-category mc-mods) args+=(--default-category mc-mods)
elif usesPlugins && ! usesMods; then elif usesPlugins && ! usesMods; then
+6
View File
@@ -173,6 +173,12 @@ function isURL() {
[[ $value =~ ^(https?|ftp):// ]] [[ $value =~ ^(https?|ftp):// ]]
} }
function isOCIRef() {
local value=$1
[[ $value =~ ^oci:// ]]
}
function isValidFileURL() { function isValidFileURL() {
suffix=${1:?Missing required suffix arg} suffix=${1:?Missing required suffix arg}
url=${2:?Missing required url arg} url=${2:?Missing required url arg}
@@ -0,0 +1,18 @@
services:
mc:
image: ${IMAGE_TO_TEST:-itzg/minecraft-server}
environment:
EULA: "true"
SETUP_ONLY: "true"
# two OCI packs that share a common base layer; the shared blob is
# pulled into /data/packs/oci once and reused for the second pack
GENERIC_PACKS: oci://ghcr.io/itzg/oci-modpack-template/tech:latest,oci://ghcr.io/itzg/oci-modpack-template/magic:latest
LOG_TIMESTAMP: "true"
# the following are only used to speed up test execution
TYPE: CUSTOM
CUSTOM_SERVER: /servers/fake.jar
VERSION: 1.18.1
DEBUG: "true"
volumes:
- ./data:/data
- ./fake.jar:/servers/fake.jar
@@ -0,0 +1 @@
[[ $EXTENDED_TESTS ]] || exit 1
@@ -0,0 +1,7 @@
set -e
# OCI layers were cached
[ -d /data/packs/oci ]
compgen -G "/data/packs/oci/sha256:*" > /dev/null
# pack content was extracted and applied to /data
[ -d /data/mods ]
compgen -G "/data/mods/*" > /dev/null
+1 -1
View File
@@ -46,7 +46,7 @@ setupOnlyMinecraftTest(){
start=$(date +%s) start=$(date +%s)
status=PASSED status=PASSED
verify= verify=
if ! logs=$(docker compose run --rm -e SETUP_ONLY=true -e DEBUG="${DEBUG:-false}" mc 2>&1); then if ! logs=$(docker compose run --rm -e SETUP_ONLY=true -e DEBUG="${DEBUG:-false}" -e GH_TOKEN="${GH_TOKEN:-}" mc 2>&1); then
status=FAILED status=FAILED
outputContainerLog "$logs" outputContainerLog "$logs"
result=1 result=1