diff --git a/Dockerfile b/Dockerfile index cc046cab..edbe2192 100644 --- a/Dockerfile +++ b/Dockerfile @@ -60,7 +60,7 @@ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \ --var version=0.1.1 --var app=maven-metadata-release --file {{.app}} \ --from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz -ARG MC_HELPER_VERSION=1.8.1 +ARG MC_HELPER_VERSION=1.9.2 ARG MC_HELPER_BASE_URL=https://github.com/itzg/mc-image-helper/releases/download/v${MC_HELPER_VERSION} RUN curl -fsSL ${MC_HELPER_BASE_URL}/mc-image-helper-${MC_HELPER_VERSION}.tgz \ | tar -C /usr/share -zxf - \ diff --git a/README.md b/README.md index d6b9cf79..ca6e9ec5 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,7 @@ By default, the container will download the latest version of the "vanilla" [Min * [Optional plugins, mods, and config attach points](#optional-plugins-mods-and-config-attach-points) * [Auto-downloading SpigotMC/Bukkit/PaperMC plugins](#auto-downloading-spigotmcbukkitpapermc-plugins) * [Downloadable mod/plugin pack for Forge, Bukkit, and Spigot Servers](#downloadable-modplugin-pack-for-forge-bukkit-and-spigot-servers) + * [Mod/Plugin URL Listing File](#modplugin-url-listing-file) * [Remove old mods/plugins](#remove-old-modsplugins) * [Working with world data](#working-with-world-data) * [Downloadable world](#downloadable-world) @@ -129,7 +130,7 @@ By default, the container will download the latest version of the "vanilla" [Min * [Enabling Autopause](#enabling-autopause) * [Running on RaspberryPi](#running-on-raspberrypi) - + @@ -548,6 +549,13 @@ docker run -d -v /path/on/host:/data ... \ -e FABRIC_INSTALLER_URL=http://HOST/fabric-installer-0.5.0.32.jar ... ``` +A specific loader version can be requested using `FABRIC_LOADER_VERSION`, such as: + +``` +docker run -d -v /path/on/host:/data ... \ + -e FABRIC_LOADER_VERSION=0.11.7 +``` + In order to add mods, you have two options: ### Running a Limbo server diff --git a/examples/.gitignore b/examples/.gitignore new file mode 100644 index 00000000..5fac6285 --- /dev/null +++ b/examples/.gitignore @@ -0,0 +1 @@ +/data/ \ No newline at end of file diff --git a/examples/docker-compose-forge.yml b/examples/docker-compose-forge.yml index 9a4d7688..45e35d1d 100644 --- a/examples/docker-compose-forge.yml +++ b/examples/docker-compose-forge.yml @@ -2,15 +2,16 @@ version: "3.8" services: mc: - image: itzg/minecraft-server:java8 + image: itzg/minecraft-server ports: # expose the Minecraft server port outside of container - - 25565:25565 + - "25565:25565" environment: # REQUIRED for all types EULA: "TRUE" # Set server type (vs the default of vanilla) TYPE: FORGE + DEBUG: "true" volumes: # use a named, managed volume for data volume - mc_forge:/data diff --git a/examples/docker-compose-mohist.yml b/examples/docker-compose-mohist.yml new file mode 100644 index 00000000..1407af7e --- /dev/null +++ b/examples/docker-compose-mohist.yml @@ -0,0 +1,17 @@ +version: "3.8" + +services: + mc: + image: itzg/minecraft-server + ports: + - "25565:25565" + environment: + EULA: "TRUE" + TYPE: MOHIST + VERSION: 1.12.2 + DEBUG: "true" + volumes: + - data:/data + +volumes: + data: {} diff --git a/start-deployFabric b/start-deployFabric index 5fce8d46..4f0a0d79 100755 --- a/start-deployFabric +++ b/start-deployFabric @@ -14,6 +14,7 @@ if [[ ! -e ${SERVER} ]]; then : ${FABRIC_INSTALLER:=} : ${FABRIC_INSTALLER_URL:=} + : ${FABRIC_LOADER_VERSION:=LATEST} : ${FABRIC_INSTALLER_VERSION:=${FABRICVERSION:-LATEST}} if [[ -z $FABRIC_INSTALLER && -z $FABRIC_INSTALLER_URL ]]; then @@ -31,6 +32,12 @@ if [[ ! -e ${SERVER} ]]; then exit 2 fi + if [[ -z $FABRIC_LOADER_VERSION || ${FABRIC_LOADER_VERSION^^} = LATEST ]]; then + log "Checking Fabric Loader version information." + + FABRIC_LOADER_VERSION=$(maven-metadata-release https://maven.fabricmc.net/net/fabricmc/fabric-loader/maven-metadata.xml) + fi + if [[ ! -e $FABRIC_INSTALLER ]]; then log "Downloading $FABRIC_INSTALLER_URL ..." if ! get -o "$FABRIC_INSTALLER" "$FABRIC_INSTALLER_URL"; then @@ -39,13 +46,14 @@ if [[ ! -e ${SERVER} ]]; then fi fi - log "Installing Fabric ${VANILLA_VERSION} using $FABRIC_INSTALLER" + log "Installing Fabric ${VANILLA_VERSION} using $FABRIC_INSTALLER with loader version $FABRIC_LOADER_VERSION" tries=3 set +e while ((--tries >= 0)); do java -jar $FABRIC_INSTALLER server \ -mcversion $VANILLA_VERSION \ + -loader $FABRIC_LOADER_VERSION \ -downloadMinecraft \ -dir /data if [[ $? == 0 ]]; then diff --git a/start-deployForge b/start-deployForge index 93d0bbb8..394c6050 100755 --- a/start-deployForge +++ b/start-deployForge @@ -1,7 +1,9 @@ #!/bin/bash -. ${SCRIPTS:-/}start-utils -: ${FORGEVERSION:=RECOMMENDED} +: "${FORGEVERSION:=RECOMMENDED}" + +# shellcheck source=start-utils +. "${SCRIPTS:-$(dirname "$0")}/start-utils" isDebugging && set -x get_installer() { @@ -16,7 +18,7 @@ get_installer() { for fn in $forgeFileNames; do downloadUrl=https://maven.minecraftforge.net/net/minecraftforge/forge/$fn log "...trying $downloadUrl" - if curl -o $FORGE_INSTALLER -fsSL $downloadUrl; then + if get -o "$FORGE_INSTALLER" "$downloadUrl"; then return fi done @@ -24,7 +26,7 @@ get_installer() { exit 2 else log "Downloading $FORGE_INSTALLER_URL ..." - if ! curl -o $FORGE_INSTALLER -fsSL $FORGE_INSTALLER_URL; then + if ! get -o "$FORGE_INSTALLER" "$FORGE_INSTALLER_URL"; then log "Failed to download from given location $FORGE_INSTALLER_URL" exit 2 fi @@ -32,20 +34,19 @@ get_installer() { } install() { - if [ ! -e $FORGE_INSTALLER ]; then - get_installer $normForgeVersion $shortForgeVersion + if [ ! -e "$FORGE_INSTALLER" ]; then + get_installer "$normForgeVersion" "$shortForgeVersion" fi log "Installing Forge $shortForgeVersion using $FORGE_INSTALLER" mkdir -p mods tries=3 while ((--tries >= 0)); do - java -jar $FORGE_INSTALLER --installServer - if [ $? == 0 ]; then + if java -jar "$FORGE_INSTALLER" --installServer; then break fi done - if (($tries < 0)); then + if ((tries < 0)); then log "Forge failed to install after several tries." >&2 exit 10 fi @@ -66,7 +67,7 @@ install() { export SERVER=$latest log "Using server $SERVER" - echo $SERVER > $installMarker + echo "$SERVER" > "$installMarker" } resolve_versions() { @@ -81,15 +82,21 @@ resolve_versions() { esac ################################################################################# + promosUrl=http://files.minecraftforge.net/maven/net/minecraftforge/forge/promotions_slim.json log "Checking Forge version information." case $FORGEVERSION in + LATEST) + if ! FORGE_VERSION=$(get --json-path ".promos['$VANILLA_VERSION-latest']" "$promosUrl"); then + log "ERROR: Version $VANILLA_VERSION is not supported by Forge" + log " Refer to http://files.minecraftforge.net/ for supported versions" + exit 2 + fi + ;; + RECOMMENDED) - curl -fsSL -o /tmp/forge.json http://files.minecraftforge.net/maven/net/minecraftforge/forge/promotions_slim.json - FORGE_VERSION=$(cat /tmp/forge.json | jq -r ".promos[\"$VANILLA_VERSION-recommended\"]") - if [ $FORGE_VERSION = null ]; then - FORGE_VERSION=$(cat /tmp/forge.json | jq -r ".promos[\"$VANILLA_VERSION-latest\"]") - if [ $FORGE_VERSION = null ]; then + if ! FORGE_VERSION=$(get --json-path ".promos['$VANILLA_VERSION-recommended']" "$promosUrl"); then + if ! FORGE_VERSION=$(get --json-path ".promos['$VANILLA_VERSION-latest']" "$promosUrl"); then log "ERROR: Version $VANILLA_VERSION is not supported by Forge" log " Refer to http://files.minecraftforge.net/ for supported versions" exit 2 @@ -122,14 +129,15 @@ resolve_versions installMarker="/data/.forge-installed-$shortForgeVersion" -if [ ! -e $installMarker ]; then +if [ ! -e "$installMarker" ]; then install else - export SERVER=$(cat $installMarker) + SERVER=$(cat "$installMarker") + export SERVER if [ ! -e "$SERVER" ] && versionLessThan 1.17; then rm "$installMarker" install fi fi -exec ${SCRIPTS:-/}start-setupWorld $@ +exec "${SCRIPTS:-$(dirname "$0")}/start-setupWorld" "$@" diff --git a/start-deployMohist b/start-deployMohist index 4128af14..1b8338fa 100755 --- a/start-deployMohist +++ b/start-deployMohist @@ -1,17 +1,18 @@ #!/bin/bash -. ${SCRIPTS:-/}start-utils +# shellcheck source=start-utils +. "${SCRIPTS:-$(dirname "$0")}/start-utils" set -o pipefail set -e isDebugging && set -x requireVar VANILLA_VERSION -: ${MOHIST_BUILD:=lastSuccessfulBuild} +: "${MOHIST_BUILD:=lastSuccessfulBuild}" mohistJobs=https://ci.codemc.io/job/MohistMC/job/ mohistJob=${mohistJobs}Mohist-${VANILLA_VERSION}/ -if ! curl -X HEAD -o /dev/null -fsSL "${mohistJob}"; then +if ! get --exists "${mohistJob}"; then log "ERROR: mohist builds do not exist for ${VANILLA_VERSION}" log " check https://ci.codemc.io/job/MohistMC/ for available versions" log " and set VERSION accordingly" @@ -19,8 +20,7 @@ if ! curl -X HEAD -o /dev/null -fsSL "${mohistJob}"; then fi buildRelPath=$( - curl -fsSL "${mohistJob}${MOHIST_BUILD}/api/json" | - jq -r '.artifacts[0].relativePath' + get --json-path '$.artifacts[0].relativePath' "${mohistJob}${MOHIST_BUILD}/api/json" ) baseName=$(basename "${buildRelPath}") @@ -33,11 +33,11 @@ fi export SERVER="/data/${baseName}" -if [ ! -f ${SERVER} ]; then +if [ ! -f "${SERVER}" ]; then log "Downloading ${baseName}" - curl -o "${SERVER}" -fsSL "${mohistJob}${MOHIST_BUILD}/artifact/${buildRelPath}" + get -o "${SERVER}" "${mohistJob}${MOHIST_BUILD}/artifact/${buildRelPath}" fi export SKIP_LOG4J_CONFIG=true -exec ${SCRIPTS:-/}start-setupWorld "$@" +exec "${SCRIPTS:-$(dirname "$0")}/start-setupWorld" "$@" diff --git a/start-setupModpack b/start-setupModpack index 572454b8..474dc7c7 100755 --- a/start-setupModpack +++ b/start-setupModpack @@ -9,9 +9,7 @@ set -e -o pipefail # shellcheck source=start-utils . "${SCRIPTS:-$(dirname "$0")}/start-utils" -if isDebugging; then - set -x -fi +isDebugging && set -x # CURSE_URL_BASE used in manifest downloads below CURSE_URL_BASE=${CURSE_URL_BASE:-https://minecraft.curseforge.com/projects} @@ -25,25 +23,13 @@ fi # If supplied with a URL for a modpack (simple zip of jars), download it and unpack if [[ "$MODPACK" ]]; then if isURL "${MODPACK}"; then - if [[ "${MODPACK}" == *.zip ]]; then - downloadUrl="${MODPACK}" - else - downloadUrl=$(curl -Ls -o /dev/null -w %{url_effective} $MODPACK) - if ! [[ $downloadUrl == *.zip ]]; then - log "ERROR Invalid URL given for MODPACK: $downloadUrl resolved from $MODPACK" - log " Must be HTTP, HTTPS or FTP and a ZIP file" - exit 1 - fi - fi - log "Downloading mod/plugin pack" - log " from $downloadUrl ..." - if ! curl -sSL -o /tmp/modpack.zip "$downloadUrl"; then - log "ERROR: failed to download from $downloadUrl" + if ! get -o /tmp/modpack.zip "${MODPACK}"; then + log "ERROR: failed to download from ${MODPACK}" exit 2 fi elif [[ "$MODPACK" =~ .*\.zip ]]; then - if ! cp $MODPACK /tmp/modpack.zip; then + if ! cp "$MODPACK" /tmp/modpack.zip; then log "ERROR: failed to copy from $MODPACK" exit 2 fi @@ -55,19 +41,17 @@ if [[ "$MODPACK" ]]; then if [ "$TYPE" = "SPIGOT" ]; then mkdir -p /data/plugins if ! unzip -o -d /data/plugins /tmp/modpack.zip; then - log "ERROR: failed to unzip the modpack from $downloadUrl" + log "ERROR: failed to unzip the modpack from ${MODPACK}" fi else mkdir -p /data/mods if ! unzip -o -d /data/mods /tmp/modpack.zip; then - log "ERROR: failed to unzip the modpack from $downloadUrl" + log "ERROR: failed to unzip the modpack from ${MODPACK}" fi fi rm -f /tmp/modpack.zip -fi -# If supplied with a URL for a plugin download it. -if [[ "$MODS" ]]; then +elif [[ "$MODS" ]]; then if [ "$TYPE" = "SPIGOT" ]; then out_dir=/data/plugins else @@ -98,9 +82,8 @@ if [[ "$MODS" ]]; then exit 2 fi done -fi -if [[ "$MODS_FILE" ]]; then +elif [[ "$MODS_FILE" ]]; then if [ ! -f "$MODS_FILE" ]; then log "ERROR: given MODS_FILE file does not exist" exit 2