Merge remote-tracking branch 'origin/master' into multiarch

This commit is contained in:
Geoff Bourne 2020-03-25 20:08:47 -05:00
commit 5b744176df
24 changed files with 272 additions and 162 deletions

View file

@ -35,34 +35,35 @@ ARG TARGETOS
ARG TARGETARCH ARG TARGETARCH
ARG TARGETVARIANT ARG TARGETVARIANT
ARG EASY_ADD_VER=0.5.3 ARG EASY_ADD_VER=0.7.0
ADD https://github.com/itzg/easy-add/releases/download/${EASY_ADD_VER}/easy-add_${TARGETOS}_${TARGETARCH}${TARGETVARIANT} /usr/bin/easy-add ADD https://github.com/itzg/easy-add/releases/download/${EASY_ADD_VER}/easy-add_${TARGETOS}_${TARGETARCH}${TARGETVARIANT} /usr/bin/easy-add
RUN chmod +x /usr/bin/easy-add RUN chmod +x /usr/bin/easy-add
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--var version=1.2.0 --var app=restify --file restify \ --var version=1.2.0 --var app=restify --file {{.app}} \
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz --from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--var version=1.4.7 --var app=rcon-cli --file rcon-cli \ --var version=1.4.7 --var app=rcon-cli --file {{.app}} \
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz --from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--var version=0.1.7 --var app=mc-monitor --file mc-monitor \ --var version=0.1.7 --var app=mc-monitor --file {{.app}} \
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz --from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--var version=1.3.3 --var app=mc-server-runner --file mc-server-runner \ --var version=1.3.3 --var app=mc-server-runner --file {{.app}} \
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz --from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--var version=0.1.1 --var app=maven-metadata-release --file maven-metadata-release \ --var version=0.1.1 --var app=maven-metadata-release --file {{.app}} \
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz --from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
COPY mcstatus /usr/local/bin COPY mcstatus /usr/local/bin
VOLUME ["/data","/mods","/config"] VOLUME ["/data","/mods","/config"]
COPY server.properties /tmp/server.properties COPY server.properties /tmp/server.properties
COPY log4j2.xml /tmp/log4j2.xml
WORKDIR /data WORKDIR /data
ENTRYPOINT [ "/start" ] ENTRYPOINT [ "/start" ]

View file

@ -123,6 +123,25 @@ During the next startup, if a newer version is available from the respective rel
the new server jar file is downloaded and used. _NOTE: over time you might see older versions of the new server jar file is downloaded and used. _NOTE: over time you might see older versions of
the server jar remain in the `/data` directory. It is safe to remove those._ the server jar remain in the `/data` directory. It is safe to remove those._
## Running Minecraft server on different Java version
To use a different version of Java, please use a docker tag to run your Minecraft server.
| Tag name | Description | Linux |
|---------|-------------|-------|
| latest | **Default**. Uses Java version 8 update 212 | Alpine Linux |
| adopt13 | Uses Java version 13 latest update | Alpine Linux |
| adopt11 | Uses Java version 11 latest update | Alpine Linux |
| openj9 | Uses Eclipse OpenJ9 JVM | Alpine Linux |
| openj9-nightly | Uses Eclipse OpenJ9 JVM testing builds | Alpine Linux |
| multiarch | Uses Java version 8 latest update | Debian Linux |
For example, to use a Java version 13:
docker run --name mc itzg/minecraft-server:adopt13
Keep in mind that some versions of Minecraft server can't work on the newest versions of Java. Also, FORGE doesn't support openj9 JVM implementation.
## Healthcheck ## Healthcheck
This image contains [Dinnerbone's mcstatus](https://github.com/Dinnerbone/mcstatus) and uses This image contains [Dinnerbone's mcstatus](https://github.com/Dinnerbone/mcstatus) and uses
@ -151,6 +170,17 @@ description: "{u'text': u'A Minecraft Server Powered by Docker'}"
players: 0/20 No players online players: 0/20 No players online
``` ```
## Deployment Templates and Examples
### Helm Charts
- [stable/minecraft](https://hub.helm.sh/charts/stable/minecraft) ([chart source](https://github.com/helm/charts/tree/master/stable/minecraft))
- [mcsh/server-deployment](https://github.com/mcserverhosting-net/charts)
### Examples
The [examples directory](https://github.com/itzg/docker-minecraft-server/tree/master/examples) also provides examples of deploying the [itzg/minecraft-server](https://hub.docker.com/r/itzg/minecraft-server/) Docker image.
## Running a Forge Server ## Running a Forge Server
Enable Forge server mode by adding a `-e TYPE=FORGE` to your command-line. Enable Forge server mode by adding a `-e TYPE=FORGE` to your command-line.

View file

@ -3,8 +3,10 @@
# Use this variable to indicate a list of branches that docker hub is watching # Use this variable to indicate a list of branches that docker hub is watching
branches_list=('openj9' 'openj9-nightly' 'adopt11') branches_list=('openj9' 'openj9-nightly' 'adopt11')
. /start-utils
function TrapExit { function TrapExit {
echo "Checking out back in master" log "Checking out back in master"
git checkout master git checkout master
} }
@ -17,33 +19,33 @@ do
batchMode=true batchMode=true
;; ;;
*) *)
echo "Unsupported arg $arg" log "Unsupported arg $arg"
exit 2 exit 2
;; ;;
esac esac
done done
${batchMode} && echo "Using batch mode" ${batchMode} && log "Using batch mode"
trap TrapExit EXIT SIGTERM trap TrapExit EXIT SIGTERM
test -d ./.git || { echo ".git folder was not found. Please start this script from root directory of the project!"; test -d ./.git || { log ".git folder was not found. Please start this script from root directory of the project!";
exit 1; } exit 1; }
# Making sure we are in master # Making sure we are in master
git checkout master git checkout master
git pull --all || { echo "Can't pull the repo!"; \ git pull --all || { log "Can't pull the repo!"; \
exit 1; } exit 1; }
git_branches=$(git branch -a) git_branches=$(git branch -a)
for branch in "${branches_list[@]}"; do for branch in "${branches_list[@]}"; do
if [[ "$git_branches" != *"$branch"* ]]; then if [[ "$git_branches" != *"$branch"* ]]; then
echo "Can't update $branch because I can't find it in the list of branches." log "Can't update $branch because I can't find it in the list of branches."
exit 1 exit 1
else else
echo "Branch $branch found. Working with it." log "Branch $branch found. Working with it."
git checkout "$branch" || { echo "Can't checkout into the branch. Don't know the cause."; \ git checkout "$branch" || { log "Can't checkout into the branch. Don't know the cause."; \
exit 1; } exit 1; }
proceed='False' proceed='False'
while [[ "$proceed" == "False" ]]; do while [[ "$proceed" == "False" ]]; do
@ -52,14 +54,14 @@ for branch in "${branches_list[@]}"; do
if git merge -m 'Auto-merging via docker-versions-create' master; then if git merge -m 'Auto-merging via docker-versions-create' master; then
proceed="True" proceed="True"
echo "Branch $branch updated to current master successfully" log "Branch $branch updated to current master successfully"
# pushing changes to remote for this branch # pushing changes to remote for this branch
git commit -m "Auto merge branch with master" -a git commit -m "Auto merge branch with master" -a
# push may fail if remote doesn't have this branch yet. In this case - sending branch # push may fail if remote doesn't have this branch yet. In this case - sending branch
git push || git push -u origin "$branch" || { echo "Can't push changes to the origin."; exit 1; } git push || git push -u origin "$branch" || { log "Can't push changes to the origin."; exit 1; }
elif ${batchMode}; then elif ${batchMode}; then
status=$? status=$?
echo "Git merge failed in batch mode" log "Git merge failed in batch mode"
exit ${status} exit ${status}
# and trap exit gets us back to master # and trap exit gets us back to master
else else

3
examples/README.md Normal file
View file

@ -0,0 +1,3 @@
# Deployment Examples
This directory contains various deployment examples of the [itzg/minecraft-server](https://hub.docker.com/r/itzg/minecraft-server/) Docker image.

34
log4j2.xml Normal file
View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" packages="com.mojang.util">
<Appenders>
<Console name="SysOut" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %msg%n" />
</Console>
<Queue name="ServerGuiConsole">
<PatternLayout pattern="[%d{HH:mm:ss} %level]: %msg%n" />
</Queue>
<RollingRandomAccessFile name="File" fileName="logs/latest.log" filePattern="logs/%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<OnStartupTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="logs">
<IfFileName glob="*.log.gz" />
<IfLastModified age="7d" />
</Delete>
</DefaultRolloverStrategy>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Root level="info">
<filters>
<MarkerFilter marker="NETWORK_PACKETS" onMatch="DENY" onMismatch="NEUTRAL" />
</filters>
<AppenderRef ref="SysOut"/>
<AppenderRef ref="File"/>
<AppenderRef ref="ServerGuiConsole"/>
</Root>
</Loggers>
</Configuration>

8
start
View file

@ -1,5 +1,7 @@
#!/bin/bash #!/bin/bash
. /start-utils
umask 0002 umask 0002
chmod g+w /data chmod g+w /data
@ -10,7 +12,7 @@ if [ $(id -u) = 0 ]; then
if [[ -v UID ]]; then if [[ -v UID ]]; then
if [[ $UID != 0 ]]; then if [[ $UID != 0 ]]; then
if [[ $UID != $(id -u minecraft) ]]; then if [[ $UID != $(id -u minecraft) ]]; then
echo "Changing uid of minecraft to $UID" log "Changing uid of minecraft to $UID"
usermod -u $UID minecraft usermod -u $UID minecraft
fi fi
else else
@ -21,7 +23,7 @@ if [ $(id -u) = 0 ]; then
if [[ -v GID ]]; then if [[ -v GID ]]; then
if [[ $GID != 0 ]]; then if [[ $GID != 0 ]]; then
if [[ $GID != $(id -g minecraft) ]]; then if [[ $GID != $(id -g minecraft) ]]; then
echo "Changing gid of minecraft to $GID" log "Changing gid of minecraft to $GID"
groupmod -o -g $GID minecraft groupmod -o -g $GID minecraft
fi fi
else else
@ -30,7 +32,7 @@ if [ $(id -u) = 0 ]; then
fi fi
if [[ $(stat -c "%u" /data) != $UID ]]; then if [[ $(stat -c "%u" /data) != $UID ]]; then
echo "Changing ownership of /data to $UID ..." log "Changing ownership of /data to $UID ..."
chown -R ${runAsUser}:${runAsGroup} /data chown -R ${runAsUser}:${runAsGroup} /data
fi fi

View file

@ -1,5 +1,7 @@
#!/bin/bash #!/bin/bash
. /start-utils
shopt -s nullglob shopt -s nullglob
#umask 002 #umask 002
@ -8,28 +10,28 @@ export HOME=/data
if [ ! -e /data/eula.txt ]; then if [ ! -e /data/eula.txt ]; then
EULA="${EULA,,}" EULA="${EULA,,}"
if [ "$EULA" != "true" ]; then if [ "$EULA" != "true" ]; then
echo "" log ""
echo "Please accept the Minecraft EULA at" log "Please accept the Minecraft EULA at"
echo " https://account.mojang.com/documents/minecraft_eula" log " https://account.mojang.com/documents/minecraft_eula"
echo "by adding the following immediately after 'docker run':" log "by adding the following immediately after 'docker run':"
echo " -e EULA=TRUE" log " -e EULA=TRUE"
echo "" log ""
exit 1 exit 1
fi fi
echo "# Generated via Docker on $(date)" > eula.txt echo "# Generated via Docker on $(date)" > eula.txt
echo "eula=$EULA" >> eula.txt echo "eula=$EULA" >> eula.txt
if [ $? != 0 ]; then if [ $? != 0 ]; then
echo "ERROR: unable to write eula to /data. Please make sure attached directory is writable by uid=${UID}" log "ERROR: unable to write eula to /data. Please make sure attached directory is writable by uid=${UID}"
exit 2 exit 2
fi fi
fi fi
echo "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)'"
if ! touch /data/.verify_access; then if ! touch /data/.verify_access; then
echo "ERROR: /data doesn't seem to be writable. Please make sure attached directory is writable by uid=$(id -u)" log "ERROR: /data doesn't seem to be writable. Please make sure attached directory is writable by uid=$(id -u)"
exit 2 exit 2
fi fi
@ -38,14 +40,14 @@ rm /data/.verify_access || true
if [[ $PROXY ]]; then if [[ $PROXY ]]; then
export http_proxy="$PROXY" export http_proxy="$PROXY"
export https_proxy="$PROXY" export https_proxy="$PROXY"
echo "INFO: Giving proxy time to startup..." log "INFO: Giving proxy time to startup..."
sleep 5 sleep 5
fi fi
export SERVER_PROPERTIES=/data/server.properties export SERVER_PROPERTIES=/data/server.properties
export VERSIONS_JSON=https://launchermeta.mojang.com/mc/game/version_manifest.json export VERSIONS_JSON=https://launchermeta.mojang.com/mc/game/version_manifest.json
echo "Checking version information." log "Checking version information."
case "X$VERSION" in case "X$VERSION" in
X|XLATEST|Xlatest) X|XLATEST|Xlatest)
export VANILLA_VERSION=`curl -fsSL $VERSIONS_JSON | jq -r '.latest.release'` export VANILLA_VERSION=`curl -fsSL $VERSIONS_JSON | jq -r '.latest.release'`
@ -65,7 +67,7 @@ cd /data
export ORIGINAL_TYPE=${TYPE^^} export ORIGINAL_TYPE=${TYPE^^}
echo "Checking type information." log "Checking type information."
case "${TYPE^^}" in case "${TYPE^^}" in
*BUKKIT|SPIGOT) *BUKKIT|SPIGOT)
exec /start-deployBukkitSpigot $@ exec /start-deployBukkitSpigot $@
@ -100,8 +102,8 @@ case "${TYPE^^}" in
;; ;;
*) *)
echo "Invalid type: '$TYPE'" log "Invalid type: '$TYPE'"
echo "Must be: VANILLA, FORGE, BUKKIT, SPIGOT, PAPER, FTB, CURSEFORGE, SPONGEVANILLA" log "Must be: VANILLA, FORGE, BUKKIT, SPIGOT, PAPER, FTB, CURSEFORGE, SPONGEVANILLA"
exit 1 exit 1
;; ;;

