Compare commits

..

2 Commits

Author SHA1 Message Date
Geoff Bourne
648abc4ae4 Added hairpin routing diagram 2024-06-15 14:10:51 -05:00
Geoff Bourne
c764961418 paper: consider release channel when selecting version/build 2024-06-15 13:52:01 -05:00
40 changed files with 133 additions and 463 deletions

View File

@@ -11,7 +11,6 @@ on:
- "docs/**"
- "examples/**"
- "notes/**"
- "kustomize/**"
jobs:
build:
@@ -61,6 +60,10 @@ jobs:
baseImage: container-registry.oracle.com/graalvm/jdk:17-ol8
platforms: linux/amd64,linux/arm64
mcVersion: 1.20.4
- variant: java17-jdk
baseImage: eclipse-temurin:17-focal
platforms: linux/amd64,linux/arm/v7,linux/arm64
mcVersion: 1.20.4
- variant: java17-alpine
baseImage: eclipse-temurin:17-jre-alpine
platforms: linux/amd64
@@ -98,7 +101,7 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v4.1.7
uses: actions/checkout@v4.1.6
with:
# for build-files step
fetch-depth: 0
@@ -133,13 +136,13 @@ jobs:
org.opencontainers.image.authors=Geoff Bourne <itzgeoff@gmail.com>
- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v3.4.0
uses: docker/setup-buildx-action@v3.3.0
- name: Set up QEMU
uses: docker/setup-qemu-action@v3.1.0
uses: docker/setup-qemu-action@v3.0.0
- name: Build for test
uses: docker/build-push-action@v6.4.1
uses: docker/build-push-action@v5.3.0
with:
platforms: linux/amd64
tags: ${{ env.IMAGE_TO_TEST }}
@@ -177,7 +180,7 @@ jobs:
password: ${{ github.token }}
- name: Build and push
uses: docker/build-push-action@v6.4.1
uses: docker/build-push-action@v5.3.0
if: github.actor == github.repository_owner
with:
platforms: ${{ matrix.platforms }}

View File

@@ -8,7 +8,6 @@ on:
- "docs/**"
- "examples/**"
- "notes/**"
- "kustomize/**"
- "docker-compose*.yml"
- "mkdocs.yml"
@@ -47,16 +46,16 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v4.1.7
uses: actions/checkout@v4.1.6
with:
# for build-files step
fetch-depth: 0
- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v3.4.0
uses: docker/setup-buildx-action@v3.3.0
- name: Confirm multi-arch build
uses: docker/build-push-action@v6.4.1
uses: docker/build-push-action@v5.3.0
with:
platforms: ${{ matrix.platforms }}
# ensure latest base image is used
@@ -66,7 +65,7 @@ jobs:
cache-from: type=gha,scope=${{ matrix.variant }}
- name: Build for test
uses: docker/build-push-action@v6.4.1
uses: docker/build-push-action@v5.3.0
with:
# Only build single platform since loading multi-arch image into daemon fails with
# "docker exporter does not currently support exporting manifest lists"

View File

@@ -23,11 +23,11 @@ EXPOSE 25565
ARG APPS_REV=1
ARG GITHUB_BASEURL=https://github.com
ARG EASY_ADD_VERSION=0.8.7
ARG EASY_ADD_VERSION=0.8.6
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.4
ARG RESTIFY_VERSION=1.7.3
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
@@ -37,7 +37,7 @@ 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.12.13
ARG MC_MONITOR_VERSION=0.12.12
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
@@ -47,7 +47,7 @@ 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.39.9
ARG MC_HELPER_VERSION=1.39.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

View File

@@ -44,7 +44,7 @@ do
if [[ "$RCON_CMDS_STARTUP" ]]; then
while read -r cmd; do
run_command "$cmd"
done <<< "$(echo -e "$RCON_CMDS_STARTUP")"
done <<< "$RCON_CMDS_STARTUP"
fi
if
[[ -z "$RCON_CMDS_ON_CONNECT" ]] &&
@@ -66,7 +66,7 @@ do
logRcon "First Clients has Connected, running first connect cmds"
while read -r cmd; do
run_command "$cmd"
done <<< "$(echo -e "$RCON_CMDS_FIRST_CONNECT")"
done <<< "$RCON_CMDS_FIRST_CONNECT"
fi
# When a client joins
@@ -74,13 +74,13 @@ do
logRcon "Clients have Connected, running connect cmds"
while read -r cmd; do
run_command "$cmd"
done <<< "$(echo -e "$RCON_CMDS_ON_CONNECT")"
done <<< "$RCON_CMDS_ON_CONNECT"
# When a client leaves
elif (( CURR_CLIENTCONNECTIONS < CLIENTCONNECTIONS )) && [[ "$RCON_CMDS_ON_DISCONNECT" ]]; then
logRcon "Clients have Disconnected, running disconnect cmds"
while read -r cmd; do
run_command "$cmd"
done <<< "$(echo -e "$RCON_CMDS_ON_DISCONNECT")"
done <<< "$RCON_CMDS_ON_DISCONNECT"
fi
# Last client connection
@@ -89,7 +89,7 @@ do
logRcon "ALL Clients have Disconnected, running last disconnect cmds"
while read -r cmd; do
run_command "$cmd"
done <<< "$(echo -e "$RCON_CMDS_LAST_DISCONNECT")"
done <<< "$RCON_CMDS_LAST_DISCONNECT"
fi
CLIENTCONNECTIONS=$CURR_CLIENTCONNECTIONS
;;

