mirror of
https://github.com/itzg/docker-minecraft-server.git
synced 2026-03-20 21:45:58 +00:00
Compare commits
52 Commits
1.5.0
...
1.7.0-mult
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eba1ef6ab9 | ||
|
|
a486458a08 | ||
|
|
82b8401414 | ||
|
|
8b6ee91ec1 | ||
|
|
06cffd9e15 | ||
|
|
beaccbcf3b | ||
|
|
21ee5e2401 | ||
|
|
6462e1580c | ||
|
|
8b5552bb62 | ||
|
|
747c188824 | ||
|
|
692087dd25 | ||
|
|
6fe13e8654 | ||
|
|
3b2b98b9fe | ||
|
|
796f2fe14a | ||
|
|
4fef391b64 | ||
|
|
83f6cebd0b | ||
|
|
90183ae823 | ||
|
|
3c9df03584 | ||
|
|
367c6cfd92 | ||
|
|
5e75410e7c | ||
|
|
38028f7d0c | ||
|
|
3ca514f2b2 | ||
|
|
a07ae685e2 | ||
|
|
c07f899870 | ||
|
|
e527fd9551 | ||
|
|
047a477f7b | ||
|
|
78cb05adda | ||
|
|
8493252645 | ||
|
|
aa42633ab2 | ||
|
|
9ec336283f | ||
|
|
bbdb2c9b36 | ||
|
|
48e09f42fc | ||
|
|
ec7d182d38 | ||
|
|
9c7c95cf4f | ||
|
|
e32ffd1819 | ||
|
|
095c6ad099 | ||
|
|
14342c9632 | ||
|
|
f6df4d6694 | ||
|
|
0406e89c2a | ||
|
|
5ef21e1ddf | ||
|
|
414d5bd8ac | ||
|
|
15ccf03b28 | ||
|
|
828a48998f | ||
|
|
4b590e03ff | ||
|
|
0db8780ad9 | ||
|
|
5b744176df | ||
|
|
20b15e0330 | ||
|
|
818539e3de | ||
|
|
f48741f65c | ||
|
|
e9e5af849f | ||
|
|
22d68f5c7c | ||
|
|
690598da60 |
25
.github/workflows/build-multiarch.yml
vendored
Normal file
25
.github/workflows/build-multiarch.yml
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
name: Build and publish multiarch
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- multiarch
|
||||||
|
tags:
|
||||||
|
- "[0-9]+.[0-9]+.[0-9]+-multiarch"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
docker-buildx:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2.2.0
|
||||||
|
- name: Get branch name
|
||||||
|
uses: nelonoel/branch-name@v1
|
||||||
|
- name: Docker Buildx
|
||||||
|
uses: ilteoood/docker_buildx@1.0.4
|
||||||
|
with:
|
||||||
|
publish: true
|
||||||
|
imageName: itzg/minecraft-server
|
||||||
|
tag: ${{ env.BRANCH_NAME }}
|
||||||
|
dockerHubUser: ${{ secrets.DOCKER_USER }}
|
||||||
|
dockerHubPassword: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
|
|
||||||
12
.github/workflows/main.yml
vendored
12
.github/workflows/main.yml
vendored
@@ -16,7 +16,18 @@ on:
|
|||||||
- "[0-9]+.[0-9]+.[0-9]+-adopt13"
|
- "[0-9]+.[0-9]+.[0-9]+-adopt13"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: |
|
||||||
|
tests/test.sh
|
||||||
build:
|
build:
|
||||||
|
needs:
|
||||||
|
- test
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
@@ -32,4 +43,5 @@ jobs:
|
|||||||
tag_with_sha: false
|
tag_with_sha: false
|
||||||
cache_froms: itzg/minecraft-server:latest
|
cache_froms: itzg/minecraft-server:latest
|
||||||
add_git_labels: true
|
add_git_labels: true
|
||||||
|
labels: org.opencontainers.image.url=https://github.com/itzg/docker-minecraft-server,org.opencontainers.image.documentation=https://github.com/itzg/docker-minecraft-server
|
||||||
push: true
|
push: true
|
||||||
|
|||||||
11
.github/workflows/pr.yml
vendored
11
.github/workflows/pr.yml
vendored
@@ -5,15 +5,12 @@ on:
|
|||||||
branches: [ master ]
|
branches: [ master ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Build Docker image
|
- name: Run tests
|
||||||
uses: docker/build-push-action@v1.1.0
|
run: |
|
||||||
with:
|
tests/test.sh
|
||||||
tag_with_sha: true
|
|
||||||
cache_froms: itzg/minecraft-server:latest
|
|
||||||
push: false
|
|
||||||
|
|||||||
5
BUILDING.md
Normal file
5
BUILDING.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
Ensure buildx/BuildKit support is enabled and run:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker buildx build --platform=linux/arm64 --platform=linux/arm/v7 --platform=linux/amd64 --tag itzg/minecraft-server:multiarch --push .
|
||||||
|
```
|
||||||
52
Dockerfile
52
Dockerfile
@@ -1,29 +1,27 @@
|
|||||||
FROM openjdk:8u212-jre-alpine
|
FROM ubuntu:18.04
|
||||||
|
|
||||||
LABEL maintainer "itzg"
|
LABEL org.opencontainers.image.authors="Geoff Bourne <itzgeoff@gmail.com>"
|
||||||
|
|
||||||
RUN apk add --no-cache -U \
|
RUN apt-get update \
|
||||||
openssl \
|
&& DEBIAN_FRONTEND=noninteractive \
|
||||||
imagemagick \
|
apt-get install -y \
|
||||||
lsof \
|
openjdk-8-jre-headless \
|
||||||
su-exec \
|
imagemagick \
|
||||||
shadow \
|
gosu \
|
||||||
bash \
|
curl wget \
|
||||||
curl iputils wget \
|
jq \
|
||||||
git \
|
dos2unix \
|
||||||
jq \
|
mysql-client \
|
||||||
mysql-client \
|
tzdata \
|
||||||
tzdata \
|
rsync \
|
||||||
rsync \
|
nano \
|
||||||
nano \
|
unzip \
|
||||||
sudo \
|
knockd \
|
||||||
knock \
|
ttf-dejavu \
|
||||||
ttf-dejavu
|
&& apt-get clean
|
||||||
|
|
||||||
RUN addgroup -g 1000 minecraft \
|
RUN addgroup --gid 1000 minecraft \
|
||||||
&& adduser -Ss /bin/false -u 1000 -G minecraft -h /home/minecraft minecraft \
|
&& adduser --system --shell /bin/false --uid 1000 --ingroup minecraft --home /data minecraft
|
||||||
&& mkdir -m 777 /data \
|
|
||||||
&& chown minecraft:minecraft /data /home/minecraft
|
|
||||||
|
|
||||||
COPY files/sudoers* /etc/sudoers.d
|
COPY files/sudoers* /etc/sudoers.d
|
||||||
|
|
||||||
@@ -31,9 +29,9 @@ EXPOSE 25565 25575
|
|||||||
|
|
||||||
# hook into docker BuildKit --platform support
|
# hook into docker BuildKit --platform support
|
||||||
# see https://docs.docker.com/engine/reference/builder/#automatic-platform-args-in-the-global-scope
|
# see https://docs.docker.com/engine/reference/builder/#automatic-platform-args-in-the-global-scope
|
||||||
ARG TARGETOS=linux
|
ARG TARGETOS
|
||||||
ARG TARGETARCH=amd64
|
ARG TARGETARCH
|
||||||
ARG TARGETVARIANT=""
|
ARG TARGETVARIANT
|
||||||
|
|
||||||
ARG EASY_ADD_VER=0.7.1
|
ARG EASY_ADD_VER=0.7.1
|
||||||
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
|
||||||
@@ -67,7 +65,7 @@ COPY log4j2.xml /tmp/log4j2.xml
|
|||||||
WORKDIR /data
|
WORKDIR /data
|
||||||
|
|
||||||
ENV UID=1000 GID=1000 \
|
ENV UID=1000 GID=1000 \
|
||||||
JVM_XX_OPTS="-XX:+UseG1GC" MEMORY="1G" \
|
MEMORY="1G" \
|
||||||
TYPE=VANILLA VERSION=LATEST FORGEVERSION=RECOMMENDED SPONGEBRANCH=STABLE SPONGEVERSION= FABRICVERSION=LATEST LEVEL=world \
|
TYPE=VANILLA VERSION=LATEST FORGEVERSION=RECOMMENDED SPONGEBRANCH=STABLE SPONGEVERSION= FABRICVERSION=LATEST LEVEL=world \
|
||||||
PVP=true DIFFICULTY=easy ENABLE_RCON=true RCON_PORT=25575 RCON_PASSWORD=minecraft \
|
PVP=true DIFFICULTY=easy ENABLE_RCON=true RCON_PORT=25575 RCON_PASSWORD=minecraft \
|
||||||
LEVEL_TYPE=DEFAULT SERVER_PORT=25565 ONLINE_MODE=TRUE SERVER_NAME="Dedicated Server" \
|
LEVEL_TYPE=DEFAULT SERVER_PORT=25565 ONLINE_MODE=TRUE SERVER_NAME="Dedicated Server" \
|
||||||
|
|||||||
12
README.md
12
README.md
@@ -324,7 +324,13 @@ There are some limitations to what characters you can use.
|
|||||||
Variables will be replaced in files with the following extensions:
|
Variables will be replaced in files with the following extensions:
|
||||||
`.yml`, `.yaml`, `.txt`, `.cfg`, `.conf`, `.properties`.
|
`.yml`, `.yaml`, `.txt`, `.cfg`, `.conf`, `.properties`.
|
||||||
|
|
||||||
Specific files can be excluded by listing their name (without path) in the variable `REPLACE_ENV_VARIABLES_EXCLUDES`. Paths can be excluded by listing them in the variable `REPLACE_ENV_VARIABLES_EXCLUDE_PATHS`.
|
Specific files can be excluded by listing their name (without path) in the variable `REPLACE_ENV_VARIABLES_EXCLUDES`.
|
||||||
|
|
||||||
|
Paths can be excluded by listing them in the variable `REPLACE_ENV_VARIABLES_EXCLUDE_PATHS`. Path
|
||||||
|
excludes are recursive. Here is an example:
|
||||||
|
```
|
||||||
|
REPLACE_ENV_VARIABLES_EXCLUDE_PATHS="/data/plugins/Essentials/userdata /data/plugins/MyPlugin"
|
||||||
|
```
|
||||||
|
|
||||||
Here is a full example where we want to replace values inside a `database.yml`.
|
Here is a full example where we want to replace values inside a `database.yml`.
|
||||||
|
|
||||||
@@ -507,6 +513,10 @@ The following example uses `/modpacks` as the container path as the pre-download
|
|||||||
-e CF_SERVER_MOD=/modpacks/SkyFactory_4_Server_4.1.0.zip \
|
-e CF_SERVER_MOD=/modpacks/SkyFactory_4_Server_4.1.0.zip \
|
||||||
-p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server
|
-p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server
|
||||||
|
|
||||||
|
#### Buggy start scripts
|
||||||
|
|
||||||
|
Some modpacks have buggy or overly complex start scripts. You can avoid using the bundled start script and use this image's standard server-starting logic by adding `-e USE_MODPACK_START_SCRIPT=false`.
|
||||||
|
|
||||||
### Fixing "unable to launch forgemodloader"
|
### Fixing "unable to launch forgemodloader"
|
||||||
|
|
||||||
If your server's modpack fails to load with an error [like this](https://support.feed-the-beast.com/t/cant-start-crashlanding-server-unable-to-launch-forgemodloader/6028/2):
|
If your server's modpack fails to load with an error [like this](https://support.feed-the-beast.com/t/cant-start-crashlanding-server-unable-to-launch-forgemodloader/6028/2):
|
||||||
|
|||||||
0
docs/.gitkeep
Normal file
0
docs/.gitkeep
Normal file
2
start
2
start
@@ -45,7 +45,7 @@ if [ $(id -u) = 0 ]; then
|
|||||||
echo 'hosts: files dns' > /etc/nsswitch.conf
|
echo 'hosts: files dns' > /etc/nsswitch.conf
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec su-exec ${runAsUser}:${runAsGroup} ${SCRIPTS:-/}start-configuration $@
|
exec gosu ${runAsUser}:${runAsGroup} ${SCRIPTS:-/}start-configuration $@
|
||||||
else
|
else
|
||||||
exec ${SCRIPTS:-/}start-configuration $@
|
exec ${SCRIPTS:-/}start-configuration $@
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ shopt -s nullglob
|
|||||||
#umask 002
|
#umask 002
|
||||||
export HOME=/data
|
export HOME=/data
|
||||||
|
|
||||||
|
log "Running as uid=$(id -u) gid=$(id -g) with /data as '$(ls -lnd /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
|
||||||
@@ -28,15 +30,6 @@ if [ ! -e /data/eula.txt ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
log "Running as uid=$(id -u) gid=$(id -g) with /data as '$(ls -lnd /data)'"
|
|
||||||
|
|
||||||
if ! touch /data/.verify_access; then
|
|
||||||
log "ERROR: /data doesn't seem to be writable. Please make sure attached directory is writable by uid=$(id -u)"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
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"
|
||||||
@@ -45,6 +38,22 @@ if [[ $PROXY ]]; then
|
|||||||
sleep 5
|
sleep 5
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [[ $RCON_PASSWORD_FILE ]]; then
|
||||||
|
log ""
|
||||||
|
if [ ! -e ${RCON_PASSWORD_FILE} ]; then
|
||||||
|
log "Initial RCON password file ${RCON_PASSWORD_FILE} does not seems to exist."
|
||||||
|
log "Please ensure your configuration."
|
||||||
|
log "If you are using Docker Secrets feature, please check this for further information: "
|
||||||
|
log " https://docs.docker.com/engine/swarm/secrets"
|
||||||
|
log ""
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
RCON_PASSWORD=$(cat ${RCON_PASSWORD_FILE})
|
||||||
|
export RCON_PASSWORD
|
||||||
|
fi
|
||||||
|
log ""
|
||||||
|
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
|
||||||
|
|
||||||
@@ -55,11 +64,8 @@ case "X$VERSION" in
|
|||||||
XSNAPSHOT|Xsnapshot)
|
XSNAPSHOT|Xsnapshot)
|
||||||
VANILLA_VERSION=$(curl -fsSL $VERSIONS_JSON | jq -r '.latest.snapshot')
|
VANILLA_VERSION=$(curl -fsSL $VERSIONS_JSON | jq -r '.latest.snapshot')
|
||||||
;;
|
;;
|
||||||
X[1-9]*)
|
|
||||||
VANILLA_VERSION=$VERSION
|
|
||||||
;;
|
|
||||||
*)
|
*)
|
||||||
VANILLA_VERSION=$(curl -fsSL $VERSIONS_JSON | jq -r '.latest.release')
|
VANILLA_VERSION=$VERSION
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
export VANILLA_VERSION
|
export VANILLA_VERSION
|
||||||
@@ -95,10 +101,14 @@ case "${TYPE^^}" in
|
|||||||
exec ${SCRIPTS:-/}start-deployFabric "$@"
|
exec ${SCRIPTS:-/}start-deployFabric "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
FTB|CURSEFORGE)
|
FTBA)
|
||||||
exec ${SCRIPTS:-/}start-deployFTB "$@"
|
exec ${SCRIPTS:-/}start-deployFTB "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
CURSEFORGE|FTB)
|
||||||
|
exec ${SCRIPTS:-/}start-deployCF "$@"
|
||||||
|
;;
|
||||||
|
|
||||||
VANILLA)
|
VANILLA)
|
||||||
exec ${SCRIPTS:-/}start-deployVanilla "$@"
|
exec ${SCRIPTS:-/}start-deployVanilla "$@"
|
||||||
;;
|
;;
|
||||||
@@ -129,8 +139,9 @@ case "${TYPE^^}" in
|
|||||||
|
|
||||||
*)
|
*)
|
||||||
log "Invalid type: '$TYPE'"
|
log "Invalid type: '$TYPE'"
|
||||||
log "Must be: VANILLA, FORGE, BUKKIT, SPIGOT, PAPER, FTBA, CURSEFORGE, SPONGEVANILLA,"
|
log "Must be: VANILLA, FORGE, BUKKIT, SPIGOT, PAPER, FTBA (multiarch-only),"
|
||||||
log " CUSTOM, CURSE_INSTANCE, MAGMA, MOHIST, CATSERVER"
|
log " CURSE_INSTANCE, CURSEFORGE, SPONGEVANILLA,"
|
||||||
|
log " CUSTOM, MAGMA, MOHIST, CATSERVER"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
|||||||
@@ -62,8 +62,12 @@ function downloadSpigot {
|
|||||||
downloadUrl="https://cdn.getbukkit.org/${getbukkitFlavor}/${getbukkitFlavor}-${VANILLA_VERSION}.jar"
|
downloadUrl="https://cdn.getbukkit.org/${getbukkitFlavor}/${getbukkitFlavor}-${VANILLA_VERSION}.jar"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ -f $SERVER ]; then
|
||||||
|
# tell curl to only download when newer
|
||||||
|
zarg="-z $SERVER"
|
||||||
|
fi
|
||||||
log "Downloading $match from $downloadUrl ..."
|
log "Downloading $match from $downloadUrl ..."
|
||||||
curl -fsSL -o $SERVER "$downloadUrl"
|
curl -fsSL -o $SERVER $zarg "$downloadUrl"
|
||||||
if [[ $? != 0 || $(grep -c "DOCTYPE html" $SERVER) != 0 ]]; then
|
if [[ $? != 0 || $(grep -c "DOCTYPE html" $SERVER) != 0 ]]; then
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
|
|
||||||
@@ -89,12 +93,12 @@ case "$TYPE" in
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [ ! -f $SERVER ] || [ -n "$FORCE_REDOWNLOAD" ]; then
|
if isTrue "$BUILD_SPIGOT_FROM_SOURCE" || isTrue "$BUILD_FROM_SOURCE"; then
|
||||||
if isTrue "$BUILD_SPIGOT_FROM_SOURCE" || isTrue "$BUILD_FROM_SOURCE"; then
|
if [ ! -f $SERVER ] || [ -n "$FORCE_REDOWNLOAD" ]; then
|
||||||
buildSpigotFromSource
|
buildSpigotFromSource
|
||||||
else
|
fi
|
||||||
downloadSpigot
|
else
|
||||||
fi
|
downloadSpigot
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Normalize on Spigot for operations below
|
# Normalize on Spigot for operations below
|
||||||
|
|||||||
189
start-deployCF
Normal file
189
start-deployCF
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
|
||||||
|
export FTB_BASE_DIR=/data/FeedTheBeast
|
||||||
|
legacyJavaFixerUrl=http://ftb.cursecdn.com/FTB2/maven/net/minecraftforge/lex/legacyjavafixer/1.0/legacyjavafixer-1.0.jar
|
||||||
|
export TYPE=CURSEFORGE
|
||||||
|
|
||||||
|
FTB_SERVER_MOD=${FTB_SERVER_MOD:-$CF_SERVER_MOD}
|
||||||
|
|
||||||
|
log "Looking for Feed-The-Beast / CurseForge server modpack."
|
||||||
|
requireVar FTB_SERVER_MOD
|
||||||
|
|
||||||
|
if ! isTrue ${USE_MODPACK_START_SCRIPT:-true}; then
|
||||||
|
if ! [ -f ${FTB_SERVER_MOD} ]; then
|
||||||
|
log "ERROR unable to find requested modpack file ${FTB_SERVER_MOD}"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
needsInstall=true
|
||||||
|
installMarker=/data/.curseforge-installed
|
||||||
|
if [ -f $installMarker ]; then
|
||||||
|
if [ "$(cat $installMarker)" != "${FTB_SERVER_MOD}" ]; then
|
||||||
|
log "Upgrading modpack"
|
||||||
|
|
||||||
|
serverJar=$(find ${FTB_BASE_DIR} -not -name "forge*installer.jar" -name "forge*.jar")
|
||||||
|
if [[ "${serverJar}" ]]; then
|
||||||
|
rm -rf $(dirname "${serverJar}")/{mods,*.jar,libraries,resources,scripts}
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
needsInstall=false
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if $needsInstall; then
|
||||||
|
log "Unpacking FTB server modpack ${FTB_SERVER_MOD} ..."
|
||||||
|
mkdir -p ${FTB_BASE_DIR}
|
||||||
|
unzip -o ${FTB_SERVER_MOD} -d ${FTB_BASE_DIR} | awk '{printf "."} END {print ""}'
|
||||||
|
|
||||||
|
forgeInstallerJar=$(find ${FTB_BASE_DIR} -name "forge*installer.jar")
|
||||||
|
if [[ -z "${forgeInstallerJar}" ]]; then
|
||||||
|
log "ERROR Unable to find forge installer in modpack."
|
||||||
|
log " Make sure you downloaded the server files."
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Installing forge server"
|
||||||
|
(cd $(dirname "${forgeInstallerJar}"); java -jar $(basename ${forgeInstallerJar}) --installServer) | awk '{printf "."} END {print ""}'
|
||||||
|
|
||||||
|
echo "${FTB_SERVER_MOD}" > $installMarker
|
||||||
|
fi
|
||||||
|
|
||||||
|
export SERVER=$(find ${FTB_BASE_DIR} -not -name "forge*installer.jar" -name "forge*.jar")
|
||||||
|
if [[ -z "${SERVER}" || ! -f "${SERVER}" ]]; then
|
||||||
|
log "ERROR unable to locate installed forge server jar"
|
||||||
|
isDebugging && find ${FTB_BASE_DIR} -name "forge*.jar"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
export FTB_DIR=$(dirname "${SERVER}")
|
||||||
|
|
||||||
|
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
||||||
|
fi
|
||||||
|
|
||||||
|
entryScriptExpr="
|
||||||
|
-name ServerStart.sh
|
||||||
|
-o -name serverstart.sh
|
||||||
|
-o -name ServerStartLinux.sh
|
||||||
|
-o -name LaunchServer.sh
|
||||||
|
-o -name server-start.sh
|
||||||
|
-o -name startserver.sh
|
||||||
|
-o -name StartServer.sh
|
||||||
|
"
|
||||||
|
|
||||||
|
if [[ -d ${FTB_BASE_DIR} ]]; then
|
||||||
|
startScriptCount=$(find ${FTB_BASE_DIR} $entryScriptExpr |wc -l)
|
||||||
|
if [[ $startScriptCount > 1 ]]; then
|
||||||
|
log "Conflicting FTB/CurseForge packages have been installed. Please cleanup ${FTB_BASE_DIR}"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
startScriptCount=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# only download and install if a mod pack isn't already installed
|
||||||
|
# also check for the start script rather than just the folder
|
||||||
|
# this allows saving just the world separate from the rest of the data directory
|
||||||
|
if [[ $startScriptCount = 0 ]]; then
|
||||||
|
srv_modpack=${FTB_SERVER_MOD}
|
||||||
|
if isURL ${srv_modpack}; then
|
||||||
|
case $srv_modpack in
|
||||||
|
https://www.feed-the-beast.com/*/download|https://www.curseforge.com/minecraft/modpacks/*/download/*/file)
|
||||||
|
;;
|
||||||
|
https://www.curseforge.com/minecraft/modpacks/*/download/*)
|
||||||
|
srv_modpack=${srv_modpack}/file;;
|
||||||
|
https://www.feed-the-beast.com/*)
|
||||||
|
srv_modpack=${srv_modpack}/download;;
|
||||||
|
esac
|
||||||
|
file=$(basename $(dirname $srv_modpack))
|
||||||
|
downloaded=/data/${file}.zip
|
||||||
|
if [ ! -e $downloaded ]; then
|
||||||
|
log "Downloading FTB modpack...
|
||||||
|
$srv_modpack -> $downloaded"
|
||||||
|
curl -sSL -o $downloaded $srv_modpack
|
||||||
|
fi
|
||||||
|
srv_modpack=$downloaded
|
||||||
|
fi
|
||||||
|
if [[ ${srv_modpack:0:5} == "data/" ]]; then
|
||||||
|
# Prepend with "/"
|
||||||
|
srv_modpack=/${srv_modpack}
|
||||||
|
fi
|
||||||
|
if [[ ! ${srv_modpack:0:1} == "/" ]]; then
|
||||||
|
# If not an absolute path, assume file is in "/data"
|
||||||
|
srv_modpack=/data/${srv_modpack}
|
||||||
|
fi
|
||||||
|
if [[ ! -f ${srv_modpack} ]]; then
|
||||||
|
log "FTB server modpack ${srv_modpack} not found."
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
if [[ ! ${srv_modpack: -4} == ".zip" ]]; then
|
||||||
|
log "FTB server modpack ${srv_modpack} is not a zip archive."
|
||||||
|
log "Please set FTB_SERVER_MOD to a file with a .zip extension."
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Unpacking FTB server modpack ${srv_modpack} ..."
|
||||||
|
mkdir -p ${FTB_BASE_DIR}
|
||||||
|
unzip -o ${srv_modpack} -d ${FTB_BASE_DIR} | awk '{printf "."} END {print ""}'
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $(find ${FTB_BASE_DIR} $entryScriptExpr | wc -l) = 0 ]]; then
|
||||||
|
|
||||||
|
# Allow up to 2 levels since some modpacks have a top-level directory named
|
||||||
|
# for the modpack
|
||||||
|
forgeJar=$(find ${FTB_BASE_DIR} -maxdepth 2 -name 'forge*.jar' -a -not -name 'forge*installer')
|
||||||
|
if [[ "$forgeJar" ]]; then
|
||||||
|
export FTB_BASE_DIR=$(dirname "${forgeJar}")
|
||||||
|
log "No entry script found, so building one for ${forgeJar}"
|
||||||
|
cat > "${FTB_BASE_DIR}/ServerStart.sh" <<EOF
|
||||||
|
#!/bin/sh
|
||||||
|
. ./settings-local.sh
|
||||||
|
java \${JAVA_PARAMETERS} -Xmx\${MAX_RAM} -jar $(basename "${forgeJar}") nogui
|
||||||
|
EOF
|
||||||
|
chmod +x "${FTB_BASE_DIR}/ServerStart.sh"
|
||||||
|
else
|
||||||
|
log "Please make sure you are using the server version of the FTB modpack!"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
scriptCount=$(find "${FTB_BASE_DIR}" $entryScriptExpr | wc -l)
|
||||||
|
if [[ $scriptCount = 0 ]]; then
|
||||||
|
log "Please make sure you are using the server version of the FTB modpack!"
|
||||||
|
exit 2
|
||||||
|
elif [[ $scriptCount > 1 ]]; then
|
||||||
|
log "Ambigous startup scripts in FTB modpack!"
|
||||||
|
log "found:"
|
||||||
|
find ${FTB_BASE_DIR} $entryScriptExpr
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
export FTB_SERVER_START=$(find "${FTB_BASE_DIR}" $entryScriptExpr)
|
||||||
|
|
||||||
|
export FTB_DIR=$(dirname "${FTB_SERVER_START}")
|
||||||
|
chmod a+x "${FTB_SERVER_START}"
|
||||||
|
grep fml.queryResult=confirm ${FTB_SERVER_START} > /dev/null || \
|
||||||
|
sed -i 's/-jar/-Dfml.queryResult=confirm -jar/' "${FTB_SERVER_START}"
|
||||||
|
sed -i 's/.*read.*Restart now/#\0/' "${FTB_SERVER_START}"
|
||||||
|
legacyJavaFixerPath="${FTB_DIR}/mods/legacyjavafixer.jar"
|
||||||
|
|
||||||
|
if isTrue ${FTB_LEGACYJAVAFIXER} && [ ! -e "${legacyJavaFixerPath}" ]; then
|
||||||
|
log "Installing legacy java fixer to ${legacyJavaFixerPath}"
|
||||||
|
curl -sSL -o "${legacyJavaFixerPath}" ${legacyJavaFixerUrl}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -e "${FTB_DIR}/FTBInstall.sh" ]; then
|
||||||
|
pushd "${FTB_DIR}"
|
||||||
|
sh FTBInstall.sh
|
||||||
|
popd
|
||||||
|
elif [ -e "${FTB_DIR}/Install.sh" ]; then
|
||||||
|
pushd "${FTB_DIR}"
|
||||||
|
sh Install.sh
|
||||||
|
popd
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Continue to Final Setup
|
||||||
|
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
||||||
176
start-deployFTB
176
start-deployFTB
@@ -1,137 +1,69 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
ftbInstallMarker=".ftb-installed"
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
isDebugging && set -x
|
||||||
|
set -e
|
||||||
|
|
||||||
export FTB_BASE_DIR=/data/FeedTheBeast
|
if ! [[ -v FTB_MODPACK_ID ]]; then
|
||||||
legacyJavaFixerUrl=http://ftb.cursecdn.com/FTB2/maven/net/minecraftforge/lex/legacyjavafixer/1.0/legacyjavafixer-1.0.jar
|
log "ERROR FTB_MODPACK_ID is required with TYPE=FTB"
|
||||||
export TYPE=FEED-THE-BEAST
|
exit 1
|
||||||
|
|
||||||
FTB_SERVER_MOD=${FTB_SERVER_MOD:-$CF_SERVER_MOD}
|
|
||||||
|
|
||||||
log "Looking for Feed-The-Beast / CurseForge server modpack."
|
|
||||||
if [[ -z $FTB_SERVER_MOD ]]; then
|
|
||||||
log "Environment variable FTB_SERVER_MOD not set."
|
|
||||||
log "Set FTB_SERVER_MOD to the file name of the FTB server modpack."
|
|
||||||
log "(And place the modpack in the /data directory.)"
|
|
||||||
exit 2
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
entryScriptExpr="
|
if ! [[ ${FTB_MODPACK_ID} =~ [0-9]+ ]]; then
|
||||||
-name ServerStart.sh
|
log "ERROR FTB_MODPACK_ID needs to be numeric"
|
||||||
-o -name ServerStartLinux.sh
|
exit 1
|
||||||
-o -name LaunchServer.sh
|
fi
|
||||||
-o -name server-start.sh
|
|
||||||
"
|
|
||||||
|
|
||||||
if [[ -d ${FTB_BASE_DIR} ]]; then
|
if ! [[ -v FTB_MODPACK_VERSION_ID ]]; then
|
||||||
startScriptCount=$(find ${FTB_BASE_DIR} $entryScriptExpr |wc -l)
|
if ! FTB_MODPACK_VERSION_ID=$(curl -fsSL https://api.modpacks.ch/public/modpack/${FTB_MODPACK_ID} | jq -r '.versions | sort_by(.updated)[-1].id'); then
|
||||||
if [[ $startScriptCount > 1 ]]; then
|
log "ERROR unable to resolve latest modpack version ID for modpack ${FTB_MODPACK_ID}"
|
||||||
log "Conflicting FTB/CurseForge packages have been installed. Please cleanup ${FTB_BASE_DIR}"
|
exit 1
|
||||||
exit 2
|
|
||||||
fi
|
fi
|
||||||
|
elif ! [[ ${FTB_MODPACK_VERSION_ID} =~ [0-9]+ ]]; then
|
||||||
|
log "ERROR FTB_MODPACK_VERSION_ID needs to be numeric"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! [ -f "${ftbInstallMarker}" ] || [ $(cat "${ftbInstallMarker}") != "${FTB_MODPACK_ID}=${FTB_MODPACK_VERSION_ID}" ]; then
|
||||||
|
ftbInstaller=/data/ftb-installer
|
||||||
|
if ! [[ -f "${ftbInstaller}" ]]; then
|
||||||
|
log "Downloading FTB installer"
|
||||||
|
curl -fsSL https://api.modpacks.ch/public/modpack/1/1/server/linux -o "${ftbInstaller}"
|
||||||
|
chmod +x "${ftbInstaller}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf forge*jar mods config libraries defaultconfigs changelogs
|
||||||
|
|
||||||
|
log "Installing modpack ID ${FTB_MODPACK_ID}, version ID ${FTB_MODPACK_VERSION_ID}"
|
||||||
|
${ftbInstaller} ${FTB_MODPACK_ID} ${FTB_MODPACK_VERSION_ID} --noscript --auto
|
||||||
|
rm -f forge*installer.jar
|
||||||
|
|
||||||
|
echo "${FTB_MODPACK_ID}=${FTB_MODPACK_VERSION_ID}" > ${ftbInstallMarker}
|
||||||
else
|
else
|
||||||
startScriptCount=0
|
log "FTB modpack ID ${FTB_MODPACK_ID}, version ID ${FTB_MODPACK_VERSION_ID} is ready to go"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# only download and install if a mod pack isn't already installed
|
isDebugging && cat version.json
|
||||||
# also check for the start script rather than just the folder
|
forgeVersion=$(jq -r '.targets[] | select(.name == "forge") | .version' version.json)
|
||||||
# this allows saving just the world separate from the rest of the data directory
|
mcVersion=$(jq -r '.targets[] | select(.name == "minecraft") | .version' version.json)
|
||||||
if [[ $startScriptCount = 0 ]]; then
|
|
||||||
srv_modpack=${FTB_SERVER_MOD}
|
variants=(
|
||||||
if isURL ${srv_modpack}; then
|
forge-${mcVersion}-${forgeVersion}.jar
|
||||||
case $srv_modpack in
|
forge-${mcVersion}-${forgeVersion}-universal.jar
|
||||||
https://www.feed-the-beast.com/*/download|https://www.curseforge.com/minecraft/modpacks/*/download/*/file)
|
forge-${mcVersion}-${forgeVersion}-${mcVersion}-universal.jar
|
||||||
;;
|
)
|
||||||
https://www.curseforge.com/minecraft/modpacks/*/download/*)
|
for f in ${variants[@]}; do
|
||||||
srv_modpack=${srv_modpack}/file;;
|
if [ -f $f ]; then
|
||||||
https://www.feed-the-beast.com/*)
|
export SERVER=$f
|
||||||
srv_modpack=${srv_modpack}/download;;
|
break
|
||||||
esac
|
|
||||||
file=$(basename $(dirname $srv_modpack))
|
|
||||||
downloaded=/data/${file}.zip
|
|
||||||
if [ ! -e $downloaded ]; then
|
|
||||||
log "Downloading FTB modpack...
|
|
||||||
$srv_modpack -> $downloaded"
|
|
||||||
curl -sSL -o $downloaded $srv_modpack
|
|
||||||
fi
|
|
||||||
srv_modpack=$downloaded
|
|
||||||
fi
|
fi
|
||||||
if [[ ${srv_modpack:0:5} == "data/" ]]; then
|
done
|
||||||
# Prepend with "/"
|
if ! [ -v SERVER ]; then
|
||||||
srv_modpack=/${srv_modpack}
|
log "ERROR unable to locate the installed forge server jar"
|
||||||
fi
|
ls *.jar
|
||||||
if [[ ! ${srv_modpack:0:1} == "/" ]]; then
|
exit 2
|
||||||
# If not an absolute path, assume file is in "/data"
|
|
||||||
srv_modpack=/data/${srv_modpack}
|
|
||||||
fi
|
|
||||||
if [[ ! -f ${srv_modpack} ]]; then
|
|
||||||
log "FTB server modpack ${srv_modpack} not found."
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
if [[ ! ${srv_modpack: -4} == ".zip" ]]; then
|
|
||||||
log "FTB server modpack ${srv_modpack} is not a zip archive."
|
|
||||||
log "Please set FTB_SERVER_MOD to a file with a .zip extension."
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
log "Unpacking FTB server modpack ${srv_modpack} ..."
|
|
||||||
mkdir -p ${FTB_BASE_DIR}
|
|
||||||
unzip -o ${srv_modpack} -d ${FTB_BASE_DIR} | awk '{printf "."} END {print ""}'
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ $(find ${FTB_BASE_DIR} $entryScriptExpr | wc -l) = 0 ]]; then
|
|
||||||
|
|
||||||
# Allow up to 2 levels since some modpacks have a top-level directory named
|
|
||||||
# for the modpack
|
|
||||||
forgeJar=$(find ${FTB_BASE_DIR} -maxdepth 2 -name 'forge*.jar' -a -not -name 'forge*installer')
|
|
||||||
if [[ "$forgeJar" ]]; then
|
|
||||||
export FTB_BASE_DIR=$(dirname "${forgeJar}")
|
|
||||||
log "No entry script found, so building one for ${forgeJar}"
|
|
||||||
cat > "${FTB_BASE_DIR}/ServerStart.sh" <<EOF
|
|
||||||
#!/bin/sh
|
|
||||||
. ./settings-local.sh
|
|
||||||
java \${JAVA_PARAMETERS} -Xmx\${MAX_RAM} -jar $(basename "${forgeJar}") nogui
|
|
||||||
EOF
|
|
||||||
chmod +x "${FTB_BASE_DIR}/ServerStart.sh"
|
|
||||||
else
|
|
||||||
log "Please make sure you are using the server version of the FTB modpack!"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
scriptCount=$(find "${FTB_BASE_DIR}" $entryScriptExpr | wc -l)
|
|
||||||
if [[ $scriptCount = 0 ]]; then
|
|
||||||
log "Please make sure you are using the server version of the FTB modpack!"
|
|
||||||
exit 2
|
|
||||||
elif [[ $scriptCount > 1 ]]; then
|
|
||||||
log "Ambigous startup scripts in FTB modpack!"
|
|
||||||
log "found:"
|
|
||||||
find ${FTB_BASE_DIR} $entryScriptExpr
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
export FTB_SERVER_START=$(find "${FTB_BASE_DIR}" $entryScriptExpr)
|
|
||||||
|
|
||||||
export FTB_DIR=$(dirname "${FTB_SERVER_START}")
|
|
||||||
chmod a+x "${FTB_SERVER_START}"
|
|
||||||
grep fml.queryResult=confirm ${FTB_SERVER_START} > /dev/null || \
|
|
||||||
sed -i 's/-jar/-Dfml.queryResult=confirm -jar/' "${FTB_SERVER_START}"
|
|
||||||
sed -i 's/.*read.*Restart now/#\0/' "${FTB_SERVER_START}"
|
|
||||||
legacyJavaFixerPath="${FTB_DIR}/mods/legacyjavafixer.jar"
|
|
||||||
|
|
||||||
if isTrue ${FTB_LEGACYJAVAFIXER} && [ ! -e "${legacyJavaFixerPath}" ]; then
|
|
||||||
log "Installing legacy java fixer to ${legacyJavaFixerPath}"
|
|
||||||
curl -sSL -o "${legacyJavaFixerPath}" ${legacyJavaFixerUrl}
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -e "${FTB_DIR}/FTBInstall.sh" ]; then
|
|
||||||
pushd "${FTB_DIR}"
|
|
||||||
sh FTBInstall.sh
|
|
||||||
popd
|
|
||||||
elif [ -e "${FTB_DIR}/Install.sh" ]; then
|
|
||||||
pushd "${FTB_DIR}"
|
|
||||||
sh Install.sh
|
|
||||||
popd
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Continue to Final Setup
|
# Continue to Final Setup
|
||||||
|
|||||||
@@ -5,17 +5,18 @@
|
|||||||
: ${PAPERBUILD:=latest}
|
: ${PAPERBUILD:=latest}
|
||||||
export SERVER=paper_server-${VANILLA_VERSION}-${PAPERBUILD}.jar
|
export SERVER=paper_server-${VANILLA_VERSION}-${PAPERBUILD}.jar
|
||||||
|
|
||||||
if [ ! -f "$SERVER" ] || [ -n "$FORCE_REDOWNLOAD" ]; then
|
if [ -f "$SERVER" ] && ! isTrue "$FORCE_REDOWNLOAD"; then
|
||||||
downloadUrl=${PAPER_DOWNLOAD_URL:-https://papermc.io/api/v1/paper/${VANILLA_VERSION}/${PAPERBUILD}/download}
|
zarg="-z '$SERVER'"
|
||||||
log "Downloading Paper $VANILLA_VERSION (build $PAPERBUILD) from $downloadUrl ..."
|
|
||||||
curl -fsSL -o "$SERVER" "$downloadUrl"
|
|
||||||
if [ ! -f "$SERVER" ]; then
|
|
||||||
log "ERROR: failed to download from $downloadUrl (status=$?)"
|
|
||||||
exit 3
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Normalize on Spigot for operations below
|
downloadUrl=${PAPER_DOWNLOAD_URL:-https://papermc.io/api/v1/paper/${VANILLA_VERSION}/${PAPERBUILD}/download}
|
||||||
|
log "Downloading Paper $VANILLA_VERSION (build $PAPERBUILD) from $downloadUrl ..."
|
||||||
|
if ! curl -fsSL -o "$SERVER" $zarg "$downloadUrl"; then
|
||||||
|
log "ERROR: failed to download from $downloadUrl (status=$?)"
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Normalize on Spigot for downstream operations
|
||||||
export TYPE=SPIGOT
|
export TYPE=SPIGOT
|
||||||
export SKIP_LOG4J_CONFIG=true
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,9 @@ if [ ! -e $SERVER ] || [ -n "$FORCE_REDOWNLOAD" ]; then
|
|||||||
if [ $result != 0 ]; then
|
if [ $result != 0 ]; then
|
||||||
log "ERROR failed to obtain version manifest from $versionManifestUrl ($result)"
|
log "ERROR failed to obtain version manifest from $versionManifestUrl ($result)"
|
||||||
exit 1
|
exit 1
|
||||||
|
elif [ $serverDownloadUrl = null ]; then
|
||||||
|
log "ERROR version $VANILLA_VERSION does not provide a server download"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
debug "Downloading server from $serverDownloadUrl"
|
debug "Downloading server from $serverDownloadUrl"
|
||||||
|
|||||||
@@ -7,14 +7,20 @@
|
|||||||
if isTrue "${REPLACE_ENV_VARIABLES}"; then
|
if isTrue "${REPLACE_ENV_VARIABLES}"; then
|
||||||
log "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..."
|
||||||
|
|
||||||
findExcludes=
|
# File excludes
|
||||||
|
fileExcludes=
|
||||||
for f in ${REPLACE_ENV_VARIABLES_EXCLUDES}; do
|
for f in ${REPLACE_ENV_VARIABLES_EXCLUDES}; do
|
||||||
findExcludes="${findExcludes} -not -name $f"
|
fileExcludes="${fileExcludes} -not -name $f"
|
||||||
done
|
done
|
||||||
for p in ${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS}; do
|
|
||||||
findExcludes="${findExcludes} -not -path \"*$p*\""
|
# Directory excludes (recursive)
|
||||||
done
|
dirExcludes=$(join_by " -o -path " ${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS})
|
||||||
isDebugging && echo "Using find exclusion: $findExcludes"
|
if [[ $dirExcludes ]]; then
|
||||||
|
dirExcludes=" -type d ( -path ${dirExcludes} ) -prune -o"
|
||||||
|
fi
|
||||||
|
|
||||||
|
isDebugging && echo "Using find file exclusions: $fileExcludes"
|
||||||
|
isDebugging && echo "Using find directory exclusions: $dirExcludes"
|
||||||
|
|
||||||
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
|
||||||
@@ -29,10 +35,12 @@ if isTrue "${REPLACE_ENV_VARIABLES}"; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
log "Replacing $name with $value ..."
|
log "Replacing $name with $value ..."
|
||||||
find /data/ -type f \
|
find /data/ \
|
||||||
|
$dirExcludes \
|
||||||
|
-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" \) \
|
||||||
$findExcludes \
|
$fileExcludes \
|
||||||
-exec sed -i 's#${'"$name"'}#'"$value"'#g' {} \;
|
-exec sed -i 's#${'"$name"'}#'"$value"'#g' {} \;
|
||||||
fi
|
fi
|
||||||
done < <(env)
|
done < <(env)
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ else
|
|||||||
worldDest=/data/$LEVEL
|
worldDest=/data/$LEVEL
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$WORLD" ]] && isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ]; then
|
if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] ); then
|
||||||
if isURL $WORLD; then
|
if isURL $WORLD; then
|
||||||
curl -fsSL "$WORLD" -o /tmp/world.zip
|
curl -fsSL "$WORLD" -o /tmp/world.zip
|
||||||
zipSrc=/tmp/world.zip
|
zipSrc=/tmp/world.zip
|
||||||
|
|||||||
@@ -158,49 +158,60 @@ if isTrue "${DEBUG_MEMORY}"; then
|
|||||||
free -m
|
free -m
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
JVM_OPTS="-Xms${INIT_MEMORY} -Xmx${MAX_MEMORY} ${JVM_OPTS}"
|
||||||
|
|
||||||
|
function copyFilesForCurseForge() {
|
||||||
|
# copy player modification files unconditionally since their
|
||||||
|
# processing into json is additive anyway
|
||||||
|
[ -f /data/ops.txt ] && cp -f /data/ops.txt ${FTB_DIR}/
|
||||||
|
[ -f /data/white-list.txt ] && cp -f /data/white-list.txt ${FTB_DIR}/
|
||||||
|
|
||||||
|
if [ ! -e "${FTB_DIR}/server-icon.png" -a -e /data/server-icon.png ]; then
|
||||||
|
cp -f /data/server-icon.png ${FTB_DIR}/
|
||||||
|
fi
|
||||||
|
|
||||||
|
cp -f /data/eula.txt "${FTB_DIR}/"
|
||||||
|
}
|
||||||
|
|
||||||
mcServerRunnerArgs="--stop-duration 60s"
|
mcServerRunnerArgs="--stop-duration 60s"
|
||||||
if [[ ${TYPE} == "CURSE_INSTANCE" ]]; then
|
if [[ ${TYPE} == "CURSE_INSTANCE" ]]; then
|
||||||
JVM_OPTS="-Xms${INIT_MEMORY} -Xmx${MAX_MEMORY} ${JVM_OPTS}"
|
|
||||||
if isTrue ${DEBUG_EXEC}; then
|
if isTrue ${DEBUG_EXEC}; then
|
||||||
set -x
|
set -x
|
||||||
fi
|
fi
|
||||||
exec mc-server-runner ${mcServerRunnerArgs} \
|
exec mc-server-runner ${mcServerRunnerArgs} \
|
||||||
--cf-instance-file "${CURSE_INSTANCE_JSON}" \
|
--cf-instance-file "${CURSE_INSTANCE_JSON}" \
|
||||||
java $JVM_XX_OPTS $JVM_OPTS $expandedDOpts -jar _SERVERJAR_ "$@" $EXTRA_ARGS
|
java $JVM_XX_OPTS $JVM_OPTS $expandedDOpts -jar _SERVERJAR_ "$@" $EXTRA_ARGS
|
||||||
elif [[ ${TYPE} == "FEED-THE-BEAST" ]]; then
|
elif [[ ${TYPE} == "CURSEFORGE" && "${SERVER}" ]]; then
|
||||||
mcServerRunnerArgs="${mcServerRunnerArgs} --shell bash"
|
copyFilesForCurseForge
|
||||||
|
|
||||||
if [ ! -e "${FTB_DIR}/ops.json" -a -e /data/ops.txt ]; then
|
cd "${FTB_DIR}"
|
||||||
cp -f /data/ops.txt ${FTB_DIR}/
|
log "Starting CurseForge server in ${FTB_DIR}..."
|
||||||
fi
|
if isTrue ${DEBUG_EXEC}; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
exec mc-server-runner ${bootstrapArgs} ${mcServerRunnerArgs} java $JVM_XX_OPTS $JVM_OPTS $expandedDOpts -jar $(basename "${SERVER}") "$@" $EXTRA_ARGS
|
||||||
|
elif [[ ${TYPE} == "CURSEFORGE" ]]; then
|
||||||
|
mcServerRunnerArgs="${mcServerRunnerArgs} --shell bash"
|
||||||
|
|
||||||
if [ ! -e "${FTB_DIR}/whitelist.json" -a -e /data/white-list.txt ]; then
|
copyFilesForCurseForge
|
||||||
cp -f /data/white-list.txt ${FTB_DIR}/
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -e "${FTB_DIR}/server-icon.png" -a -e /data/server-icon.png ]; then
|
cat > "${FTB_DIR}/settings-local.sh" <<EOF
|
||||||
cp -f /data/server-icon.png ${FTB_DIR}/
|
|
||||||
fi
|
|
||||||
|
|
||||||
cp -f /data/eula.txt "${FTB_DIR}/"
|
|
||||||
|
|
||||||
cat > "${FTB_DIR}/settings-local.sh" <<EOF
|
|
||||||
export MIN_RAM="${INIT_MEMORY}"
|
export MIN_RAM="${INIT_MEMORY}"
|
||||||
export MAX_RAM="${MAX_MEMORY}"
|
export MAX_RAM="${MAX_MEMORY}"
|
||||||
export JAVA_PARAMETERS="${JVM_XX_OPTS} -Xms${INIT_MEMORY} ${JVM_OPTS} $expandedDOpts"
|
export JAVA_PARAMETERS="${JVM_XX_OPTS} -Xms${INIT_MEMORY} ${JVM_OPTS} $expandedDOpts"
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# patch CurseForge cfg file, if present
|
# patch CurseForge cfg file, if present
|
||||||
if [ -f "${FTB_DIR}/settings.cfg" ]; then
|
if [ -f "${FTB_DIR}/settings.cfg" ]; then
|
||||||
sed -i "s/MAX_RAM=[^;]*/MAX_RAM=${MAX_MEMORY}/" "${FTB_DIR}/settings.cfg"
|
sed -i "s/MAX_RAM=[^;]*/MAX_RAM=${MAX_MEMORY}/" "${FTB_DIR}/settings.cfg"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd "${FTB_DIR}"
|
cd "${FTB_DIR}"
|
||||||
log "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
|
||||||
exec mc-server-runner ${mcServerRunnerArgs} "${FTB_SERVER_START}"
|
exec mc-server-runner ${mcServerRunnerArgs} "${FTB_SERVER_START}"
|
||||||
else
|
else
|
||||||
# If we have a bootstrap.txt file... feed that in to the server stdin
|
# If we have a bootstrap.txt file... feed that in to the server stdin
|
||||||
if [ -f /data/bootstrap.txt ]; then
|
if [ -f /data/bootstrap.txt ]; then
|
||||||
@@ -208,7 +219,6 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
log "Starting the Minecraft server..."
|
log "Starting the Minecraft server..."
|
||||||
JVM_OPTS="-Xms${INIT_MEMORY} -Xmx${MAX_MEMORY} ${JVM_OPTS}"
|
|
||||||
if isTrue ${DEBUG_EXEC}; then
|
if isTrue ${DEBUG_EXEC}; then
|
||||||
set -x
|
set -x
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
function join_by { local d=$1; shift; echo -n "$1"; shift; printf "%s" "${@/#/$d}"; }
|
||||||
|
|
||||||
function isURL {
|
function isURL {
|
||||||
local value=$1
|
local value=$1
|
||||||
|
|
||||||
@@ -106,4 +108,8 @@ requireVar() {
|
|||||||
log "ERROR: $1 is required to be set"
|
log "ERROR: $1 is required to be set"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
if [ -z "${!1}" ]; then
|
||||||
|
log "ERROR: $1 is required to be set"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|||||||
17
tests/docker-compose.test.yml
Normal file
17
tests/docker-compose.test.yml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
version: "3.8"
|
||||||
|
|
||||||
|
services:
|
||||||
|
sut:
|
||||||
|
depends_on:
|
||||||
|
- mc
|
||||||
|
image: itzg/mc-monitor:0.6.0
|
||||||
|
command: status --host mc --retry-interval 1s --retry-limit 120
|
||||||
|
mc:
|
||||||
|
restart: "no"
|
||||||
|
build:
|
||||||
|
context: ..
|
||||||
|
cache_from:
|
||||||
|
- itzg/minecraft-server:latest
|
||||||
|
environment:
|
||||||
|
EULA: "TRUE"
|
||||||
|
|
||||||
17
tests/test.sh
Executable file
17
tests/test.sh
Executable file
@@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
cd $(dirname $0)
|
||||||
|
|
||||||
|
failed=false
|
||||||
|
args="-f docker-compose.test.yml"
|
||||||
|
docker-compose $args run sut || failed=true
|
||||||
|
echo "
|
||||||
|
Result: failed=$failed"
|
||||||
|
|
||||||
|
$failed && docker-compose $args logs mc
|
||||||
|
docker-compose $args down -v
|
||||||
|
|
||||||
|
if $failed; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
Reference in New Issue
Block a user