View file

@ -1,24 +1,27 @@
#!/bin/bash #!/bin/bash
. /start-utils
set -e set -e
function buildSpigotFromSource { function buildSpigotFromSource {
echo "Building Spigot $VANILLA_VERSION from source, might take a while, get some coffee" log "Building Spigot $VANILLA_VERSION from source, might take a while, get some coffee"
rm -rf /data/temp rm -rf /data/temp
mkdir /data/temp mkdir /data/temp
cd /data/temp cd /data/temp
jvmOpts="-Xms${INIT_MEMORY:-$MEMORY} -Xmx${MAX_MEMORY:-$MEMORY}" jvmOpts="-Xms${INIT_MEMORY:-$MEMORY} -Xmx${MAX_MEMORY:-$MEMORY}"
logn ''
curl -sSL -o /data/temp/BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar && \ curl -sSL -o /data/temp/BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar && \
java $jvmOpts -jar /data/temp/BuildTools.jar --rev $VANILLA_VERSION 2>&1 |tee /data/spigot_build.log| while read l; do echo -n .; done; echo "done" java $jvmOpts -jar /data/temp/BuildTools.jar --rev $VANILLA_VERSION 2>&1 |tee /data/spigot_build.log| while read l; do echo -n .; done; log "done"
if ! mv spigot-*.jar /data/spigot_server.jar; then if ! mv spigot-*.jar /data/spigot_server.jar; then
echo "ERR failed to build Spigot" log "ERR failed to build Spigot"
cat /data/spigot_build.log cat /data/spigot_build.log
exit 1 exit 1
fi fi
mv craftbukkit-*.jar /data/${SERVER} mv craftbukkit-*.jar /data/${SERVER}
echo "Cleaning up" log "Cleaning up"
rm -rf /data/temp rm -rf /data/temp
cd /data cd /data
} }
@ -42,7 +45,7 @@ function downloadSpigot {
downloadUrl="https://cdn.getbukkit.org/${getbukkitFlavor}/${getbukkitFlavor}-${VANILLA_VERSION}.jar" downloadUrl="https://cdn.getbukkit.org/${getbukkitFlavor}/${getbukkitFlavor}-${VANILLA_VERSION}.jar"
fi fi
echo "Downloading $match from $downloadUrl ..." log "Downloading $match from $downloadUrl ..."
curl -fsSL -o $SERVER "$downloadUrl" curl -fsSL -o $SERVER "$downloadUrl"
if [[ $? != 0 || $(grep -c "DOCTYPE html" $SERVER) != 0 ]]; then if [[ $? != 0 || $(grep -c "DOCTYPE html" $SERVER) != 0 ]]; then
cat <<EOF cat <<EOF

View file

@ -7,21 +7,21 @@ if isURL ${CUSTOM_SERVER}; then
export SERVER=/data/${filename} export SERVER=/data/${filename}
if [[ -f ${SERVER} ]] || [ -n "$FORCE_REDOWNLOAD" ]; then if [[ -f ${SERVER} ]] || [ -n "$FORCE_REDOWNLOAD" ]; then
echo "Using previously downloaded jar at ${SERVER}" log "Using previously downloaded jar at ${SERVER}"
else else
echo "Downloading custom server jar from ${CUSTOM_SERVER} ..." log "Downloading custom server jar from ${CUSTOM_SERVER} ..."
if ! curl -sSL -o ${SERVER} ${CUSTOM_SERVER}; then if ! curl -sSL -o ${SERVER} ${CUSTOM_SERVER}; then
echo "Failed to download from ${CUSTOM_SERVER}" log "Failed to download from ${CUSTOM_SERVER}"
exit 2 exit 2
fi fi
fi fi
elif [[ -f ${CUSTOM_SERVER} ]]; then elif [[ -f ${CUSTOM_SERVER} ]]; then
echo "Using custom server jar at ${CUSTOM_SERVER} ..." log "Using custom server jar at ${CUSTOM_SERVER} ..."
export SERVER=${CUSTOM_SERVER} export SERVER=${CUSTOM_SERVER}
else else
echo "CUSTOM_SERVER is not properly set to a URL or existing jar file" log "CUSTOM_SERVER is not properly set to a URL or existing jar file"
exit 2 exit 2
fi fi

View file

@ -8,11 +8,11 @@ export TYPE=FEED-THE-BEAST
FTB_SERVER_MOD=${FTB_SERVER_MOD:-$CF_SERVER_MOD} FTB_SERVER_MOD=${FTB_SERVER_MOD:-$CF_SERVER_MOD}
echo "Looking for Feed-The-Beast / CurseForge server modpack." log "Looking for Feed-The-Beast / CurseForge server modpack."
if [[ -z $FTB_SERVER_MOD ]]; then if [[ -z $FTB_SERVER_MOD ]]; then
echo "Environment variable FTB_SERVER_MOD not set." log "Environment variable FTB_SERVER_MOD not set."
echo "Set FTB_SERVER_MOD to the file name of the FTB server modpack." log "Set FTB_SERVER_MOD to the file name of the FTB server modpack."
echo "(And place the modpack in the /data directory.)" log "(And place the modpack in the /data directory.)"
exit 2 exit 2
fi fi
@ -21,7 +21,7 @@ entryScriptExpr="-name ServerStart.sh -o -name ServerStartLinux.sh -o -name Laun
if [[ -d ${FTB_BASE_DIR} ]]; then if [[ -d ${FTB_BASE_DIR} ]]; then
startScriptCount=$(find ${FTB_BASE_DIR} $entryScriptExpr |wc -l) startScriptCount=$(find ${FTB_BASE_DIR} $entryScriptExpr |wc -l)
if [[ $startScriptCount > 1 ]]; then if [[ $startScriptCount > 1 ]]; then
echo "Conflicting FTB/CurseForge packages have been installed. Please cleanup ${FTB_BASE_DIR}" log "Conflicting FTB/CurseForge packages have been installed. Please cleanup ${FTB_BASE_DIR}"
exit 2 exit 2
fi fi
else else
@ -45,7 +45,7 @@ if [[ $startScriptCount = 0 ]]; then
file=$(basename $(dirname $srv_modpack)) file=$(basename $(dirname $srv_modpack))
downloaded=/data/${file}.zip downloaded=/data/${file}.zip
if [ ! -e $downloaded ]; then if [ ! -e $downloaded ]; then
echo "Downloading FTB modpack... log "Downloading FTB modpack...
$srv_modpack -> $downloaded" $srv_modpack -> $downloaded"
curl -sSL -o $downloaded $srv_modpack curl -sSL -o $downloaded $srv_modpack
fi fi
@ -60,16 +60,16 @@ if [[ $startScriptCount = 0 ]]; then
srv_modpack=/data/${srv_modpack} srv_modpack=/data/${srv_modpack}
fi fi
if [[ ! -f ${srv_modpack} ]]; then if [[ ! -f ${srv_modpack} ]]; then
echo "FTB server modpack ${srv_modpack} not found." log "FTB server modpack ${srv_modpack} not found."
exit 2 exit 2
fi fi
if [[ ! ${srv_modpack: -4} == ".zip" ]]; then if [[ ! ${srv_modpack: -4} == ".zip" ]]; then
echo "FTB server modpack ${srv_modpack} is not a zip archive." log "FTB server modpack ${srv_modpack} is not a zip archive."
echo "Please set FTB_SERVER_MOD to a file with a .zip extension." log "Please set FTB_SERVER_MOD to a file with a .zip extension."
exit 2 exit 2
fi fi
echo "Unpacking FTB server modpack ${srv_modpack} ..." log "Unpacking FTB server modpack ${srv_modpack} ..."
mkdir -p ${FTB_BASE_DIR} mkdir -p ${FTB_BASE_DIR}
unzip -o ${srv_modpack} -d ${FTB_BASE_DIR} | awk '{printf "."} END {print ""}' unzip -o ${srv_modpack} -d ${FTB_BASE_DIR} | awk '{printf "."} END {print ""}'
fi fi
@ -79,7 +79,7 @@ if [[ $(find ${FTB_BASE_DIR} $entryScriptExpr | wc -l) = 0 ]]; then
forgeJar=$(find ${FTB_BASE_DIR} -name 'forge*.jar' -a -not -name 'forge*installer') forgeJar=$(find ${FTB_BASE_DIR} -name 'forge*.jar' -a -not -name 'forge*installer')
if [[ "$forgeJar" ]]; then if [[ "$forgeJar" ]]; then
export FTB_BASE_DIR=$(dirname "${forgeJar}") export FTB_BASE_DIR=$(dirname "${forgeJar}")
echo "No entry script found, so building one for ${forgeJar}" log "No entry script found, so building one for ${forgeJar}"
cat > "${FTB_BASE_DIR}/ServerStart.sh" <<EOF cat > "${FTB_BASE_DIR}/ServerStart.sh" <<EOF
#!/bin/sh #!/bin/sh
. ./settings-local.sh . ./settings-local.sh
@ -87,18 +87,18 @@ java \${JAVA_PARAMETERS} -Xmx\${MAX_RAM} -jar $(basename "${forgeJar}") nogui
EOF EOF
chmod +x "${FTB_BASE_DIR}/ServerStart.sh" chmod +x "${FTB_BASE_DIR}/ServerStart.sh"
else else
echo "Please make sure you are using the server version of the FTB modpack!" log "Please make sure you are using the server version of the FTB modpack!"
exit 2 exit 2
fi fi
fi fi
scriptCount=$(find "${FTB_BASE_DIR}" $entryScriptExpr | wc -l) scriptCount=$(find "${FTB_BASE_DIR}" $entryScriptExpr | wc -l)
if [[ $scriptCount = 0 ]]; then if [[ $scriptCount = 0 ]]; then
echo "Please make sure you are using the server version of the FTB modpack!" log "Please make sure you are using the server version of the FTB modpack!"
exit 2 exit 2
elif [[ $scriptCount > 1 ]]; then elif [[ $scriptCount > 1 ]]; then
echo "Ambigous startup scripts in FTB modpack!" log "Ambigous startup scripts in FTB modpack!"
echo "found:" log "found:"
find ${FTB_BASE_DIR} $entryScriptExpr find ${FTB_BASE_DIR} $entryScriptExpr
exit 2 exit 2
fi fi
@ -112,7 +112,7 @@ sed -i 's/.*read.*Restart now/#\0/' "${FTB_SERVER_START}"
legacyJavaFixerPath="${FTB_DIR}/mods/legacyjavafixer.jar" legacyJavaFixerPath="${FTB_DIR}/mods/legacyjavafixer.jar"
if isTrue ${FTB_LEGACYJAVAFIXER} && [ ! -e "${legacyJavaFixerPath}" ]; then if isTrue ${FTB_LEGACYJAVAFIXER} && [ ! -e "${legacyJavaFixerPath}" ]; then
echo "Installing legacy java fixer to ${legacyJavaFixerPath}" log "Installing legacy java fixer to ${legacyJavaFixerPath}"
curl -sSL -o "${legacyJavaFixerPath}" ${legacyJavaFixerUrl} curl -sSL -o "${legacyJavaFixerPath}" ${legacyJavaFixerUrl}
fi fi

View file

@ -9,7 +9,7 @@ FABRIC_INSTALLER=${FABRIC_INSTALLER:-}
FABRIC_INSTALLER_URL=${FABRIC_INSTALLER_URL:-} FABRIC_INSTALLER_URL=${FABRIC_INSTALLER_URL:-}
FABRICVERSION=${FABRICVERSION:-LATEST} FABRICVERSION=${FABRICVERSION:-LATEST}
if [[ -z $FABRIC_INSTALLER && -z $FABRIC_INSTALLER_URL ]]; then if [[ -z $FABRIC_INSTALLER && -z $FABRIC_INSTALLER_URL ]]; then
echo "Checking Fabric version information." log "Checking Fabric version information."
case $FABRICVERSION in case $FABRICVERSION in
LATEST) LATEST)
FABRIC_VERSION=$(maven-metadata-release https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml) FABRIC_VERSION=$(maven-metadata-release https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml)
@ -25,7 +25,7 @@ if [[ -z $FABRIC_INSTALLER && -z $FABRIC_INSTALLER_URL ]]; then
elif [[ -z $FABRIC_INSTALLER ]]; then elif [[ -z $FABRIC_INSTALLER ]]; then
FABRIC_INSTALLER="/tmp/fabric-installer.jar" FABRIC_INSTALLER="/tmp/fabric-installer.jar"
elif [[ ! -e $FABRIC_INSTALLER ]]; then elif [[ ! -e $FABRIC_INSTALLER ]]; then
echo "ERROR: the given Fabric installer doesn't exist : $FABRIC_INSTALLER" log "ERROR: the given Fabric installer doesn't exist : $FABRIC_INSTALLER"
exit 2 exit 2
fi fi
@ -35,14 +35,14 @@ debug Checking for installMarker ${installMarker}
if [[ ! -e $installMarker ]]; then if [[ ! -e $installMarker ]]; then
if [[ ! -e $FABRIC_INSTALLER ]]; then if [[ ! -e $FABRIC_INSTALLER ]]; then
if [[ -z $FABRIC_INSTALLER_URL ]]; then if [[ -z $FABRIC_INSTALLER_URL ]]; then
echo "Downloading $FABRIC_VERSION" log "Downloading $FABRIC_VERSION"
downloadUrl="https://maven.fabricmc.net/net/fabricmc/fabric-installer/$FABRIC_VERSION/fabric-installer-$FABRIC_VERSION.jar" downloadUrl="https://maven.fabricmc.net/net/fabricmc/fabric-installer/$FABRIC_VERSION/fabric-installer-$FABRIC_VERSION.jar"
echo "...trying $downloadUrl" log "...trying $downloadUrl"
curl -o $FABRIC_INSTALLER -fsSL $downloadUrl curl -o $FABRIC_INSTALLER -fsSL $downloadUrl
else else
echo "Downloading $FABRIC_INSTALLER_URL ..." log "Downloading $FABRIC_INSTALLER_URL ..."
if ! curl -o $FABRIC_INSTALLER -fsSL $FABRIC_INSTALLER_URL; then if ! curl -o $FABRIC_INSTALLER -fsSL $FABRIC_INSTALLER_URL; then
echo "Failed to download from given location $FABRIC_INSTALLER_URL" log "Failed to download from given location $FABRIC_INSTALLER_URL"
exit 2 exit 2
fi fi
fi fi
@ -51,7 +51,7 @@ if [[ ! -e $installMarker ]]; then
if isDebugging; then if isDebugging; then
debug "Installing Fabric $FABRIC_VERSION using $FABRIC_INSTALLER with mcversion ${VANILLA_VERSION}" debug "Installing Fabric $FABRIC_VERSION using $FABRIC_INSTALLER with mcversion ${VANILLA_VERSION}"
else else
echo "Installing Fabric $FABRIC_VERSION using $FABRIC_INSTALLER" log "Installing Fabric $FABRIC_VERSION using $FABRIC_INSTALLER"
fi fi
tries=3 tries=3
set +e set +e
@ -63,11 +63,11 @@ if [[ ! -e $installMarker ]]; then
done done
set -e set -e
if (($tries < 0)); then if (($tries < 0)); then
echo "Fabric failed to install after several tries." >&2 log "Fabric failed to install after several tries." >&2
exit 10 exit 10
fi fi
export SERVER=fabric-server-launch.jar export SERVER=fabric-server-launch.jar
echo "Using server $SERVER" log "Using server $SERVER"
echo $SERVER > $installMarker echo $SERVER > $installMarker
else else