View File

@@ -3,7 +3,6 @@
set -e
set -o pipefail
# Install necessary packages
apk add --no-cache -U \
openssl \
imagemagick \
@@ -15,8 +14,7 @@ apk add --no-cache -U \
procps \
shadow \
bash \
curl \
iputils \
curl iputils \
git \
jq \
mysql-client \
@@ -31,15 +29,11 @@ apk add --no-cache -U \
libwebp \
libcap
# Download and install patched knockd
# 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
tar -xf /tmp/knock.tar.gz -C /usr/local/ && rm /tmp/knock.tar.gz
ln -s /usr/local/sbin/knockd /usr/sbin/knockd
setcap cap_net_raw=ep /usr/local/sbin/knockd
# Set Git credentials globally
cat <<EOF >> /etc/gitconfig
[user]
name = Minecraft Server on Docker
email = server@example.com
EOF
# Set git credentials
echo -e "[user]\n name = Minecraft Server on Docker\n email = server@example.com" >> /etc/gitconfig

View File

@@ -1,22 +1,12 @@
#!/bin/bash
set -euo pipefail
GOSU_VERSION="1.16"
GOSU_BASE_URL="https://github.com/tianon/gosu/releases/download/$GOSU_VERSION"
case $(uname -m) in
"aarch64")
GOSU_ARCH="gosu-arm64"
;;
"x86_64")
GOSU_ARCH="gosu-amd64"
;;
*)
echo "Architecture not supported!"
exit 1
;;
esac
curl -sL -o /bin/gosu "${GOSU_BASE_URL}/${GOSU_ARCH}"
chmod +x /bin/gosu
if [[ $(uname -m) == "aarch64" ]]; then
curl -sL -o /bin/gosu https://github.com/tianon/gosu/releases/download/1.16/gosu-arm64
chmod +x /bin/gosu
elif [[ $(uname -m) == "x86_64" ]]; then
curl -sL -o /bin/gosu https://github.com/tianon/gosu/releases/download/1.16/gosu-amd64
chmod +x /bin/gosu
else
echo "Not supported!"
exit 1
fi

View File

@@ -4,25 +4,20 @@ export TARGET
set -euo pipefail
# Install and configure dnf
microdnf install dnf -y
dnf install 'dnf-command(config-manager)' -y
dnf config-manager --set-enabled ol8_codeready_builder
# Add EPEL repository
tee /etc/yum.repos.d/ol8-epel.repo <<EOF
tee /etc/yum.repos.d/ol8-epel.repo<<EOF
[ol8_developer_EPEL]
name=Oracle Linux \$releasever EPEL (\$basearch)
name= Oracle Linux \$releasever EPEL (\$basearch)
baseurl=https://yum.oracle.com/repo/OracleLinux/OL8/developer/EPEL/\$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1
EOF
# Update system
dnf update -y
# Install necessary packages
dnf install -y \
ImageMagick \
file \
@@ -31,6 +26,7 @@ dnf install -y \
iputils \
curl \
git \
git-lfs \
jq \
dos2unix \
mysql \
@@ -46,26 +42,18 @@ dnf install -y \
findutils \
which
# Install Git LFS
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.rpm.sh | sudo bash
dnf update -y
dnf install -y git-lfs
dnf install -y \
git-lfs
# Clean up DNF when done
dnf clean all
# Install gosu (assuming the script /build/ol/install-gosu.sh exists and is executable)
bash /build/ol/install-gosu.sh
# Download and install patched knockd
# 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
tar -xf /tmp/knock.tar.gz -C /usr/local/ && rm /tmp/knock.tar.gz
ln -s /usr/local/sbin/knockd /usr/sbin/knockd
setcap cap_net_raw=ep /usr/local/sbin/knockd
# Set git credentials globally
cat <<EOF >> /etc/gitconfig
[user]
name = Minecraft Server on Docker
email = server@example.com
EOF
# Set git credentials
echo -e "[user]\n name = Minecraft Server on Docker\n email = server@example.com" >> /etc/gitconfig

View File

@@ -4,8 +4,8 @@ export TARGET
set -euo pipefail
# Update and install packages
apt-get update
DEBIAN_FRONTEND=noninteractive \
apt-get install -y \
imagemagick \
@@ -26,26 +26,22 @@ apt-get install -y \
zstd \
lbzip2 \
nfs-common \
libpcap0.8
libpcap0.8 \
webp
# Install Git LFS
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
apt-get update
apt-get install -y git-lfs
apt-get install -y \
git-lfs
# Clean up APT when done
apt-get clean
# Download and install patched knockd
# 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
tar -xf /tmp/knock.tar.gz -C /usr/local/ && rm /tmp/knock.tar.gz
ln -s /usr/local/sbin/knockd /usr/sbin/knockd
setcap cap_net_raw=ep /usr/local/sbin/knockd
find /usr/lib -name 'libpcap.so.0.8' -execdir cp '{}' libpcap.so.1 \;
# Set git credentials globally
cat <<EOF >> /etc/gitconfig
[user]
name = Minecraft Server on Docker
email = server@example.com
EOF
# Set git credentials
echo -e "[user]\n name = Minecraft Server on Docker\n email = server@example.com" >> /etc/gitconfig

