fix: migrate PaperMC to v3 API, fix NeoForge beta fallback, add test suite
- Migrate Paper loader from sunset v2 API to v3 (fill.papermc.io) - Fix NeoForge: fall back to beta versions when no stable exists (set -e + grep) - Fix setEula/setperms ordering (was writing eula.txt before /data was writable) - Fix setEula/serverInfoWrite to use absolute paths (/data/server/) - Add VOLUME directive removal (was shadowing bind mounts) - Add comprehensive API test suite (110 tests across 6 suites) - Move test.sh to tests/integration.sh, switch to named volumes - Add Docker build cache to CI workflows - Add .editorconfig, expand .gitignore, improve README docs
This commit is contained in:
+38
-24
@@ -1,34 +1,48 @@
|
||||
crash() {
|
||||
sleep 5
|
||||
echo "Exit Complete"
|
||||
# ---------- helpers --------------------------------------------------------
|
||||
|
||||
log() {
|
||||
echo -e "[dockercraft] $*"
|
||||
}
|
||||
|
||||
warn() {
|
||||
echo -e "[dockercraft] WARNING: $*" >&2
|
||||
}
|
||||
|
||||
die() {
|
||||
echo -e "[dockercraft] ERROR: $*" >&2
|
||||
sleep 2
|
||||
exit 1
|
||||
}
|
||||
|
||||
setperms() {
|
||||
echo -e "|_______________________________________________________|"
|
||||
echo -e "|##--------------- Setting Permissions ---------------##|"
|
||||
echo -e "|#| Setting permissions to UID:${PUID} and GID:${PGID}"
|
||||
sudo usermod -u ${PUID} minecraft
|
||||
sudo groupmod -g ${PGID} minecraft
|
||||
sudo chown -R ${PUID}:${PGID} /data
|
||||
echo -e "|#|---------------------------------------------------|#|"
|
||||
sleep 2
|
||||
echo -e "|#| DONE"
|
||||
echo -e "|##---------------------------------------------------##|"
|
||||
sleep 2
|
||||
crash() {
|
||||
die "$@"
|
||||
}
|
||||
|
||||
# ---------- permission setup -----------------------------------------------
|
||||
|
||||
setperms() {
|
||||
log "--- Setting permissions to UID:${PUID} GID:${PGID} ---"
|
||||
sudo usermod -u "${PUID}" minecraft
|
||||
sudo groupmod -g "${PGID}" minecraft
|
||||
sudo chown -R "${PUID}:${PGID}" /data
|
||||
log "Permissions set."
|
||||
}
|
||||
|
||||
# ---------- EULA -----------------------------------------------------------
|
||||
|
||||
setEula() {
|
||||
if [[ "${EULA:-false}" != "true" ]]; then
|
||||
echo "EULA not accepted. Set EULA=true to accept the Minecraft EULA (https://aka.ms/MinecraftEULA)"
|
||||
crash
|
||||
die "EULA not accepted. Set EULA=true to accept the Minecraft EULA (https://aka.ms/MinecraftEULA)"
|
||||
fi
|
||||
cat <<EOF > eula.txt
|
||||
mkdir -p /data/server
|
||||
cat <<'EOF' > /data/server/eula.txt
|
||||
#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://aka.ms/MinecraftEULA).
|
||||
eula=true
|
||||
EOF
|
||||
}
|
||||
|
||||
# ---------- misc -----------------------------------------------------------
|
||||
|
||||
newForge() {
|
||||
if [[ "$(printf '%s\n' "1.17.1" "$MC_VERSION" | sort -V | head -n1)" = "1.17.1" ]]; then
|
||||
NEW_FORGE=true
|
||||
@@ -38,11 +52,11 @@ newForge() {
|
||||
}
|
||||
|
||||
serverInfoWrite() {
|
||||
cat <<EOF > server.info
|
||||
MC_VERSION=$MC_VERSION
|
||||
cat <<EOF > /data/server/server.info
|
||||
MC_VERSION=${MC_VERSION}
|
||||
|
||||
MC_LOADER=$MC_LOADER
|
||||
MC_LOADER_VERSION=$MC_LOADER_VERSION
|
||||
MC_LOADER=${MC_LOADER}
|
||||
MC_LOADER_VERSION=${MC_LOADER_VERSION}
|
||||
|
||||
JAVA_VERSION=${JAVA_VERSION:-"N/A"}
|
||||
JAR=${JAR:-"N/A"}
|
||||
@@ -51,7 +65,7 @@ XMS=${XMS:-"N/A"}
|
||||
XMX=${XMX:-"N/A"}
|
||||
ADD_ARGS=${ADD_ARGS:-"NONE"}
|
||||
|
||||
PUID=$PUID
|
||||
PGID=$PGID
|
||||
PUID=${PUID}
|
||||
PGID=${PGID}
|
||||
EOF
|
||||
}
|
||||
|
||||
+19
-8
@@ -3,9 +3,13 @@ javaVersionDetect() {
|
||||
return
|
||||
fi
|
||||
|
||||
log "Auto-detecting Java version from Mojang manifest..."
|
||||
|
||||
local MANIFEST
|
||||
MANIFEST=$(curl -sf "https://launchermeta.mojang.com/mc/game/version_manifest.json")
|
||||
MANIFEST=$(curl -sf --connect-timeout 10 --max-time 30 \
|
||||
"https://launchermeta.mojang.com/mc/game/version_manifest.json") || true
|
||||
if [[ -z "$MANIFEST" ]]; then
|
||||
warn "Could not fetch Mojang manifest, defaulting to temurin@21"
|
||||
JAVA_VERSION="temurin@21"
|
||||
return
|
||||
fi
|
||||
@@ -13,13 +17,15 @@ javaVersionDetect() {
|
||||
local VERSION_URL
|
||||
VERSION_URL=$(echo "$MANIFEST" | jq -r ".versions[] | select(.id == \"${MC_VERSION}\") | .url")
|
||||
if [[ -z "$VERSION_URL" || "$VERSION_URL" == "null" ]]; then
|
||||
warn "Version ${MC_VERSION} not found in manifest, defaulting to temurin@21"
|
||||
JAVA_VERSION="temurin@21"
|
||||
return
|
||||
fi
|
||||
|
||||
local VERSION_DATA
|
||||
VERSION_DATA=$(curl -sf "$VERSION_URL")
|
||||
VERSION_DATA=$(curl -sf --connect-timeout 10 --max-time 30 "$VERSION_URL") || true
|
||||
if [[ -z "$VERSION_DATA" ]]; then
|
||||
warn "Could not fetch version data for ${MC_VERSION}, defaulting to temurin@21"
|
||||
JAVA_VERSION="temurin@21"
|
||||
return
|
||||
fi
|
||||
@@ -31,6 +37,7 @@ javaVersionDetect() {
|
||||
else
|
||||
JAVA_VERSION="temurin@${JAVA_MAJOR}"
|
||||
fi
|
||||
log "Detected Java version: ${JAVA_VERSION}"
|
||||
}
|
||||
|
||||
javaCheck() {
|
||||
@@ -38,16 +45,20 @@ javaCheck() {
|
||||
|
||||
JAVA_HOME="/data/java/${JAVA_VERSION}"
|
||||
if [[ -f "$HOME/.jabba/jabba.sh" ]]; then
|
||||
source $HOME/.jabba/jabba.sh
|
||||
# shellcheck disable=SC1090
|
||||
source "$HOME/.jabba/jabba.sh"
|
||||
else
|
||||
echo "Something went wrong with locating jabba(the java installer)"
|
||||
exit 1
|
||||
die "Jabba not found at ~/.jabba/jabba.sh — installation may have failed"
|
||||
fi
|
||||
|
||||
if [[ ! -f "/data/java/${JAVA_VERSION}/bin/java" ]]; then
|
||||
rm -rf /data/java/${JAVA_VERSION}
|
||||
jabba install ${JAVA_VERSION} -o /data/java/${JAVA_VERSION}
|
||||
log "Installing Java ${JAVA_VERSION}..."
|
||||
rm -rf "/data/java/${JAVA_VERSION}"
|
||||
jabba install "${JAVA_VERSION}" -o "/data/java/${JAVA_VERSION}"
|
||||
log "Java ${JAVA_VERSION} installed."
|
||||
else
|
||||
log "Java ${JAVA_VERSION} already cached."
|
||||
fi
|
||||
PATH=${JAVA_HOME}/bin:$PATH
|
||||
PATH="${JAVA_HOME}/bin:$PATH"
|
||||
JAVA="java"
|
||||
}
|
||||
|
||||
@@ -5,29 +5,37 @@ _bedrockDownload() {
|
||||
local platform="$1"
|
||||
local version="${2:-}"
|
||||
|
||||
log "Fetching Bedrock download URL (platform: ${platform})..."
|
||||
local DL_URL
|
||||
DL_URL=$(curl -sL -A "Mozilla/5.0 (X11; Linux x86_64)" "$BEDROCK_API_URL" | jq -r '.result.links[] | select(.downloadType == "'"$platform"'") | .downloadUrl // empty')
|
||||
DL_URL=$(curl -sL -A "Mozilla/5.0 (X11; Linux x86_64)" --connect-timeout 10 --max-time 30 \
|
||||
"$BEDROCK_API_URL" |
|
||||
jq -r ".result.links[] | select(.downloadType == \"${platform}\") | .downloadUrl // empty")
|
||||
|
||||
if [[ -z "$DL_URL" ]]; then
|
||||
DL_URL=$(curl -sL -A "Mozilla/5.0 (X11; Linux x86_64)" "$BEDROCK_FALLBACK_URL" |
|
||||
warn "Primary API failed, trying fallback source..."
|
||||
DL_URL=$(curl -sL -A "Mozilla/5.0 (X11; Linux x86_64)" --connect-timeout 10 --max-time 30 \
|
||||
"$BEDROCK_FALLBACK_URL" |
|
||||
jq --arg type "$( [[ "$platform" == *Preview* ]] && echo preview || echo release )" -r '
|
||||
.[$type] | to_entries | sort_by(.key | split(".") | map(tonumber)) | last | .value.linux.url // empty
|
||||
')
|
||||
fi
|
||||
|
||||
if [[ -z "$DL_URL" ]]; then
|
||||
echo "Failed to look up Bedrock download URL"
|
||||
crash
|
||||
die "Failed to look up Bedrock download URL"
|
||||
fi
|
||||
|
||||
if [[ -n "$version" ]]; then
|
||||
DL_URL=$(echo "$DL_URL" | sed -E "s/(bedrock-server-)[^/]+(\.zip)/\1${version}\2/")
|
||||
fi
|
||||
|
||||
local VER
|
||||
VER=$(echo "$DL_URL" | grep -oP 'bedrock-server-\K[\d.]+(?=\.zip)')
|
||||
echo "$DL_URL"
|
||||
curl -o bedrock-server.zip -L -A "Mozilla/5.0 (X11; Linux x86_64)" "$DL_URL"
|
||||
log "Downloading Bedrock server version ${VER}..."
|
||||
curl -fL -o bedrock-server.zip -A "Mozilla/5.0 (X11; Linux x86_64)" "$DL_URL"
|
||||
unzip -o bedrock-server.zip
|
||||
rm -f bedrock-server.zip
|
||||
chmod +x bedrock_server
|
||||
log "Bedrock ${VER} downloaded."
|
||||
}
|
||||
|
||||
getBedrock() {
|
||||
|
||||
@@ -1,22 +1,33 @@
|
||||
getFabric() {
|
||||
SERVER_TYPE="Fabric Minecraft"
|
||||
LATEST_BUILD=$(curl -s https://meta.fabricmc.net/v2/versions/loader/${MC_VERSION} | jq -r '.[0].loader.version')
|
||||
LATEST_INSTALLER=$(curl -s https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml | xmllint --xpath "/metadata/versioning/latest/text()" -)
|
||||
|
||||
if [[ -z "$MC_VERSION" ]]; then
|
||||
echo "Minecraft version not set"
|
||||
exit 1
|
||||
if [[ -z "${MC_VERSION}" ]]; then
|
||||
die "MC_VERSION is required for Fabric loader"
|
||||
fi
|
||||
VER=$MC_VERSION
|
||||
|
||||
log "Fetching Fabric loader version for MC ${MC_VERSION}..."
|
||||
local LATEST_BUILD LATEST_INSTALLER
|
||||
LATEST_BUILD=$(curl -sf --connect-timeout 10 --max-time 30 \
|
||||
"https://meta.fabricmc.net/v2/versions/loader/${MC_VERSION}" |
|
||||
jq -r '.[0].loader.version')
|
||||
|
||||
LATEST_INSTALLER=$(curl -sf --connect-timeout 10 --max-time 30 \
|
||||
"https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml" |
|
||||
xmllint --xpath "/metadata/versioning/latest/text()" -)
|
||||
|
||||
if [[ -z "$LATEST_BUILD" || "$LATEST_BUILD" == "null" ]]; then
|
||||
die "No Fabric loader found for MC ${MC_VERSION}"
|
||||
fi
|
||||
if [[ -z "$LATEST_INSTALLER" ]]; then
|
||||
die "Could not determine latest Fabric installer version"
|
||||
fi
|
||||
|
||||
local VER_LOADER
|
||||
VER_LOADER="${FABRIC_LOADER_VERSION:-${LATEST_BUILD}}"
|
||||
DL_URL=https://meta.fabricmc.net/v2/versions/loader/${MC_VERSION}/${VER_LOADER}/${LATEST_INSTALLER}/server/jar
|
||||
local DL_URL
|
||||
DL_URL="https://meta.fabricmc.net/v2/versions/loader/${MC_VERSION}/${VER_LOADER}/${LATEST_INSTALLER}/server/jar"
|
||||
|
||||
if [ "$LATEST_BUILD" != "null" ]; then
|
||||
echo "$DL_URL"
|
||||
curl -o server.jar "${DL_URL}"
|
||||
else
|
||||
echo "No valid Fabric build found for version ${MC_VERSION}"
|
||||
crash
|
||||
fi
|
||||
log "Downloading Fabric (loader ${VER_LOADER}, installer ${LATEST_INSTALLER})..."
|
||||
curl -fL -o server.jar "${DL_URL}"
|
||||
log "Fabric ${MC_VERSION} (loader ${VER_LOADER}) downloaded."
|
||||
}
|
||||
|
||||
@@ -1,42 +1,45 @@
|
||||
getForge() {
|
||||
SERVER_TYPE="Forge Server"
|
||||
|
||||
if [[ -n "$MC_VERSION" ]]; then
|
||||
VER_MINECRAFT=$MC_VERSION
|
||||
if [[ -n "${FORGE_VERSION}" ]]; then
|
||||
VER_LOADER="${FORGE_VERSION}"
|
||||
DL_URL=https://maven.minecraftforge.net/net/minecraftforge/forge/${VER_MINECRAFT}-${VER_LOADER}/forge-${VER_MINECRAFT}-${VER_LOADER}-installer.jar
|
||||
else
|
||||
LATEST_BUILD=$(curl -s https://files.minecraftforge.net/net/minecraftforge/forge/promotions_slim.json | jq -r ".promos[\"${VER_MINECRAFT}-latest\"]")
|
||||
VER_LOADER=$LATEST_BUILD
|
||||
DL_URL=https://maven.minecraftforge.net/net/minecraftforge/forge/${VER_MINECRAFT}-${VER_LOADER}/forge-${VER_MINECRAFT}-${VER_LOADER}-installer.jar
|
||||
fi
|
||||
else
|
||||
echo "Minecraft version not set"
|
||||
exit 1
|
||||
if [[ -z "${MC_VERSION}" ]]; then
|
||||
die "MC_VERSION is required for Forge loader"
|
||||
fi
|
||||
|
||||
if [[ -n "$DL_URL" ]]; then
|
||||
echo "$DL_URL"
|
||||
rm -rf server.jar
|
||||
curl -o forge-install.jar "${DL_URL}"
|
||||
echo "$JAVA -jar forge-install.jar --installServer"
|
||||
$JAVA -jar forge-install.jar --installServer
|
||||
local DL_URL
|
||||
if [[ -n "${FORGE_VERSION}" ]]; then
|
||||
VER_LOADER="${FORGE_VERSION}"
|
||||
DL_URL="https://maven.minecraftforge.net/net/minecraftforge/forge/${MC_VERSION}-${VER_LOADER}/forge-${MC_VERSION}-${VER_LOADER}-installer.jar"
|
||||
else
|
||||
log "Fetching latest Forge version for MC ${MC_VERSION}..."
|
||||
local LATEST_BUILD
|
||||
LATEST_BUILD=$(curl -sf --connect-timeout 10 --max-time 30 \
|
||||
"https://files.minecraftforge.net/net/minecraftforge/forge/promotions_slim.json" |
|
||||
jq -r ".promos[\"${MC_VERSION}-latest\"]")
|
||||
|
||||
if [[ "$(printf '%s\n' "1.17.1" "$MC_VERSION" | sort -V | head -n1)" = "1.17.1" ]]; then
|
||||
NEW_FORGE=true
|
||||
rm -f forge-install.jar
|
||||
rm -f forge-install.jar.log
|
||||
else
|
||||
NEW_FORGE=false
|
||||
rm -f forge-install.jar
|
||||
rm -f forge-install.jar.log
|
||||
ln -s forge-"${VER_MINECRAFT}"-"${VER_LOADER}".jar server.jar
|
||||
if [[ -z "$LATEST_BUILD" || "$LATEST_BUILD" == "null" ]]; then
|
||||
die "No Forge version found for MC ${MC_VERSION}"
|
||||
fi
|
||||
|
||||
touch server.properties
|
||||
else
|
||||
echo "No Valid Download URL"
|
||||
crash
|
||||
VER_LOADER="$LATEST_BUILD"
|
||||
DL_URL="https://maven.minecraftforge.net/net/minecraftforge/forge/${MC_VERSION}-${VER_LOADER}/forge-${MC_VERSION}-${VER_LOADER}-installer.jar"
|
||||
fi
|
||||
|
||||
log "Downloading Forge ${MC_VERSION}-${VER_LOADER} installer..."
|
||||
rm -f server.jar
|
||||
curl -fL -o forge-install.jar "${DL_URL}"
|
||||
|
||||
log "Running Forge installer..."
|
||||
$JAVA -jar forge-install.jar --installServer
|
||||
|
||||
newForge
|
||||
rm -f forge-install.jar forge-install.jar.log
|
||||
|
||||
if [[ "${NEW_FORGE}" == "true" ]]; then
|
||||
log "Forge ${MC_VERSION} installed (new-style launcher)."
|
||||
else
|
||||
ln -sf "forge-${MC_VERSION}-${VER_LOADER}.jar" server.jar
|
||||
log "Forge ${MC_VERSION}-${VER_LOADER} installed."
|
||||
fi
|
||||
|
||||
touch server.properties
|
||||
}
|
||||
|
||||
@@ -1,40 +1,55 @@
|
||||
getNeoForge() {
|
||||
SERVER_TYPE="NeoForge Server"
|
||||
|
||||
if [[ -n "$MC_VERSION" ]]; then
|
||||
VER_MINECRAFT=$MC_VERSION
|
||||
if [[ -n "${NEOFORGE_VERSION}" ]]; then
|
||||
VER_LOADER="${NEOFORGE_VERSION}"
|
||||
else
|
||||
MC_MINOR="${MC_VERSION#1.}"
|
||||
VER_LOADER=$(curl -s https://maven.neoforged.net/releases/net/neoforged/neoforge/maven-metadata.xml | \
|
||||
xmllint --xpath "/metadata/versioning/versions/version/text()" - 2>/dev/null | \
|
||||
tr ' ' '\n' | grep -v -- '-beta\|-alpha' | grep "^${MC_MINOR}\." | sort -V | tail -1)
|
||||
if [[ -z "$VER_LOADER" ]]; then
|
||||
echo "Could not auto-detect NeoForge version for MC ${MC_VERSION}"
|
||||
crash
|
||||
if [[ -z "${MC_VERSION}" ]]; then
|
||||
die "MC_VERSION is required for NeoForge loader"
|
||||
fi
|
||||
|
||||
local VER_MINECRAFT DL_URL
|
||||
VER_MINECRAFT="${MC_VERSION}"
|
||||
|
||||
if [[ -n "${NEOFORGE_VERSION}" ]]; then
|
||||
VER_LOADER="${NEOFORGE_VERSION}"
|
||||
else
|
||||
log "Auto-detecting latest NeoForge version for MC ${MC_VERSION}..."
|
||||
local MC_MINOR ALL_VERSIONS
|
||||
MC_MINOR="${MC_VERSION#1.}"
|
||||
ALL_VERSIONS=$(curl -sf --connect-timeout 10 --max-time 30 \
|
||||
"https://maven.neoforged.net/releases/net/neoforged/neoforge/maven-metadata.xml" |
|
||||
xmllint --xpath "/metadata/versioning/versions/version/text()" - 2>/dev/null |
|
||||
tr ' ' '\n' | grep "^${MC_MINOR}\." | sort -V || true)
|
||||
|
||||
# Prefer stable versions, fall back to beta/alpha if none exist
|
||||
VER_LOADER=$(echo "$ALL_VERSIONS" | grep -v -- '-beta\|-alpha' | tail -1 || true)
|
||||
if [[ -z "$VER_LOADER" ]]; then
|
||||
VER_LOADER=$(echo "$ALL_VERSIONS" | tail -1)
|
||||
if [[ -n "$VER_LOADER" ]]; then
|
||||
warn "No stable NeoForge version for MC ${MC_VERSION}, using ${VER_LOADER}"
|
||||
fi
|
||||
fi
|
||||
DL_URL=https://maven.neoforged.net/releases/net/neoforged/neoforge/$VER_LOADER/neoforge-$VER_LOADER-installer.jar
|
||||
|
||||
if [[ -z "$VER_LOADER" ]]; then
|
||||
die "Could not auto-detect NeoForge version for MC ${MC_VERSION}"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -n "$DL_URL" ]]; then
|
||||
echo "$DL_URL"
|
||||
rm -rf server.jar
|
||||
DL_URL="https://maven.neoforged.net/releases/net/neoforged/neoforge/${VER_LOADER}/neoforge-${VER_LOADER}-installer.jar"
|
||||
|
||||
curl -o "neoforge-${VER_LOADER}-installer.jar" "${DL_URL}"
|
||||
$JAVA -jar neoforge-$VER_LOADER-installer.jar --installServer --server.jar
|
||||
log "Downloading NeoForge ${VER_LOADER} installer..."
|
||||
rm -f server.jar
|
||||
curl -fL -o "neoforge-${VER_LOADER}-installer.jar" "${DL_URL}"
|
||||
|
||||
mv server.jar neoforge-$VER_LOADER.jar
|
||||
ln -s neoforge-$VER_LOADER.jar server.jar
|
||||
log "Running NeoForge installer..."
|
||||
$JAVA -jar "neoforge-${VER_LOADER}-installer.jar" --installServer --server.jar
|
||||
|
||||
touch server.properties
|
||||
mv server.jar "neoforge-${VER_LOADER}.jar"
|
||||
ln -sf "neoforge-${VER_LOADER}.jar" server.jar
|
||||
|
||||
rm -f neoforge-$VER_LOADER-installer.jar
|
||||
rm -f neoforge-$VER_LOADER-installer.jar.log
|
||||
rm -f README.txt
|
||||
rm -f run.bat
|
||||
else
|
||||
echo "No Valid Download URL"
|
||||
fi
|
||||
rm -f "neoforge-${VER_LOADER}-installer.jar" \
|
||||
"neoforge-${VER_LOADER}-installer.jar.log" \
|
||||
README.txt \
|
||||
run.bat
|
||||
|
||||
touch server.properties
|
||||
log "NeoForge ${MC_VERSION}-${VER_LOADER} installed."
|
||||
}
|
||||
|
||||
@@ -1,23 +1,59 @@
|
||||
getPaper() {
|
||||
SERVER_TYPE="Paper Minecraft"
|
||||
if [[ ! -f server.jar ]]; then
|
||||
if [[ -n "${PAPER_BUILD}" ]]; then
|
||||
LATEST_BUILD="${PAPER_BUILD}"
|
||||
else
|
||||
LATEST_BUILD=$(curl -s https://api.papermc.io/v2/projects/${MC_LOADER}/versions/${MC_VERSION}/builds |
|
||||
jq -r '[.builds[] | select(.channel | ascii_upcase == "STABLE")] | .[-1].build')
|
||||
|
||||
if [[ -z "${MC_VERSION}" ]]; then
|
||||
die "MC_VERSION is required for Paper loader"
|
||||
fi
|
||||
|
||||
if [[ -f server.jar ]]; then
|
||||
log "Paper server.jar already exists, skipping download."
|
||||
return
|
||||
fi
|
||||
|
||||
local PAPERMC_URL
|
||||
|
||||
if [[ -n "${PAPER_BUILD}" ]]; then
|
||||
log "Fetching Paper build ${PAPER_BUILD} for MC ${MC_VERSION}..."
|
||||
local BUILD_DATA
|
||||
BUILD_DATA=$(curl -sf --connect-timeout 10 --max-time 30 \
|
||||
-H "User-Agent: dockercraft/1.0" \
|
||||
"https://fill.papermc.io/v3/projects/paper/versions/${MC_VERSION}/builds") || true
|
||||
|
||||
if [[ -n "$BUILD_DATA" ]]; then
|
||||
PAPERMC_URL=$(echo "$BUILD_DATA" | jq -r \
|
||||
"map(select(.id == ${PAPER_BUILD})) | .[0].downloads.\"server:default\".url // empty")
|
||||
fi
|
||||
|
||||
if [ "$LATEST_BUILD" != "null" ]; then
|
||||
JAR_NAME=${MC_LOADER}-${MC_VERSION}-${LATEST_BUILD}.jar
|
||||
PAPERMC_URL="https://api.papermc.io/v2/projects/${MC_LOADER}/versions/${MC_VERSION}/builds/${LATEST_BUILD}/downloads/${JAR_NAME}"
|
||||
if [[ -z "$PAPERMC_URL" ]]; then
|
||||
die "Paper build ${PAPER_BUILD} not found for MC ${MC_VERSION}"
|
||||
fi
|
||||
else
|
||||
log "Querying PaperMC API for latest stable build of ${MC_VERSION}..."
|
||||
local BUILDS_DATA
|
||||
BUILDS_DATA=$(curl -sf --connect-timeout 10 --max-time 30 \
|
||||
-H "User-Agent: dockercraft/1.0" \
|
||||
"https://fill.papermc.io/v3/projects/paper/versions/${MC_VERSION}/builds") || true
|
||||
|
||||
curl -o server.jar "$PAPERMC_URL"
|
||||
echo "Download completed"
|
||||
echo "Minecraft Version: ${MC_VERSION}"
|
||||
echo "Paper Version: ${LATEST_BUILD}"
|
||||
else
|
||||
echo "No stable build for version $MC_VERSION found :("
|
||||
if [[ -z "$BUILDS_DATA" ]]; then
|
||||
die "Could not fetch Paper builds for MC ${MC_VERSION}"
|
||||
fi
|
||||
|
||||
# Check for API error
|
||||
if echo "$BUILDS_DATA" | jq -e '.ok == false' >/dev/null 2>&1; then
|
||||
local ERR_MSG
|
||||
ERR_MSG=$(echo "$BUILDS_DATA" | jq -r '.message // "Unknown error"')
|
||||
die "PaperMC API error: ${ERR_MSG}"
|
||||
fi
|
||||
|
||||
PAPERMC_URL=$(echo "$BUILDS_DATA" | jq -r \
|
||||
'first(.[] | select(.channel == "STABLE") | .downloads."server:default".url) // empty')
|
||||
|
||||
if [[ -z "$PAPERMC_URL" ]]; then
|
||||
die "No stable Paper build found for MC ${MC_VERSION}"
|
||||
fi
|
||||
fi
|
||||
|
||||
log "Downloading Paper for MC ${MC_VERSION}..."
|
||||
curl -fL -o server.jar "$PAPERMC_URL"
|
||||
log "Paper for MC ${MC_VERSION} downloaded."
|
||||
}
|
||||
|
||||
@@ -1,13 +1,38 @@
|
||||
getVanilla() {
|
||||
SERVER_TYPE="Vanilla Minecraft"
|
||||
MANIFEST=$(curl -s https://launchermeta.mojang.com/mc/game/version_manifest.json)
|
||||
VERSION_URL=$(echo "$MANIFEST" | jq -r ".versions[] | select(.id == \"${MC_VERSION}\") | .url")
|
||||
if [[ -n "$VERSION_URL" ]] && [[ "$VERSION_URL" != "null" ]]; then
|
||||
VERSION_DATA=$(curl -s "$VERSION_URL")
|
||||
DOWNLOAD_URL=$(echo "$VERSION_DATA" | jq -r ".downloads.server.url")
|
||||
curl -o server.jar "$DOWNLOAD_URL"
|
||||
else
|
||||
echo "Version ${MC_VERSION} not found in Mojang manifest"
|
||||
crash
|
||||
|
||||
if [[ -z "${MC_VERSION}" ]]; then
|
||||
die "MC_VERSION is required for Vanilla loader"
|
||||
fi
|
||||
|
||||
log "Fetching Mojang version manifest..."
|
||||
local MANIFEST
|
||||
MANIFEST=$(curl -sf --connect-timeout 10 --max-time 30 \
|
||||
"https://launchermeta.mojang.com/mc/game/version_manifest.json") || true
|
||||
|
||||
if [[ -z "$MANIFEST" ]]; then
|
||||
die "Could not fetch Mojang version manifest"
|
||||
fi
|
||||
|
||||
local VERSION_URL
|
||||
VERSION_URL=$(echo "$MANIFEST" | jq -r ".versions[] | select(.id == \"${MC_VERSION}\") | .url")
|
||||
|
||||
if [[ -z "$VERSION_URL" || "$VERSION_URL" == "null" ]]; then
|
||||
die "Version ${MC_VERSION} not found in Mojang manifest"
|
||||
fi
|
||||
|
||||
local VERSION_DATA DOWNLOAD_URL
|
||||
VERSION_DATA=$(curl -sf --connect-timeout 10 --max-time 30 "$VERSION_URL") || true
|
||||
if [[ -z "$VERSION_DATA" ]]; then
|
||||
die "Could not fetch version data for ${MC_VERSION}"
|
||||
fi
|
||||
|
||||
DOWNLOAD_URL=$(echo "$VERSION_DATA" | jq -r ".downloads.server.url")
|
||||
if [[ -z "$DOWNLOAD_URL" || "$DOWNLOAD_URL" == "null" ]]; then
|
||||
die "No server download URL found for ${MC_VERSION}"
|
||||
fi
|
||||
|
||||
log "Downloading Vanilla ${MC_VERSION} server..."
|
||||
curl -fL -o server.jar "$DOWNLOAD_URL"
|
||||
log "Vanilla ${MC_VERSION} downloaded."
|
||||
}
|
||||
|
||||
+62
-69
@@ -1,10 +1,10 @@
|
||||
serverSelect() {
|
||||
mkdir -p /data/server
|
||||
cd /data/server || exit
|
||||
cd /data/server || die "Cannot access /data/server"
|
||||
if [[ -f "server.jar" ]] || [[ -f "run.sh" ]] || [[ -f "bedrock_server" ]]; then
|
||||
echo "Found what appears to be a server, sending it"
|
||||
log "Found existing server files, skipping download."
|
||||
else
|
||||
case $MC_LOADER in
|
||||
case "$MC_LOADER" in
|
||||
vanilla)
|
||||
getVanilla
|
||||
;;
|
||||
@@ -24,8 +24,7 @@ serverSelect() {
|
||||
getBedrock
|
||||
;;
|
||||
*)
|
||||
echo "Server of type ${MC_LOADER} is not recognized."
|
||||
crash
|
||||
die "Server type '${MC_LOADER}' is not recognized. Valid: vanilla, paper, fabric, forge, neoforge, bedrock"
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
@@ -33,78 +32,72 @@ serverSelect() {
|
||||
|
||||
buildCommand() {
|
||||
JAVA_ARGS="-Xms${XMS} -Xmx${XMX}"
|
||||
if [[ -n $ADD_ARGS ]]; then
|
||||
if [[ -n "${ADD_ARGS}" ]]; then
|
||||
RUN_STRING="${ADD_ARGS} ${JAVA_ARGS} -jar ${JAR} nogui"
|
||||
else
|
||||
RUN_STRING="${JAVA_ARGS} -jar ${JAR} nogui"
|
||||
fi
|
||||
}
|
||||
|
||||
serverStart() {
|
||||
detectForgeVersion() {
|
||||
# Detect the forge/neoforge version from the installed jar names
|
||||
VER_LOADER="${VER_LOADER:-}"
|
||||
if [[ -z "$VER_LOADER" ]]; then
|
||||
if [[ "$MC_LOADER" == "neoforge" ]] && [[ -L "/data/server/server.jar" ]]; then
|
||||
VER_LOADER=$(readlink "/data/server/server.jar" | sed 's/^neoforge-//;s/\.jar$//')
|
||||
elif [[ "$MC_LOADER" == "forge" ]]; then
|
||||
local forge_jar
|
||||
forge_jar=$(ls /data/server/forge-${MC_VERSION}-*.jar 2>/dev/null | head -1)
|
||||
if [[ -n "$forge_jar" ]]; then
|
||||
VER_LOADER=${forge_jar#/data/server/forge-${MC_VERSION}-}
|
||||
VER_LOADER=${VER_LOADER%.jar}
|
||||
fi
|
||||
fi
|
||||
if [[ -n "$VER_LOADER" ]]; then
|
||||
return
|
||||
fi
|
||||
|
||||
while true; do
|
||||
cd /data/server || exit
|
||||
if [[ ! -f "server.properties" ]]; then touch "server.properties"; fi
|
||||
|
||||
if [[ -f $JAR || -f "run.sh" || -f "bedrock_server" ]]; then
|
||||
echo -e "|_______________________________________________________|"
|
||||
echo -e "|##----------------- Server Starting -----------------##|"
|
||||
echo -e "|#| Minecraft Version: $MC_VERSION"
|
||||
echo -e "|#| "
|
||||
echo -e "|#| Loader Type: ${SERVER_TYPE:-$MC_LOADER}"
|
||||
echo -e "|#| Loader Version: $MC_LOADER_VERSION"
|
||||
echo -e "|#| "
|
||||
if [[ "$MC_LOADER" != "bedrock" ]]; then
|
||||
echo -e "|#| Java Version: $JAVA_VERSION"
|
||||
echo -e "|#| Jar: $JAR"
|
||||
echo -e "|#| Memory Allocated: "
|
||||
echo -e "|#| Xms: $XMS"
|
||||
echo -e "|#| Xmx: $XMX"
|
||||
echo -e "|#| Additional Args: ${ADD_ARGS:-"NONE"}"
|
||||
fi
|
||||
echo -e "|#| "
|
||||
echo -e "|#| Running as:"
|
||||
echo -e "|#| User: $PUID"
|
||||
echo -e "|#| Group: $PGID"
|
||||
echo -e "|#| "
|
||||
if [[ "$MC_LOADER" == "bedrock" ]]; then
|
||||
echo -e "|#| Run Command:"
|
||||
echo -e "|#| LD_LIBRARY_PATH=. ./bedrock_server"
|
||||
elif [[ ${NEW_FORGE:-false} != "true" ]]; then
|
||||
echo -e "|#| Run Command:"
|
||||
echo -e "|#| java $RUN_STRING"
|
||||
fi
|
||||
echo -e "|##---------------------------------------------------##|"
|
||||
echo -e "|-------------------------------------------------------|"
|
||||
echo -e " "
|
||||
serverInfoWrite
|
||||
newForge
|
||||
if [[ "$MC_LOADER" == "bedrock" ]]; then
|
||||
exec env LD_LIBRARY_PATH=. ./bedrock_server
|
||||
elif [[ "$MC_LOADER" == "neoforge" ]]; then
|
||||
exec java @user_jvm_args.txt @libraries/net/neoforged/neoforge/"${VER_LOADER}"/unix_args.txt "$@"
|
||||
elif [[ "$MC_LOADER" == "forge" ]] && [[ ${NEW_FORGE:-false} == "true" ]]; then
|
||||
exec java @user_jvm_args.txt @libraries/net/minecraftforge/forge/"$MC_VERSION"-"${VER_LOADER}"/unix_args.txt "$@"
|
||||
else
|
||||
echo "java $RUN_STRING"
|
||||
exec java $RUN_STRING
|
||||
fi
|
||||
else
|
||||
echo "Server Not Found."
|
||||
crash
|
||||
if [[ "$MC_LOADER" == "neoforge" ]] && [[ -L "/data/server/server.jar" ]]; then
|
||||
VER_LOADER=$(readlink "/data/server/server.jar" | sed 's/^neoforge-//;s/\.jar$//')
|
||||
elif [[ "$MC_LOADER" == "forge" ]]; then
|
||||
local forge_jar
|
||||
forge_jar=$(ls /data/server/forge-"${MC_VERSION}"-*.jar 2>/dev/null | head -1)
|
||||
if [[ -n "$forge_jar" ]]; then
|
||||
VER_LOADER="${forge_jar#/data/server/forge-${MC_VERSION}-}"
|
||||
VER_LOADER="${VER_LOADER%.jar}"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
serverStart() {
|
||||
detectForgeVersion
|
||||
newForge
|
||||
|
||||
cd /data/server || die "Cannot access /data/server"
|
||||
if [[ ! -f "server.properties" ]]; then
|
||||
touch "server.properties"
|
||||
fi
|
||||
|
||||
if [[ ! -f "$JAR" ]] && [[ ! -f "run.sh" ]] && [[ ! -f "bedrock_server" ]]; then
|
||||
die "Server binary not found in /data/server"
|
||||
fi
|
||||
|
||||
log "--- Server Starting ---"
|
||||
log "Minecraft Version: ${MC_VERSION}"
|
||||
log "Loader Type: ${SERVER_TYPE:-$MC_LOADER}"
|
||||
log "Loader Version: ${MC_LOADER_VERSION:-auto}"
|
||||
if [[ "$MC_LOADER" != "bedrock" ]]; then
|
||||
log "Java Version: ${JAVA_VERSION}"
|
||||
log "Jar: ${JAR}"
|
||||
log "Memory: Xms=${XMS} Xmx=${XMX}"
|
||||
if [[ -n "${ADD_ARGS}" ]]; then
|
||||
log "Additional Args: ${ADD_ARGS}"
|
||||
fi
|
||||
fi
|
||||
log "Running as UID:${PUID} GID:${PGID}"
|
||||
|
||||
serverInfoWrite
|
||||
|
||||
if [[ "$MC_LOADER" == "bedrock" ]]; then
|
||||
log "Starting Bedrock server..."
|
||||
exec env LD_LIBRARY_PATH=. ./bedrock_server
|
||||
elif [[ "$MC_LOADER" == "neoforge" ]]; then
|
||||
log "Starting NeoForge server..."
|
||||
exec java @user_jvm_args.txt @libraries/net/neoforged/neoforge/"${VER_LOADER}"/unix_args.txt "$@"
|
||||
elif [[ "$MC_LOADER" == "forge" ]] && [[ "${NEW_FORGE:-false}" == "true" ]]; then
|
||||
log "Starting Forge server (new-style)..."
|
||||
exec java @user_jvm_args.txt @libraries/net/minecraftforge/forge/"${MC_VERSION}"-"${VER_LOADER}"/unix_args.txt "$@"
|
||||
else
|
||||
log "Starting ${SERVER_TYPE:-$MC_LOADER} server..."
|
||||
exec java $RUN_STRING
|
||||
fi
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user