View file

@ -1,5 +1,7 @@
#!/bin/bash #!/bin/bash
. /start-utils
export TYPE=FORGE export TYPE=FORGE
if [[ -z $FORGE_INSTALLER && -z $FORGE_INSTALLER_URL ]]; then if [[ -z $FORGE_INSTALLER && -z $FORGE_INSTALLER_URL ]]; then
@ -14,7 +16,7 @@ if [[ -z $FORGE_INSTALLER && -z $FORGE_INSTALLER_URL ]]; then
################################################################################# #################################################################################
echo "Checking Forge version information." log "Checking Forge version information."
case $FORGEVERSION in case $FORGEVERSION in
RECOMMENDED) RECOMMENDED)
curl -fsSL -o /tmp/forge.json http://files.minecraftforge.net/maven/net/minecraftforge/forge/promotions_slim.json curl -fsSL -o /tmp/forge.json http://files.minecraftforge.net/maven/net/minecraftforge/forge/promotions_slim.json
@ -22,8 +24,8 @@ if [[ -z $FORGE_INSTALLER && -z $FORGE_INSTALLER_URL ]]; then
if [ $FORGE_VERSION = null ]; then if [ $FORGE_VERSION = null ]; then
FORGE_VERSION=$(cat /tmp/forge.json | jq -r ".promos[\"$VANILLA_VERSION-latest\"]") FORGE_VERSION=$(cat /tmp/forge.json | jq -r ".promos[\"$VANILLA_VERSION-latest\"]")
if [ $FORGE_VERSION = null ]; then if [ $FORGE_VERSION = null ]; then
echo "ERROR: Version $VANILLA_VERSION is not supported by Forge" log "ERROR: Version $VANILLA_VERSION is not supported by Forge"
echo " Refer to http://files.minecraftforge.net/ for supported versions" log " Refer to http://files.minecraftforge.net/ for supported versions"
exit 2 exit 2
fi fi
fi fi
@ -41,7 +43,7 @@ if [[ -z $FORGE_INSTALLER && -z $FORGE_INSTALLER_URL ]]; then
elif [[ -z $FORGE_INSTALLER ]]; then elif [[ -z $FORGE_INSTALLER ]]; then
FORGE_INSTALLER="/tmp/forge-installer.jar" FORGE_INSTALLER="/tmp/forge-installer.jar"
elif [[ ! -e $FORGE_INSTALLER ]]; then elif [[ ! -e $FORGE_INSTALLER ]]; then
echo "ERROR: the given Forge installer doesn't exist : $FORGE_INSTALLER" log "ERROR: the given Forge installer doesn't exist : $FORGE_INSTALLER"
exit 2 exit 2
fi fi
@ -51,7 +53,7 @@ if [ ! -e $installMarker ]; then
if [ ! -e $FORGE_INSTALLER ]; then if [ ! -e $FORGE_INSTALLER ]; then
if [[ -z $FORGE_INSTALLER_URL ]]; then if [[ -z $FORGE_INSTALLER_URL ]]; then
echo "Downloading $normForgeVersion" log "Downloading $normForgeVersion"
forgeFileNames=" forgeFileNames="
$normForgeVersion/forge-$normForgeVersion-installer.jar $normForgeVersion/forge-$normForgeVersion-installer.jar
@ -60,25 +62,25 @@ if [ ! -e $installMarker ]; then
" "
for fn in $forgeFileNames; do for fn in $forgeFileNames; do
if [ $fn == END ]; then if [ $fn == END ]; then
echo "Unable to compute URL for $normForgeVersion" log "Unable to compute URL for $normForgeVersion"
exit 2 exit 2
fi fi
downloadUrl=http://files.minecraftforge.net/maven/net/minecraftforge/forge/$fn downloadUrl=http://files.minecraftforge.net/maven/net/minecraftforge/forge/$fn
echo "...trying $downloadUrl" log "...trying $downloadUrl"
if curl -o $FORGE_INSTALLER -fsSL $downloadUrl; then if curl -o $FORGE_INSTALLER -fsSL $downloadUrl; then
break break
fi fi
done done
else else
echo "Downloading $FORGE_INSTALLER_URL ..." log "Downloading $FORGE_INSTALLER_URL ..."
if ! curl -o $FORGE_INSTALLER -fsSL $FORGE_INSTALLER_URL; then if ! curl -o $FORGE_INSTALLER -fsSL $FORGE_INSTALLER_URL; then
echo "Failed to download from given location $FORGE_INSTALLER_URL" log "Failed to download from given location $FORGE_INSTALLER_URL"
exit 2 exit 2
fi fi
fi fi
fi fi
echo "Installing Forge $shortForgeVersion using $FORGE_INSTALLER" log "Installing Forge $shortForgeVersion using $FORGE_INSTALLER"
mkdir -p mods mkdir -p mods
tries=3 tries=3
while ((--tries >= 0)); do while ((--tries >= 0)); do
@ -88,22 +90,22 @@ if [ ! -e $installMarker ]; then
fi fi
done done
if (($tries < 0)); then if (($tries < 0)); then
echo "Forge failed to install after several tries." >&2 log "Forge failed to install after several tries." >&2
exit 10 exit 10
fi fi
# NOTE $shortForgeVersion will be empty if installer location was given to us # NOTE $shortForgeVersion will be empty if installer location was given to us
echo "Finding installed server jar..." log "Finding installed server jar..."
unset -v latest unset -v latest
for file in *forge*.jar; do for file in *forge*.jar; do
[[ $file =~ installer ]] || [[ $file -nt $latest ]] && latest=$file [[ $file =~ installer ]] || [[ $file -nt $latest ]] && latest=$file
done done
if [[ -z $latest ]]; then if [[ -z $latest ]]; then
echo "Unable to derive server jar for Forge" log "Unable to derive server jar for Forge"
exit 2 exit 2
fi fi
export SERVER=$latest export SERVER=$latest
echo "Using server $SERVER" log "Using server $SERVER"
echo $SERVER > $installMarker echo $SERVER > $installMarker
else else