View File

@@ -2,9 +2,5 @@
set -e
if id ubuntu > /dev/null 2>&1; then
deluser ubuntu
fi
addgroup --gid 1000 minecraft
adduser --system --shell /bin/false --uid 1000 --ingroup minecraft --home /data minecraft

View File

@@ -2,7 +2,7 @@
An option to stop the server after a specified time has been added for niche applications (e.g. billing saving on AWS Fargate). The function is incompatible with the Autopause functionality, as they basically cancel out each other.
!!! note
!!! note
the docker container variables have to be set accordingly (restart policy set to "no") and that the container has to be manually restarted.
@@ -25,6 +25,3 @@ The following environment variables define the behavior of auto-stopping:
describes period of the daemonized state machine, that handles the stopping of the server
> To troubleshoot, add `DEBUG_AUTOSTOP=true` to see additional output
## Proxy Support
If you make use of PROXY Protocol, i.e. through something like HAProxy or Fly.io, you will need to enable it in your variety of server's configuration, and then set the `USES_PROXY_PROTOCOL` envar to `true`. This lets Autostop monitor the server, where it otherwise wouldn't

View File

@@ -6,7 +6,7 @@ Docker image that runs a Minecraft Bedrock server.
Lightweight multiplexer/proxy for Minecraft Java servers. Provided as a stand-alone application and a Docker image.
### [itzg/mc-proxy](https://github.com/itzg/docker-bungeecord/)
### [itzg/bungeecord](https://github.com/itzg/docker-bungeecord/)
Docker image that runs a proxy powered by Bungeecord, Velocity, or Waterfall

View File