View file

@ -1,12 +1,14 @@
#!/bin/bash #!/bin/bash
. /start-utils
export SERVER=paper_server-${VANILLA_VERSION}.jar export SERVER=paper_server-${VANILLA_VERSION}.jar
if [ ! -f "$SERVER" ] || [ -n "$FORCE_REDOWNLOAD" ]; then if [ ! -f "$SERVER" ] || [ -n "$FORCE_REDOWNLOAD" ]; then
downloadUrl=${PAPER_DOWNLOAD_URL:-https://papermc.io/api/v1/paper/${VANILLA_VERSION}/latest/download} downloadUrl=${PAPER_DOWNLOAD_URL:-https://papermc.io/api/v1/paper/${VANILLA_VERSION}/latest/download}
echo "Downloading Paper $VANILLA_VERSION from $downloadUrl ..." log "Downloading Paper $VANILLA_VERSION from $downloadUrl ..."
curl -fsSL -o "$SERVER" "$downloadUrl" curl -fsSL -o "$SERVER" "$downloadUrl"
if [ ! -f "$SERVER" ]; then if [ ! -f "$SERVER" ]; then
echo "ERROR: failed to download from $downloadUrl (status=$?)" log "ERROR: failed to download from $downloadUrl (status=$?)"
exit 3 exit 3
fi fi
fi fi

View file

@ -1,9 +1,11 @@
#!/bin/bash #!/bin/bash
. /start-utils
export TYPE=spongevanilla export TYPE=spongevanilla
# Parse branch # Parse branch
echo "Choosing branch for Sponge" log "Choosing branch for Sponge"
case "$SPONGEBRANCH" in case "$SPONGEBRANCH" in
EXPERIMENTAL|experimental|BLEEDING|bleeding) EXPERIMENTAL|experimental|BLEEDING|bleeding)
@ -18,7 +20,7 @@ esac
# If not SPONGEVERSION selected, detect last version on selected branch # If not SPONGEVERSION selected, detect last version on selected branch
if [ -z $SPONGEVERSION ]; then if [ -z $SPONGEVERSION ]; then
echo "Choosing Version for Sponge" log "Choosing Version for Sponge"
if [ "$SPONGEBRANCH" == "stable" ]; then if [ "$SPONGEBRANCH" == "stable" ]; then
export SPONGEVERSION=`curl -fsSL https://dl-api.spongepowered.org/v1/org.spongepowered/$TYPE | jq -r '.buildTypes.stable.latest.version'` export SPONGEVERSION=`curl -fsSL https://dl-api.spongepowered.org/v1/org.spongepowered/$TYPE | jq -r '.buildTypes.stable.latest.version'`
else else
@ -29,7 +31,7 @@ fi
export SERVER="spongevanilla-$SPONGEVERSION.jar" export SERVER="spongevanilla-$SPONGEVERSION.jar"
if [ ! -e $SERVER ] || [ -n "$FORCE_REDOWNLOAD" ]; then if [ ! -e $SERVER ] || [ -n "$FORCE_REDOWNLOAD" ]; then
echo "Downloading $SERVER ..." log "Downloading $SERVER ..."
curl -sSL -o $SERVER https://repo.spongepowered.org/maven/org/spongepowered/$TYPE/$SPONGEVERSION/$SERVER curl -sSL -o $SERVER https://repo.spongepowered.org/maven/org/spongepowered/$TYPE/$SPONGEVERSION/$SERVER
fi fi

View file

@ -6,16 +6,16 @@ set -o pipefail
export SERVER="minecraft_server.${VANILLA_VERSION// /_}.jar" export SERVER="minecraft_server.${VANILLA_VERSION// /_}.jar"
if [ ! -e $SERVER ] || [ -n "$FORCE_REDOWNLOAD" ]; then if [ ! -e $SERVER ] || [ -n "$FORCE_REDOWNLOAD" ]; then
echo "Downloading $SERVER ..." log "Downloading $SERVER ..."
debug "Finding version manifest for $VANILLA_VERSION" debug "Finding version manifest for $VANILLA_VERSION"
versionManifestUrl=$(curl -fsSL 'https://launchermeta.mojang.com/mc/game/version_manifest.json' | jq --arg VANILLA_VERSION "$VANILLA_VERSION" --raw-output '[.versions[]|select(.id == $VANILLA_VERSION)][0].url') versionManifestUrl=$(curl -fsSL 'https://launchermeta.mojang.com/mc/game/version_manifest.json' | jq --arg VANILLA_VERSION "$VANILLA_VERSION" --raw-output '[.versions[]|select(.id == $VANILLA_VERSION)][0].url')
result=$? result=$?
if [ $result != 0 ]; then if [ $result != 0 ]; then
echo "ERROR failed to obtain version manifest URL ($result)" log "ERROR failed to obtain version manifest URL ($result)"
exit 1 exit 1
fi fi
if [ $versionManifestUrl = "null" ]; then if [ $versionManifestUrl = "null" ]; then
echo "ERROR couldn't find a matching manifest entry for $VANILLA_VERSION" log "ERROR couldn't find a matching manifest entry for $VANILLA_VERSION"
exit 1 exit 1
fi fi
debug "Found version manifest at $versionManifestUrl" debug "Found version manifest at $versionManifestUrl"
@ -23,7 +23,7 @@ if [ ! -e $SERVER ] || [ -n "$FORCE_REDOWNLOAD" ]; then
serverDownloadUrl=$(curl -fsSL ${versionManifestUrl} | jq --raw-output '.downloads.server.url') serverDownloadUrl=$(curl -fsSL ${versionManifestUrl} | jq --raw-output '.downloads.server.url')
result=$? result=$?
if [ $result != 0 ]; then if [ $result != 0 ]; then
echo "ERROR failed to obtain version manifest from $versionManifestUrl ($result)" log "ERROR failed to obtain version manifest from $versionManifestUrl ($result)"
exit 1 exit 1
fi fi
@ -34,7 +34,7 @@ if [ ! -e $SERVER ] || [ -n "$FORCE_REDOWNLOAD" ]; then
curl $verbose -fsSL -o $SERVER $serverDownloadUrl curl $verbose -fsSL -o $SERVER $serverDownloadUrl
result=$? result=$?
if [ $result != 0 ]; then if [ $result != 0 ]; then
echo "ERROR failed to download server from $serverDownloadUrl ($result)" log "ERROR failed to download server from $serverDownloadUrl ($result)"
exit 1 exit 1
fi fi
fi fi

View file