@@ -117,7 +117,7 @@ https://edge.forgecdn.net/files/2871/647/ToastControl-1.15.2-3.0.1.jar
Blank lines and lines that start with a `#` will be ignored
[This compose file](https://github.com/itzg/docker-minecraft-server/blob/master/examples/mods-file/docker-compose.yml) shows another example of using this feature.
[This compose file](https://github.com/itzg/docker-minecraft-server/blob/master/examples/docker-compose-mods-file.yml) shows another example of using this feature.
## Remove old mods/plugins

View File

@@ -26,5 +26,5 @@
: Can be set to `none` (the default), `required`, or `optional` to download required and/or optional dependencies.
`MODRINTH_ALLOWED_VERSION_TYPE`
: The version type is used to determine the newest version to use from each project. The allowed values are `release` (default), `beta`, `alpha`. Setting to `beta` will pick up both release and beta versions. Setting to `alpha` will pick up release, beta, and alpha versions.
: The version type is used to determine the newest version to use from each project. The allowed values are `release` (default), `beta`, `alpha`.

View File

@@ -1,4 +1,4 @@
mkdocs-material == 9.5.29
mkdocs-material == 9.5.26
mkdocs-autorefs == 1.0.1
mkdocstrings == 0.25.1
mkdocs-literate-nav == 0.6.1

View File

@@ -73,10 +73,6 @@ To force include client mods, set `MODRINTH_FORCE_INCLUDE_FILES` to a comma or n
yet-another-config-lib
```
## Default exclude/includes
The image comes with a default set of exclude/includes, maintained [in the repo files area](https://github.com/itzg/docker-minecraft-server/blob/master/files/modrinth-exclude-include.json) and uses the same [JSON schema](https://github.com/itzg/mc-image-helper?tab=readme-ov-file#excludeinclude-file-schema) as Auto CurseForge. Those defaults can be disabled by setting the env var `MODRINTH_DEFAULT_EXCLUDE_INCLUDES` to an empty string.
## Excluding Overrides Files
Modrinth mrpack/zip files may include an `overrides` subdirectory that contains config files, world data, and extra mod files. All of those files will be extracted into the `/data` path of the container. If any of those files, such as incompatible mods, need to be excluded from extraction, then the `MODRINTH_OVERRIDES_EXCLUSIONS` variable can be set with a comma or newline delimited list of ant-style paths ([see below](#ant-style-paths)) to exclude, relative to the overrides (or `/data`) directory.

View File

@@ -16,14 +16,6 @@ To allow for the selection of experimental builds, set `PAPER_CHANNEL` to "exper
docker run ... -e TYPE=PAPER -e PAPER_CHANNEL=experimental ...
```
!!! tip
If you see the following error, it likely means you need to set the env var `PAPER_CHANNEL` to "experimental"
```
No build found for version 1.21 with channel 'default'
```
If you are hosting your own copy of Paper you can override the download URL with `PAPER_DOWNLOAD_URL=<url>`.
If you have attached a host directory to the `/data` volume, then you can install plugins via the `plugins` subdirectory. You can also [attach a `/plugins` volume](../../mods-and-plugins/index.md#optional-plugins-mods-and-config-attach-points). If you add plugins while the container is running, you'll need to restart it to pick those up.

View File

@@ -80,18 +80,6 @@ The `stable` image tag combines the benefits of `latest` and [release versions](
[This section in the Minecraft wiki](https://minecraft.wiki/w/Tutorials/Update_Java#Why_update?) lists out versions of **vanilla** Minecraft versions and the corresponding Java version that is required.
### Class file version 65.0
If encountering a startup failure similar to the following examples, then ensure that the latest image has been re-pulled to use a Java 21. Alternatively, set the image tag specifically to `itzg/minecraft-server:java21`.
> Exception in thread "ServerMain" java.lang.UnsupportedClassVersionError: org/bukkit/craftbukkit/Main has been compiled by a more recent version of the Java Runtime (class file version 65.0), this version of the Java Runtime only recognizes class file versions up to 61.0
or
> Error: LinkageError occurred while loading main class net.minecraft.bundler.Main
java.lang.UnsupportedClassVersionError: net/minecraft/bundler/Main has been compiled by a more recent version of the Java Runtime (class file version 65.0), this version of the Java Runtime only recognizes class file versions up to 61.0
### Forge versions
Forge and its mods sometimes utilize non-public APIs of the JVM and as such are suspceptible to becoming broken with newer Java versions.

View File

@@ -16,6 +16,21 @@ services:
- "25565:25565"
volumes:
- mc-data:/data
- ./downloads:/downloads
# Manually download the following and put into the 'downloads' directory next to this compose file
#
# Mod Filename Download page
# =========================== ========================================= ====================================================================================
# Fish of Thieves [Fabric 1.20.1] Fish of Thieves v3.0.3 https://www.curseforge.com/minecraft/mc-mods/fish-of-thieves/files/4958329
# Only Hammers [FORGE/FABRIC] OnlyHammers-1.20.1-0.6-Fabric https://www.curseforge.com/minecraft/mc-mods/only-hammers-forge-fabric/files/4832068
# Sprinklerz sprinklerz-0.5_fabric.jar https://www.curseforge.com/minecraft/mc-mods/sprinklerz/files/4835664
# Frog Legs (Fabric/Forge) FrogLegs-v2.0.0-1.20.1-Fabric.jar https://www.curseforge.com/minecraft/mc-mods/froglegs/files/4917818
# TrimsEffects [FABRIC] TrimsEffects - MC 1.20.X - 1.1.0 https://www.curseforge.com/minecraft/mc-mods/trimseffects/files/4954156
# Display Case Display Case-fabric-1.20-1.0.8.jar https://www.curseforge.com/minecraft/mc-mods/displaycase/files/4921333
# Structory: Towers Structory Towers 1.20.4 v1.0.6 https://www.curseforge.com/minecraft/mc-mods/structory-towers/files/4937875
# Packet Fixer Packet Fixer Fabric 1.2.1 https://www.curseforge.com/minecraft/mc-mods/packet-fixer/files/4884316
# Perfect Plushies Perfect Plushies 1.9.0 [Fabric] https://www.curseforge.com/minecraft/mc-mods/perfect-plushies/files/4985767
# Structory Structory 1.20.2 v1.3.4 https://www.curseforge.com/minecraft/mc-mods/structory/files/4937872
volumes:
mc-data: {}

View File

@@ -1,6 +1,6 @@
services:
mc:
image: itzg/minecraft-server:java17
image: itzg/minecraft-server
ports:
- "25565:25565"
environment:
@@ -9,10 +9,11 @@ services:
# 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_FILENAME_MATCHER: "1.1.0"
CF_FILENAME_MATCHER: "1.0.6"
MEMORY: 4G
volumes:
- mc-data:/data
- ../downloads:/downloads
# Since Docker's default volume driver creates volumes owned by root, this
# init container will change ownership to match final UID of mc service, above
init-filebrowser:

View File

@@ -14,6 +14,7 @@ services:
MEMORY: 4G
volumes:
- mc-data:/data
- ./downloads:/downloads
volumes:
mc-data: {}

View File

@@ -1,6 +1,6 @@
services:
mc:
image: itzg/minecraft-server:java8
image: itzg/minecraft-server:java8-multiarch
ports:
- "25565:25565"
environment:
@@ -43,6 +43,7 @@ services:
MEMORY: 4G
volumes:
- mc-data:/data
- ./downloads:/downloads
volumes:
mc-data: {}

View File

@@ -7,10 +7,11 @@ services:
# Set CF_API_KEY=... in a .env file next to this compose file and don't source control that file
CF_API_KEY: ${CF_API_KEY}
CF_SLUG: better-mc-fabric-bmc1
# CF_FILENAME_MATCHER: v18.5
CF_FILENAME_MATCHER: v18.5
MEMORY: 4G
volumes:
- mc:/data
- ../downloads:/downloads
ports:
- "25565:25565"

View File

@@ -2,14 +2,22 @@ services:
mc:
image: itzg/minecraft-server:java17
environment:
DEBUG: true
SETUP_ONLY: true
EULA: true
TYPE: MODRINTH
VERSION: 1.20.1
MEMORY: 4G
MODRINTH_MODPACK: better-mc-forge-bmc4
MODRINTH_VERSION: v28
MODRINTH_VERSION: v26
MODRINTH_EXCLUDE_FILES: |
citresewn
oculus
yungsmenutweaks
notenoughanimations
ryoamiclights
euphoriapatcher
entity_model_features
entity_texture_features
3dskinlayers
connector
MODRINTH_OVERRIDES_EXCLUSIONS: |
mods/NekosEnchantedBooks-*.jar
mods/citresewn-*.jar

View File

@@ -8,6 +8,7 @@ services:
environment:
EULA: "TRUE"
ENABLE_AUTOPAUSE: "TRUE"
OVERRIDE_SERVER_PROPERTIES: "TRUE"
MAX_TICK_TIME: "-1"
# More aggressive settings for demo purposes
AUTOPAUSE_TIMEOUT_INIT: "30"

View File

@@ -1,6 +1,6 @@
services:
proxy:
image: itzg/mc-proxy
image: itzg/bungeecord
environment:
TYPE: WATERFALL
ports:
@@ -10,7 +10,7 @@ services:
- ./waterfall-config:/config
# If you want to use Velocity here is a premade version that supports Velocity
# velocity-proxy:
# image: itzg/mc-proxy
# image: itzg/bungeecord
# environment:
# TYPE: VELOCITY
# ports:

View File

@@ -1,18 +0,0 @@
services:
mc:
image: itzg/minecraft-server
ports:
- "25565:25565"
environment:
EULA: "true"
MOD_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/prominence-2-rpg
CF_FILENAME_MATCHER: "2.8.7"
MEMORY: 4G
volumes:
- mc-data:/data
volumes:
mc-data: {}

View File

@@ -13,21 +13,38 @@ services:
# Optional: select a specific version/file
#CF_FILENAME_MATCHER: "0.2.34"
CF_EXCLUDE_MODS: |
auudio-forge
betterf3
better-third-person
clickable-advancements
controlling
craftpresence
creative-core
default-options
drippy-loading-screen
embeddium
embeddium-extension
embeddium-extras
equipment-compare
ezzoom
fading-night-vision
fancymenu
item-borders
itemphysic-lite
just-enough-resources-jer
konkrete
legendary-tooltips
mouse-tweaks
oauth
oculus
sound-filters
textrues-embeddium-options
toast-control
CF_FORCE_SYNCHRONIZE: "true"
MEMORY: 4G
volumes:
- mc-data:/data
- ./downloads:/downloads
volumes:
mc-data: {}

View File

@@ -16,6 +16,10 @@ services:
ENABLE_COMMAND_BLOCK: true
DIFFICULTY: hard
volumes:
# Need to place non-distributable mods in ./downloads/mods
# As of Update-10.0.0
# - Neon Craft 2 v2.2: https://www.curseforge.com/minecraft/mc-mods/neon-craft-2-mod/files/3726051
- ./downloads:/downloads
- mc-data:/data
volumes:

View File

@@ -1,7 +1,5 @@
#!/bin/bash
# shellcheck source=../scripts/start-utils
. "${SCRIPTS:-/}start-utils"
current_uptime() {
awk '{print $1}' /proc/uptime | cut -d . -f 1
}
@@ -18,20 +16,14 @@ rcon_client_exists() {
[[ -n "$(ps -ax -o comm | grep 'rcon-cli')" ]]
}
use_proxy() {
if isTrue "$USES_PROXY_PROTOCOL"; then
echo "--use-proxy"
fi
}
mc_server_listening() {
mc-monitor status $(use_proxy) --host "${SERVER_HOST:-localhost}" --port "$SERVER_PORT" --timeout 10s >&/dev/null
mc-monitor status --host "${SERVER_HOST:-localhost}" --port "$SERVER_PORT" --timeout 10s >& /dev/null
}
java_clients_connections() {
local connections
if java_running; then
if ! connections=$(mc-monitor status $(use_proxy) --host "${SERVER_HOST:-localhost}" --port "$SERVER_PORT" --show-player-count); then
if java_running ; then
if ! connections=$(mc-monitor status --host "${SERVER_HOST:-localhost}" --port "$SERVER_PORT" --show-player-count); then
# consider it a non-zero player count if the ping fails
# otherwise a laggy server with players connected could get paused
connections=1

View File

@@ -1,66 +1,30 @@
{
"globalExcludes": [
"ambientsounds",
"auudio-forge",
"ambience-music-mod",
"appleskin",
"armor-chroma",
"armor-toughness-bar",
"beehivetooltips",
"better-advancements",
"betterf3",
"betterfps",
"better-foliage",
"better-placement",
"better-sprinting",
"better-tips-nbt-tag",
"better-third-person",
"biomeinfo",
"block-drops-jei-addon",
"blur-forge",
"cherished-worlds",
"chunk-animator",
"clickable-advancements",
"configured",
"controlling",
"ctm",
"custom-main-menu",
"defensive-measures",
"ding",
"drippy-loading-screen",
"dynamiclights-reforged",
"dynamic-surroundings",
"easiervillagertrading",
"effective-forge",
"embeddium",
"embeddium-extension",
"embeddium-extras",
"enchantment-descriptions",
"entity-collision-fps-fix",
"entity-texture-features-fabric",
"entityculling",
"extreme-sound-muffler",
"ezzoom",
"fading-night-vision",
"falling-leaves-forge",
"fancymenu",
"faster-ladder-climbing",
"foamfix-optimization-mod",
"free-cam",
"ftb-backups-2",
"fullscreen-windowed-borderless-for-minecraft",
"hwyla",
"ignitioncoil",
"inmisaddon",
"irisshaders",
"iris-flywheel-compat",
"itemphysic-lite",
"item-obliterator",
"itemzoom",
"just-enough-harvestcraft",
"just-enough-resources-jer",
"legendary-tooltips",
"lootbeams",
"loot-capacitor-tooltips",
"magnesium-extras",
"menumobs",
@@ -70,7 +34,6 @@
"neat",
"nekos-enchanted-books",
"no-recipe-book",
"no-nv-flash",
"not-enough-animations",
"oculus",
"oldjavawarning",
@@ -80,28 +43,13 @@
"resource-reloader",
"rubidium",
"rubidium-extra",
"ryoamiclights",
"schematica",
"searchables",
"shulkerboxviewer",
"skin-layers-3d",
"smart-hud",
"smooth-font",
"smoothwater",
"sodium",
"sound-filters",
"sound-physics-remastered",
"stellar-sky",
"swingthroughgrass",
"textrues-embeddium-options",
"textrues-rubidium-options",
"thaumic-jei",
"tips",
"torohealth-damage-indicators",
"true-darkness",
"ungrab-mouse-mod",
"vanillafix",
"visuality",
"waila-harvestability",
"zume"
],

View File

@@ -1,79 +0,0 @@
{
"globalExcludes": [
"3dskinlayers",
"ae2-emi-crafting",
"AmbientSounds",
"amecs",
"Animation_Overhaul",
"appleskin",
"auudio",
"axolotlbuckets",
"BadOptimizations",
"BetterAdvancements",
"betterbeds",
"BetterThirdPerson",
"BHMenu",
"blur",
"Boat-Item-View",
"bobby",
"cat_jam",
"chat_heads",
"chatanimation",
"cherishedworlds",
"citresewn",
"clickadv",
"connector",
"DisableCustomWorldsAdvice",
"drippyloadingscreen",
"eating-animation",
"emiffect",
"emitrades",
"entity_model_features",
"entity_texture_features",
"entityculling",
"euphoriapatcher",
"fallingleaves",
"fancymenu",
"fast-ip-ping",
"FauxCustomEntityData",
"GeckoLibIrisCompat",
"gpumemleakfix",
"Highlighter",
"ImmediatelyFast",
"indium",
"iris",
"iris-flywheel",
"ItemBorders",
"ItemLocks",
"language-reload",
"lazy-language-loader",
"LegendaryTooltips",
"loadmyresources",
"lootbeams",
"MindfulDarkness",
"MouseTweaks",
"nicer-skies",
"notenoughanimations",
"oculus",
"OverflowingBars",
"PickUpNotifier",
"PresenceFootsteps",
"Prism",
"reeses_sodium_options",
"ResourcePackOverrides",
"ryoamiclights",
"Searchables",
"seasonhud",
"ShoulderSurfing",
"skinlayers3d",
"sodium",
"sorted_enchantments",
"visuality",
"VR-Combat",
"YeetusExperimentus",
"yungsmenutweaks",
"Zoomify"
],
"globalForceIncludes": [],
"modpacks": {}
}

View File

@@ -13,24 +13,10 @@ configMapGenerator:
- name: mc
envs:
- mc.env
patches:
# Example of using a patch to set external service name for mc-router to pick up
- path: set-external-servername.yml
```
### mc.env
```
EULA=true
TYPE=FORGE
```
###
```yaml
apiVersion: v1
kind: Service
metadata:
name: mc
annotations:
mc-router.itzg.me/externalServerName: forge.example.com
```

View File

@@ -12,7 +12,7 @@ set -eu
: "${CF_FORCE_SYNCHRONIZE:=false}"
: "${CF_FORCE_REINSTALL_MODLOADER:=false}"
: "${CF_IGNORE_MISSING_FILES:=}"
: "${CF_EXCLUDE_INCLUDE_FILE=/image/cf-exclude-include.json}"
: "${CF_EXCLUDE_INCLUDE_FILE=https://raw.githubusercontent.com/itzg/docker-minecraft-server/master/files/cf-exclude-include.json}"
: "${CF_EXCLUDE_MODS:=}"
: "${CF_FORCE_INCLUDE_MODS:=}"
: "${CF_SET_LEVEL_FROM:=}" # --set-level-from

View File

@@ -9,11 +9,10 @@ resultsFile=/data/.install-modrinth.env
: "${MODRINTH_MODPACK:=${MODRINTH_PROJECT:-}}"
: "${MODRINTH_LOADER:=}"
: "${MODRINTH_VERSION:=${MODRINTH_VERSION_ID:-}}"
: "${MODRINTH_IGNORE_MISSING_FILES=}"
: "${MODRINTH_EXCLUDE_FILES=}"
: "${MODRINTH_FORCE_INCLUDE_FILES=}"
: "${MODRINTH_OVERRIDES_EXCLUSIONS=}"
: "${MODRINTH_DEFAULT_EXCLUDE_INCLUDES=/image/modrinth-exclude-include.json}"
: "${MODRINTH_IGNORE_MISSING_FILES:=}"
: "${MODRINTH_EXCLUDE_FILES:=}"
: "${MODRINTH_FORCE_INCLUDE_FILES:=}"
: "${MODRINTH_OVERRIDES_EXCLUSIONS:=}"
if [[ ! $MODRINTH_MODPACK ]]; then
log "ERROR: MODRINTH_MODPACK must be set when using TYPE/MOD_PLATFORM of MODRINTH"
@@ -61,7 +60,6 @@ setArg --default-version-type MODRINTH_DEFAULT_VERSION_TYPE
setArg --exclude-files MODRINTH_EXCLUDE_FILES
setArg --force-include-files MODRINTH_FORCE_INCLUDE_FILES
setArg --overrides-exclusions MODRINTH_OVERRIDES_EXCLUSIONS
setArg --default-exclude-includes MODRINTH_DEFAULT_EXCLUDE_INCLUDES
if ! mc-image-helper install-modrinth-modpack "${args[@]}"; then
log "ERROR failed to install Modrinth modpack"

View File

@@ -52,12 +52,6 @@ else
fi
# Download default configs to allow for consistent patching
for c in paper-global.yml paper-world-defaults.yml spigot.yml; do
DOWNLOAD_DEFAULT_CONFIGS+=",${PAPER_CONFIG_DEFAULTS_REPO}/${VERSION}/$c"
done
export DOWNLOAD_DEFAULT_CONFIGS
# Normalize on Spigot for downstream operations
export FAMILY=SPIGOT

View File

@@ -64,9 +64,6 @@ patchLog4jConfig() {
canUseRollingLogs=false
}
# Temporarily disable debugging output
oldState=$(shopt -po xtrace || true)
shopt -u -o xtrace
# Patch Log4j remote code execution vulnerability
# See https://www.minecraft.net/en-us/article/important-message--security-vulnerability-java-edition
if versionLessThan 1.7; then
@@ -83,7 +80,6 @@ elif isType PURPUR && versionLessThan 1.18.1; then
elif versionLessThan 1.18.1; then
useFallbackJvmFlag=true
fi
eval "$oldState"
if ${useFallbackJvmFlag}; then
JVM_OPTS="-Dlog4j2.formatMsgNoLookups=true ${JVM_OPTS}"
@@ -231,12 +227,6 @@ MC_HEALTH_EXTRA_ARGS=(
--use-server-list-ping
)
" > /data/.mc-health.env
elif isTrue "$USES_PROXY_PROTOCOL"; then
echo "
MC_HEALTH_EXTRA_ARGS=(
--use-proxy
)
" > /data/.mc-health.env
else
rm -f /data/.mc-health.env
fi

View File

@@ -4,7 +4,6 @@
. "${SCRIPTS:-/}start-utils"
set -e
handleDebugMode
: "${REPLACE_ENV_IN_PLACE:=${REPLACE_ENV_VARIABLES:-false}}"
: "${REPLACE_ENV_PATHS:=/data}"
@@ -14,7 +13,6 @@ handleDebugMode
: "${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS:=}"
: "${PATCH_DEFINITIONS:=}"
: "${DEBUG:=false}"
: "${DOWNLOAD_DEFAULT_CONFIGS:=}"
if isTrue "${REPLACE_ENV_IN_PLACE}"; then
log "Replacing env variables in ${REPLACE_ENV_PATHS} that match the prefix '$REPLACE_ENV_VARIABLE_PREFIX' ..."
@@ -27,16 +25,6 @@ if isTrue "${REPLACE_ENV_IN_PLACE}"; then
"${REPLACE_ENV_PATHS[@]}"
fi
if [[ $DOWNLOAD_DEFAULT_CONFIGS ]]; then
log "Downloading default configs, if needed"
if ! mc-image-helper mcopy \
--to /data/config \
--skip-existing --skip-up-to-date=false \
"$DOWNLOAD_DEFAULT_CONFIGS" 2> /dev/null; then
log "WARN: one or more default config files were not available from $DOWNLOAD_DEFAULT_CONFIGS"
fi
fi
if [[ ${PATCH_DEFINITIONS} ]]; then
log "Applying patch definitions from ${PATCH_DEFINITIONS}"
mc-image-helper patch \

View File

@@ -5,15 +5,10 @@
set -e
isDebugging && set -x
# support absolute directories
if [[ "${LEVEL:-world}" =~ ^\/.*$ ]]; then
worldDest=${LEVEL}
if [ "$TYPE" = "CURSEFORGE" ]; then
worldDest=$FTB_DIR/${LEVEL:-world}
else
if [ "$TYPE" = "CURSEFORGE" ]; then
worldDest=$FTB_DIR/${LEVEL:-world}
else
worldDest=/data/${LEVEL:-world}
fi
worldDest=/data/${LEVEL:-world}
fi
if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] ); then

View File

@@ -161,121 +161,11 @@ function normalizeMemSize() {
echo $((val * scale))
}
function compare_version() {
local left_version=$1
local comparison=$2
local right_version=$3
if [[ -z "$left_version" ]]; then
echo "Left version is required"
return 1
fi
if [[ -z "$right_version" ]]; then
echo "Right version is required"
return 1
fi
# Handle version channels ('a', 'b', or numeric)
if [[ $left_version == a* || $left_version == b* ]]; then
left_version=${left_version:1}
fi
if [[ $right_version == a* || $right_version == b* ]]; then
right_version=${right_version:1}
fi
local left_version_channel=${left_version:0:1}
if [[ $left_version_channel =~ [0-9] ]]; then
left_version_channel='r'
fi
local right_version_channel=${right_version:0:1}
if [[ $right_version_channel =~ [0-9] ]]; then
right_version_channel='r'
fi
if [[ $comparison == "lt" && $left_version_channel < $right_version_channel ]]; then
return 0
elif [[ $comparison == "lt" && $left_version_channel > $right_version_channel ]]; then
return 1
elif [[ $comparison == "gt" && $left_version_channel > $right_version_channel ]]; then
return 0
elif [[ $comparison == "gt" && $left_version_channel < $right_version_channel ]]; then
return 1
elif [[ $comparison == "le" && $left_version_channel < $right_version_channel ]]; then
return 0
elif [[ $comparison == "le" && $left_version_channel == $right_version_channel ]]; then
return 0
elif [[ $comparison == "ge" && $left_version_channel > $right_version_channel ]]; then
return 0
elif [[ $comparison == "ge" && $left_version_channel == $right_version_channel ]]; then
return 0
elif [[ $comparison == "eq" && $left_version_channel == $right_version_channel ]]; then
return 0
fi
# Compare the versions using sort -V
local result
case $comparison in
"lt")
if [[ $(echo -e "$left_version\n$right_version" | sort -V | head -n1) == "$left_version" && "$left_version" != "$right_version" ]]; then
result=0
else
result=1
fi
;;
"le")
if [[ $(echo -e "$left_version\n$right_version" | sort -V | head -n1) == "$left_version" ]]; then
result=0
else
result=1
fi
;;
"eq")
if [[ "$left_version" == "$right_version" ]]; then
result=0
else
result=1
fi
;;
"ge")
if [[ $(echo -e "$left_version\n$right_version" | sort -V | tail -n1) == "$left_version" ]]; then
result=0
else
result=1
fi
;;
"gt")
if [[ $(echo -e "$left_version\n$right_version" | sort -V | tail -n1) == "$left_version" && "$left_version" != "$right_version" ]]; then
result=0
else
result=1
fi
;;
*)
echo "Unsupported comparison operator: $comparison"
return 1
;;
esac
return $result
}
function versionLessThan() {
local oldState
# The return status when listing options is zero if all optnames are enabled, non- zero otherwise.
oldState=$(shopt -po xtrace || true)
shopt -u -o xtrace
# Use if-else since strict mode might be enabled
if compare_version "${VERSION}" "lt" "${1?}"; then
eval "$oldState"
if mc-image-helper compare-versions "${VERSION}" lt "${1?}"; then
return 0
else
eval "$oldState"
return 1
fi
}
@@ -452,7 +342,7 @@ function ensureRemoveAllModsOff() {
reason=${1?}
if isTrue "${REMOVE_OLD_MODS:-false}"; then
log "WARNING using REMOVE_OLD_MODS interferes with $reason -- it is now disabled"
log "WARNING using REMOVE_OLDS_MODS interferes with $reason -- it is now disabled"
REMOVE_OLD_MODS=false
fi
}

View File

@@ -2,8 +2,6 @@
set -euo pipefail
IFS=$'\n\t'
: "${IMAGE_TO_TEST:=itzg/minecraft-server}"
# go to script root directory
cd "$(dirname "$0")" || exit 1
@@ -48,7 +46,7 @@ setupOnlyMinecraftTest(){
outputContainerLog "$logs"
result=1
elif [ -f verify.sh ]; then
if ! docker run --rm --entrypoint bash -v "${PWD}/data":/data -v "${PWD}/verify.sh":/verify "${IMAGE_TO_TEST}" -e /verify; then
if ! docker run --rm --entrypoint bash -v "${PWD}/data":/data -v "${PWD}/verify.sh":/verify "${IMAGE_TO_TEST:-itzg/minecraft-server}" -e /verify; then
endTime=$(date +%s)
echo "${folder} FAILED verify in $(delta start)"
outputContainerLog "$logs"
@@ -76,7 +74,7 @@ if (( $# > 0 )); then
else
readarray -t folders < <(find . -maxdepth 2 -mindepth 2 -name docker-compose.yml -printf '%h\n')
for folder in "${folders[@]}"; do
echo "Starting Tests in ${folder} using $IMAGE_TO_TEST"
echo "Starting Tests in ${folder}"
setupOnlyMinecraftTest "$folder"
done
fi