@ -1,5 +1,7 @@
#!/bin/bash #!/bin/bash
. /start-utils
if [ $TYPE = "FEED-THE-BEAST" ]; then if [ $TYPE = "FEED-THE-BEAST" ]; then
worldDest=$FTB_BASE_DIR/$LEVEL worldDest=$FTB_BASE_DIR/$LEVEL
else else
@ -10,24 +12,24 @@ fi
if [[ "$WORLD" ]] && [ ! -d "$worldDest" ]; then if [[ "$WORLD" ]] && [ ! -d "$worldDest" ]; then
case "X$WORLD" in case "X$WORLD" in
X[Hh][Tt][Tt][Pp]*) X[Hh][Tt][Tt][Pp]*)
echo "Downloading world from $WORLD" log "Downloading world from $WORLD"
curl -sSL -o - "$WORLD" > /data/world.zip curl -sSL -o - "$WORLD" > /data/world.zip
echo "Unzipping world" log "Unzipping world"
unzip -o -q /data/world.zip unzip -o -q /data/world.zip
rm -f /data/world.zip rm -f /data/world.zip
if [ ! -d $worldDest ]; then if [ ! -d $worldDest ]; then
echo World directory not found log World directory not found
for i in /data/*/level.dat; do for i in /data/*/level.dat; do
if [ -f "$i" ]; then if [ -f "$i" ]; then
d=`dirname "$i"` d=`dirname "$i"`
echo Renaming world directory from $d log Renaming world directory from $d
mv -f "$d" $worldDest mv -f "$d" $worldDest
fi fi
done done
fi fi
if [ "$TYPE" = "SPIGOT" ]; then if [ "$TYPE" = "SPIGOT" ]; then
# Reorganise if a Spigot server # Reorganise if a Spigot server
echo "Moving End and Nether maps to Spigot location" log "Moving End and Nether maps to Spigot location"
[ -d "$worldDest/DIM1" ] && mv -f "$worldDest/DIM1" "/data/${LEVEL}_the_end" [ -d "$worldDest/DIM1" ] && mv -f "$worldDest/DIM1" "/data/${LEVEL}_the_end"
[ -d "$worldDest/DIM-1" ] && mv -f "$worldDest/DIM-1" "/data/${LEVEL}_nether" [ -d "$worldDest/DIM-1" ] && mv -f "$worldDest/DIM-1" "/data/${LEVEL}_nether"
fi fi
@ -35,13 +37,13 @@ case "X$WORLD" in
*) *)
if [[ -d $WORLD ]]; then if [[ -d $WORLD ]]; then
if [[ ! -d $worldDest ]]; then if [[ ! -d $worldDest ]]; then
echo "Cloning world directory from $WORLD ..." log "Cloning world directory from $WORLD ..."
cp -r $WORLD $worldDest cp -r $WORLD $worldDest
else else
echo "Skipping clone from $WORLD since $worldDest exists" log "Skipping clone from $WORLD since $worldDest exists"
fi fi
else else
echo "Invalid URL given for world: Must be HTTP or HTTPS and a ZIP file" log "Invalid URL given for world: Must be HTTP or HTTPS and a ZIP file"
fi fi
;; ;;
esac esac

View file

@ -21,28 +21,28 @@ if [[ "$MODPACK" ]]; then
EFFECTIVE_MODPACK_URL=$(curl -Ls -o /dev/null -w %{url_effective} $MODPACK) EFFECTIVE_MODPACK_URL=$(curl -Ls -o /dev/null -w %{url_effective} $MODPACK)
case "X$EFFECTIVE_MODPACK_URL" in case "X$EFFECTIVE_MODPACK_URL" in
X[Hh][Tt][Tt][Pp]*.zip) X[Hh][Tt][Tt][Pp]*.zip)
echo "Downloading mod/plugin pack via HTTP" log "Downloading mod/plugin pack via HTTP"
echo " from $EFFECTIVE_MODPACK_URL ..." log " from $EFFECTIVE_MODPACK_URL ..."
if ! curl -sSL -o /tmp/modpack.zip "$EFFECTIVE_MODPACK_URL"; then if ! curl -sSL -o /tmp/modpack.zip "$EFFECTIVE_MODPACK_URL"; then
echo "ERROR: failed to download from $EFFECTIVE_MODPACK_URL" log "ERROR: failed to download from $EFFECTIVE_MODPACK_URL"
exit 2 exit 2
fi fi
if [ "$TYPE" = "SPIGOT" ]; then if [ "$TYPE" = "SPIGOT" ]; then
mkdir -p /data/plugins mkdir -p /data/plugins
if ! unzip -o -d /data/plugins /tmp/modpack.zip; then if ! unzip -o -d /data/plugins /tmp/modpack.zip; then
echo "ERROR: failed to unzip the modpack from $EFFECTIVE_MODPACK_URL" log "ERROR: failed to unzip the modpack from $EFFECTIVE_MODPACK_URL"
fi fi
else else
mkdir -p /data/mods mkdir -p /data/mods
if ! unzip -o -d /data/mods /tmp/modpack.zip; then if ! unzip -o -d /data/mods /tmp/modpack.zip; then
echo "ERROR: failed to unzip the modpack from $EFFECTIVE_MODPACK_URL" log "ERROR: failed to unzip the modpack from $EFFECTIVE_MODPACK_URL"
fi fi
fi fi
rm -f /tmp/modpack.zip rm -f /tmp/modpack.zip
;; ;;
*) *)
echo "Invalid URL given for modpack: Must be HTTP or HTTPS and a ZIP file" log "Invalid URL given for modpack: Must be HTTP or HTTPS and a ZIP file"
;; ;;
esac esac
fi fi
@ -54,10 +54,10 @@ do
EFFECTIVE_MOD_URL=$(curl -Ls -o /dev/null -w %{url_effective} $i) EFFECTIVE_MOD_URL=$(curl -Ls -o /dev/null -w %{url_effective} $i)
case "X$EFFECTIVE_MOD_URL" in case "X$EFFECTIVE_MOD_URL" in
X[Hh][Tt][Tt][Pp]*.jar) X[Hh][Tt][Tt][Pp]*.jar)
echo "Downloading mod/plugin via HTTP" log "Downloading mod/plugin via HTTP"
echo " from $EFFECTIVE_MOD_URL ..." log " from $EFFECTIVE_MOD_URL ..."
if ! curl -sSL -o /tmp/${EFFECTIVE_MOD_URL##*/} $EFFECTIVE_MOD_URL; then if ! curl -sSL -o /tmp/${EFFECTIVE_MOD_URL##*/} $EFFECTIVE_MOD_URL; then
echo "ERROR: failed to download from $EFFECTIVE_MOD_URL to /tmp/${EFFECTIVE_MOD_URL##*/}" log "ERROR: failed to download from $EFFECTIVE_MOD_URL to /tmp/${EFFECTIVE_MOD_URL##*/}"
exit 2 exit 2
fi fi
@ -71,7 +71,7 @@ do
rm -f /tmp/${EFFECTIVE_MOD_URL##*/} rm -f /tmp/${EFFECTIVE_MOD_URL##*/}
;; ;;
*) *)
echo "Invalid URL given for modpack: Must be HTTP or HTTPS and a JAR file" log "Invalid URL given for modpack: Must be HTTP or HTTPS and a JAR file"
;; ;;
esac esac
done done
@ -85,7 +85,7 @@ if [[ "$MANIFEST" ]]; then
EFFECTIVE_MANIFEST_URL=$(curl -Ls -o /dev/null -w %{url_effective} $MANIFEST) EFFECTIVE_MANIFEST_URL=$(curl -Ls -o /dev/null -w %{url_effective} $MANIFEST)
curl -Ls -o $EFFECTIVE_MANIFEST_FILE "$EFFECTIVE_MANIFEST_URL" curl -Ls -o $EFFECTIVE_MANIFEST_FILE "$EFFECTIVE_MANIFEST_URL"
else else
echo "MANIFEST='$MANIFEST' is not a valid manifest url or location" log "MANIFEST='$MANIFEST' is not a valid manifest url or location"
exit 2 exit 2
fi fi
@ -95,27 +95,27 @@ case "X$EFFECTIVE_MANIFEST_FILE" in
MOD_DIR=${FTB_BASE_DIR:-/data}/mods MOD_DIR=${FTB_BASE_DIR:-/data}/mods
if [ ! -d "$MOD_DIR" ] if [ ! -d "$MOD_DIR" ]
then then
echo "Creating mods dir $MOD_DIR" log "Creating mods dir $MOD_DIR"
mkdir -p "$MOD_DIR" mkdir -p "$MOD_DIR"
fi fi
echo "Starting manifest download..." log "Starting manifest download..."
cat "${EFFECTIVE_MANIFEST_FILE}" | jq -r '.files[] | (.projectID|tostring) + " " + (.fileID|tostring)'| while read -r p f cat "${EFFECTIVE_MANIFEST_FILE}" | jq -r '.files[] | (.projectID|tostring) + " " + (.fileID|tostring)'| while read -r p f
do do
if [ ! -f $MOD_DIR/${p}_${f}.jar ] if [ ! -f $MOD_DIR/${p}_${f}.jar ]
then then
redirect_url="$(curl -Ls -o /dev/null -w %{url_effective} ${CURSE_URL_BASE}/${p})" redirect_url="$(curl -Ls -o /dev/null -w %{url_effective} ${CURSE_URL_BASE}/${p})"
url="$redirect_url/download/${f}/file" url="$redirect_url/download/${f}/file"
echo Downloading curseforge mod $url log Downloading curseforge mod $url
# Manifest usually doesn't have mod names. Using id should be fine, tho # Manifest usually doesn't have mod names. Using id should be fine, tho
curl -sSL "${url}" -o $MOD_DIR/${p}_${f}.jar curl -sSL "${url}" -o $MOD_DIR/${p}_${f}.jar
fi fi
done done
else else
echo "Could not find manifest file, unsufficient privs, or malformed path." log "Could not find manifest file, unsufficient privs, or malformed path."
fi fi
;; ;;
*) *)
echo "Invalid manifest file for modpack. Please make sure it is a .json file." log "Invalid manifest file for modpack. Please make sure it is a .json file."
;; ;;
esac esac
fi fi
@ -124,7 +124,7 @@ if [[ "${GENERIC_PACK}" ]]; then
if isURL "${GENERIC_PACK}"; then if isURL "${GENERIC_PACK}"; then
generic_pack_url=${GENERIC_PACK} generic_pack_url=${GENERIC_PACK}
GENERIC_PACK=/tmp/$(basename ${generic_pack_url}) GENERIC_PACK=/tmp/$(basename ${generic_pack_url})
echo "Downloading generic pack from ${generic_pack_url} ..." log "Downloading generic pack from ${generic_pack_url} ..."
curl -fsSL -o ${GENERIC_PACK} ${generic_pack_url} curl -fsSL -o ${GENERIC_PACK} ${generic_pack_url}
fi fi
@ -134,7 +134,7 @@ if [[ "${GENERIC_PACK}" ]]; then
mkdir -p ${base_dir} mkdir -p ${base_dir}
unzip -q -d ${base_dir} ${GENERIC_PACK} unzip -q -d ${base_dir} ${GENERIC_PACK}
depth=$(( ${GENERIC_PACK_STRIP_DIRS:-1} + 1 )) depth=$(( ${GENERIC_PACK_STRIP_DIRS:-1} + 1 ))
echo "Applying generic pack, stripping $(( depth - 1 )) level ..." log "Applying generic pack, stripping $(( depth - 1 )) level ..."
find ${base_dir} -type d -mindepth $depth -maxdepth $depth -exec cp -r {} /data/ + find ${base_dir} -type d -mindepth $depth -maxdepth $depth -exec cp -r {} /data/ +
rm -rf ${base_dir} rm -rf ${base_dir}
sha256sum ${GENERIC_PACK} > ${sum_file} sha256sum ${GENERIC_PACK} > ${sum_file}

View file

@ -1,11 +1,13 @@
#!/bin/bash #!/bin/bash
. /start-utils
# If supplied with a URL for a config (simple zip of configurations), download it and unpack # If supplied with a URL for a config (simple zip of configurations), download it and unpack
if [[ "$MODCONFIG" ]]; then if [[ "$MODCONFIG" ]]; then
case "X$MODCONFIG" in case "X$MODCONFIG" in
X[Hh][Tt][Tt][Pp]*[Zz][iI][pP]) X[Hh][Tt][Tt][Pp]*[Zz][iI][pP])
echo "Downloading mod/plugin configs via HTTP" log "Downloading mod/plugin configs via HTTP"
echo " from $MODCONFIG ..." log " from $MODCONFIG ..."
curl -sSL -o /tmp/modconfig.zip "$MODCONFIG" curl -sSL -o /tmp/modconfig.zip "$MODCONFIG"
if [ "$TYPE" = "SPIGOT" ]; then if [ "$TYPE" = "SPIGOT" ]; then
mkdir -p /data/plugins mkdir -p /data/plugins
@ -17,7 +19,7 @@ case "X$MODCONFIG" in
rm -f /tmp/modconfig.zip rm -f /tmp/modconfig.zip
;; ;;
*) *)
echo "Invalid URL given for modconfig: Must be HTTP or HTTPS and a ZIP file" log "Invalid URL given for modconfig: Must be HTTP or HTTPS and a ZIP file"
;; ;;
esac esac
fi fi

View file

@ -1,5 +1,7 @@
#!/bin/bash #!/bin/bash
. /start-utils
# FUNCTIONS # FUNCTIONS
function setServerProp { function setServerProp {
local prop=$1 local prop=$1
@ -10,16 +12,16 @@ function setServerProp {
TRUE|FALSE) TRUE|FALSE)
var=${var,,} ;; var=${var,,} ;;
esac esac
echo "Setting ${prop} to '${var}' in ${SERVER_PROPERTIES}" log "Setting ${prop} to '${var}' in ${SERVER_PROPERTIES}"
sed -i "/^${prop}\s*=/ c ${prop}=${var}" "$SERVER_PROPERTIES" sed -i "/^${prop}\s*=/ c ${prop}=${var}" "$SERVER_PROPERTIES"
else else
echo "Skip setting ${prop}" log "Skip setting ${prop}"
fi fi
} }
function customizeServerProps { function customizeServerProps {
if [ -n "$WHITELIST" ]; then if [ -n "$WHITELIST" ]; then
echo "Creating whitelist" log "Creating whitelist"
setServerProp "whitelist" "true" setServerProp "whitelist" "true"
setServerProp "white-list" "true" setServerProp "white-list" "true"
fi fi
@ -41,6 +43,7 @@ function customizeServerProps {
fi fi
setServerProp "server-name" "$SERVER_NAME" setServerProp "server-name" "$SERVER_NAME"
setServerProp "server-ip" "$SERVER_IP"
setServerProp "server-port" "$SERVER_PORT" setServerProp "server-port" "$SERVER_PORT"
setServerProp "motd" "$MOTD" setServerProp "motd" "$MOTD"
setServerProp "allow-nether" "$ALLOW_NETHER" setServerProp "allow-nether" "$ALLOW_NETHER"
@ -89,7 +92,7 @@ function customizeServerProps {
DIFFICULTY=3 DIFFICULTY=3
;; ;;
*) *)
echo "DIFFICULTY must be peaceful, easy, normal, or hard." log "DIFFICULTY must be peaceful, easy, normal, or hard."
exit 1 exit 1
;; ;;
esac esac
@ -97,7 +100,7 @@ function customizeServerProps {
fi fi
if [ -n "$MODE" ]; then if [ -n "$MODE" ]; then
echo "Setting mode" log "Setting mode"
MODE_LC=$( echo $MODE | tr '[:upper:]' '[:lower:]' ) MODE_LC=$( echo $MODE | tr '[:upper:]' '[:lower:]' )
case $MODE_LC in case $MODE_LC in
0|1|2|3) 0|1|2|3)
@ -115,7 +118,7 @@ function customizeServerProps {
MODE=3 MODE=3
;; ;;
*) *)
echo "ERROR: Invalid game mode: $MODE" log "ERROR: Invalid game mode: $MODE"
exit 1 exit 1
;; ;;
esac esac
@ -126,11 +129,11 @@ function customizeServerProps {
# Deploy server.properties file # Deploy server.properties file
if [[ ${TYPE} == "FEED-THE-BEAST" ]]; then if [[ ${TYPE} == "FEED-THE-BEAST" ]]; then
export SERVER_PROPERTIES=${FTB_DIR}/server.properties export SERVER_PROPERTIES=${FTB_DIR}/server.properties
echo "detected FTB, changing properties path to ${SERVER_PROPERTIES}" log "detected FTB, changing properties path to ${SERVER_PROPERTIES}"
fi fi
if [ ! -e "$SERVER_PROPERTIES" ]; then if [ ! -e "$SERVER_PROPERTIES" ]; then
echo "Creating server.properties in ${SERVER_PROPERTIES}" log "Creating server.properties in ${SERVER_PROPERTIES}"
cp /tmp/server.properties "$SERVER_PROPERTIES" cp /tmp/server.properties "$SERVER_PROPERTIES"
customizeServerProps customizeServerProps
elif [ -n "${OVERRIDE_SERVER_PROPERTIES}" ]; then elif [ -n "${OVERRIDE_SERVER_PROPERTIES}" ]; then
@ -139,11 +142,11 @@ elif [ -n "${OVERRIDE_SERVER_PROPERTIES}" ]; then
customizeServerProps customizeServerProps
;; ;;
*) *)
echo "server.properties already created, skipping" log "server.properties already created, skipping"
;; ;;
esac esac
else else
echo "server.properties already created, skipping" log "server.properties already created, skipping"
fi fi
exec /start-finalSetup05EnvVariables $@ exec /start-finalSetup05EnvVariables $@

View file

@ -1,14 +1,16 @@
#!/bin/bash #!/bin/bash
. /start-utils
if [ "${REPLACE_ENV_VARIABLES^^}" = "TRUE" ]; then if [ "${REPLACE_ENV_VARIABLES^^}" = "TRUE" ]; then
echo "Replacing env variables in configs that match the prefix $ENV_VARIABLE_PREFIX..." log "Replacing env variables in configs that match the prefix $ENV_VARIABLE_PREFIX..."
while IFS='=' read -r name value ; do while IFS='=' read -r name value ; do
# check if name of env variable matches the prefix # check if name of env variable matches the prefix
# sanity check environment variables to avoid code injections # sanity check environment variables to avoid code injections
if [[ "$name" = $ENV_VARIABLE_PREFIX* ]] \ if [[ "$name" = $ENV_VARIABLE_PREFIX* ]] \
&& [[ $value =~ ^[0-9a-zA-Z_:/=?.+\-]*$ ]] \ && [[ $value =~ ^[0-9a-zA-Z_:/=?.+\-]*$ ]] \
&& [[ $name =~ ^[0-9a-zA-Z_\-]*$ ]]; then && [[ $name =~ ^[0-9a-zA-Z_\-]*$ ]]; then
echo "Replacing $name with $value ..." log "Replacing $name with $value ..."
find /data/ -type f \ find /data/ -type f \
\( -name "*.yml" -or -name "*.yaml" -or -name "*.txt" -or -name "*.cfg" \ \( -name "*.yml" -or -name "*.yaml" -or -name "*.txt" -or -name "*.cfg" \
-or -name "*.conf" -or -name "*.properties" \) \ -or -name "*.conf" -or -name "*.properties" \) \

View file

@ -3,36 +3,46 @@
. /start-utils . /start-utils
if [ -n "$OPS" ]; then if [ -n "$OPS" ]; then
echo "Setting/adding ops" log "Setting/adding ops"
rm -rf ops.txt.converted rm -rf ops.txt.converted
echo $OPS | awk -v RS=, '{print}' > ops.txt echo $OPS | awk -v RS=, '{print}' > ops.txt
fi fi
if [ -n "$WHITELIST" ]; then if [ -n "$WHITELIST" ]; then
echo "Setting whitelist" log "Setting whitelist"
rm -rf white-list.txt.converted rm -rf white-list.txt.converted
echo $WHITELIST | awk -v RS=, '{print}' > white-list.txt echo $WHITELIST | awk -v RS=, '{print}' > white-list.txt
fi fi
if [ -n "$ICON" -a ! -e server-icon.png ]; then if [ -n "$ICON" -a ! -e server-icon.png ]; then
echo "Using server icon from $ICON..." log "Using server icon from $ICON..."
# Not sure what it is yet...call it "img" # Not sure what it is yet...call it "img"
curl -sSL -o /tmp/icon.img $ICON curl -sSL -o /tmp/icon.img $ICON
specs=$(identify /tmp/icon.img | awk '{print $2,$3}') specs=$(identify /tmp/icon.img | awk '{print $2,$3}')
if [ "$specs" = "PNG 64x64" ]; then if [ "$specs" = "PNG 64x64" ]; then
mv /tmp/icon.img /data/server-icon.png mv /tmp/icon.img /data/server-icon.png
else else
echo "Converting image to 64x64 PNG..." log "Converting image to 64x64 PNG..."
convert /tmp/icon.img -resize 64x64! /data/server-icon.png convert /tmp/icon.img -resize 64x64! /data/server-icon.png
fi fi
fi fi
# Set up log configuration
LOGFILE="/data/log4j2.xml"
if [ ! -e "$LOGFILE" ]; then
log "Creating log4j2.xml in ${LOGFILE}"
cp /tmp/log4j2.xml "$LOGFILE"
else
log "log4j2.xml already created, skipping"
fi
JVM_OPTS="-Dlog4j.configurationFile=/data/log4j2.xml ${JVM_OPTS}"
# Make sure files exist and are valid JSON (for pre-1.12 to 1.12 upgrades) # Make sure files exist and are valid JSON (for pre-1.12 to 1.12 upgrades)
echo "Checking for JSON files." log "Checking for JSON files."
JSON_FILES=$(find . -maxdepth 1 -name '*.json') JSON_FILES=$(find . -maxdepth 1 -name '*.json')
for j in $JSON_FILES; do for j in $JSON_FILES; do
if [[ $(cat $j | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') == "" ]]; then if [[ $(cat $j | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') == "" ]]; then
echo "Fixing JSON $j" log "Fixing JSON $j"
echo '[]' > $j echo '[]' > $j
fi fi
done done
@ -41,7 +51,7 @@ done
# If any modules have been provided, copy them over # If any modules have been provided, copy them over
mkdir -p /data/mods mkdir -p /data/mods
if [ -d /mods ]; then if [ -d /mods ]; then
echo "Copying any mods over..." log "Copying any mods over..."
rsync -a --out-format="update:%f:Last Modified %M" --prune-empty-dirs --update /mods /data rsync -a --out-format="update:%f:Last Modified %M" --prune-empty-dirs --update /mods /data
fi fi
@ -49,7 +59,7 @@ fi
for c in /config/* for c in /config/*
do do
if [ -f "$c" ]; then if [ -f "$c" ]; then
echo Copying configuration `basename "$c"` log Copying configuration `basename "$c"`
cp -rf "$c" /data/config cp -rf "$c" /data/config
fi fi
done done
@ -57,7 +67,7 @@ done
mkdir -p /data/plugins mkdir -p /data/plugins
if [ "$TYPE" = "SPIGOT" ]; then if [ "$TYPE" = "SPIGOT" ]; then
if [ -d /plugins ]; then if [ -d /plugins ]; then
echo "Copying any Bukkit plugins over..." log "Copying any Bukkit plugins over..."
# Copy plugins over using rsync to allow deeply nested updates of plugins # Copy plugins over using rsync to allow deeply nested updates of plugins
# only updates files if the source file is newer and print updated files # only updates files if the source file is newer and print updated files
rsync -a --out-format="update:%f:Last Modified %M" --prune-empty-dirs --update /plugins /data rsync -a --out-format="update:%f:Last Modified %M" --prune-empty-dirs --update /plugins /data
@ -76,7 +86,7 @@ if [[ ${GUI} = false || ${GUI} = FALSE ]]; then
fi fi
# put these prior JVM_OPTS at the end to give any memory settings there higher precedence # put these prior JVM_OPTS at the end to give any memory settings there higher precedence
echo "Setting initial memory to ${INIT_MEMORY:=${MEMORY}} and max to ${MAX_MEMORY:=${MEMORY}}" log "Setting initial memory to ${INIT_MEMORY:=${MEMORY}} and max to ${MAX_MEMORY:=${MEMORY}}"
expandedDOpts= expandedDOpts=
if [ -n "$JVM_DD_OPTS" ]; then if [ -n "$JVM_DD_OPTS" ]; then
@ -111,7 +121,7 @@ EOF
fi fi
cd "${FTB_DIR}" cd "${FTB_DIR}"
echo "Running FTB ${FTB_SERVER_START} in ${FTB_DIR} ..." log "Running FTB ${FTB_SERVER_START} in ${FTB_DIR} ..."
if isTrue ${DEBUG_EXEC}; then if isTrue ${DEBUG_EXEC}; then
set -x set -x
fi fi
@ -122,7 +132,7 @@ else
bootstrapArgs="--bootstrap /data/bootstrap.txt" bootstrapArgs="--bootstrap /data/bootstrap.txt"
fi fi
echo "Starting the Minecraft server..." log "Starting the Minecraft server..."
JVM_OPTS="-Xms${INIT_MEMORY} -Xmx${MAX_MEMORY} ${JVM_OPTS}" JVM_OPTS="-Xms${INIT_MEMORY} -Xmx${MAX_MEMORY} ${JVM_OPTS}"
if isTrue ${DEBUG_EXEC}; then if isTrue ${DEBUG_EXEC}; then
set -x set -x

View file

@ -37,6 +37,14 @@ function isDebugging {
function debug { function debug {
if isDebugging; then if isDebugging; then
echo "DEBUG: $*" log "DEBUG: $*"
fi fi
} }
function logn {
echo -n "[init] $*"
}
function log {
echo "[init] $*"
}