summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-04-12 13:53:16 -0400
committerFreya Murphy <freya@freyacat.org>2025-04-12 13:53:16 -0400
commitfefed51ba577431c18b6f703b9ea3c5fa43a73d3 (patch)
treed31d253816b690da1fe840ab09863d013825f8a6
parentopenrc (diff)
downloadimages-fefed51ba577431c18b6f703b9ea3c5fa43a73d3.tar.gz
images-fefed51ba577431c18b6f703b9ea3c5fa43a73d3.tar.bz2
images-fefed51ba577431c18b6f703b9ea3c5fa43a73d3.zip
update minecraft image
-rwxr-xr-xenv32
-rw-r--r--minecraft/Dockerfile13
-rwxr-xr-xminecraft/build23
-rwxr-xr-xminecraft/mcjar43
-rwxr-xr-x[-rw-r--r--]minecraft/mclauncher77
5 files changed, 176 insertions, 12 deletions
diff --git a/env b/env
new file mode 100755
index 0000000..fda0d83
--- /dev/null
+++ b/env
@@ -0,0 +1,32 @@
+#!/bin/sh
+
+# container registry
+REMOTE="g.freya.cat"
+USER="freya"
+
+# image info
+IMAGE="image"
+TAG="latest"
+ARCH="linux/amd64,linux/arm64"
+
+# builder args
+ALPINE_VERSION="3.21"
+
+init() {
+ docker login "$REMOTE" -u "$USER"
+ current="$(docker buildx inspect | head -n 1 | awk '{ print $2 }')"
+ if [ "$current" != "builder" ]; then
+ docker buildx create --name builder
+ docker buildx use builder
+ fi
+}
+
+buildx() {
+ docker buildx build \
+ --push \
+ --platform "$ARCH" \
+ -t "$REMOTE/$USER/$IMAGE:$TAG" \
+ --build-arg "ALPINE_VERSION=$ALPINE_VERSION" \
+ $@ \
+ .
+}
diff --git a/minecraft/Dockerfile b/minecraft/Dockerfile
index 58b536e..058e450 100644
--- a/minecraft/Dockerfile
+++ b/minecraft/Dockerfile
@@ -1,12 +1,15 @@
-FROM alpine
+ARG JAVA_VERSION="21"
+ARG ALPINE_VERSION="3.21"
+FROM alpine:${ALPINE_VERSION}
# set environment
-ENV LANG en_US.UTF-8
-ENV JAVA_HOME=/usr/lib/jvm/java-21-openjdk
-ENV PATH=/usr/lib/jvm/java-21-openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
+ARG JAVA_VERSION
+ENV LANG=en_US.UTF-8
+ENV JAVA_HOME=/usr/lib/jvm/java-${JAVA_VERSION}-openjdk
+ENV PATH=/usr/lib/jvm/java-${JAVA_VERSION}-openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# install packages
-RUN apk add --no-cache tini wget openjdk21-jre jq curl shadow fontconfig ttf-dejavu
+RUN apk add --no-cache tini wget openjdk${JAVA_VERSION}-jre jq curl shadow fontconfig ttf-dejavu p7zip
# copy scripts
COPY ./mcjar /usr/local/bin/mcjar
diff --git a/minecraft/build b/minecraft/build
new file mode 100755
index 0000000..8fd2655
--- /dev/null
+++ b/minecraft/build
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+set -e
+
+. ../env
+
+IMAGE=minecraft
+
+build() {
+ local TAG="$1"
+ local ARCH="$ARCH"
+ if [ $2 -eq 8 ]; then
+ ARCH="$ARCH,linux/386,linux/arm/v6,linux/arm/v7"
+ fi
+ buildx --build-arg "JAVA_VERSION=$2"
+}
+
+init
+build java8 8
+build java11 11
+build java17 17
+build java21 21
+build latest 21
diff --git a/minecraft/mcjar b/minecraft/mcjar
index 54e95d5..957032e 100755
--- a/minecraft/mcjar
+++ b/minecraft/mcjar
@@ -23,6 +23,9 @@ FABRIC_INSTALLER="$(lower "${FABRIC_INSTALLER:-latest}")"
# forge
FORGE_VERSION="$(lower "${FORGE_VERSION:-recommended}")"
+# neoforged
+NEOFORGED_VERSION="$(lower "${NEOFORGED_VERSION:-latest}")"
+
# other
QUIET=1
@@ -303,6 +306,43 @@ forge() {
fi
}
+neoforged() {
+ versions=$(req "https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/neoforge" | jq -r '.versions[]')
+ prefix="${MC_VERSION#"1."}"
+
+ # get requested server version
+ if [ "$MC_VERSION" != "latest" ]; then
+ versions="$(echo "$versions" | grep "$prefix" || true)"
+ fi
+
+ # get neoforged version
+ if [ "$NEOFORGED_VERSION" = "latest" ]; then
+ version="$(echo "$versions" | tail -n1)"
+ if [ "$version" = "" ]; then
+ error "invalid MC_VERSION: $MC_VERSION"
+ fi
+ else
+ version="$NEOFORGED_VERSION"
+ if ! echo "$versions" | grep -q "$version"; then
+ error "invalid NEOFORGED_VERSION: $version"
+ fi
+ fi
+
+ # get jar url
+ url="https://maven.neoforged.net/releases/net/neoforged/neoforge/$version/neoforge-$version-installer.jar"
+
+ if [ $ALL -eq 1 ]; then
+ echo "JAR_NAME=neoforge-$version-installer.jar"
+ echo "JAR_URL=$url"
+ echo "MC_TYPE=$MC_TYPE"
+ echo "MC_VERSION=$MC_VERSION"
+ echo "NEOFORGED_VERSION=$version"
+ else
+ echo "$url"
+ fi
+
+}
+
get_url() {
log "TYPE: $MC_TYPE"
@@ -319,6 +359,9 @@ get_url() {
"forge")
forge
;;
+ "neoforged")
+ neoforged
+ ;;
*)
error "Invalid TYPE: $MC_TYPE"
;;
diff --git a/minecraft/mclauncher b/minecraft/mclauncher
index 487c929..98a2610 100644..100755
--- a/minecraft/mclauncher
+++ b/minecraft/mclauncher
@@ -6,8 +6,9 @@ set -e
# DEFAULT VARIABLE GENERATORS
#
+MEMORY="${MEMORY:-1G}"
+
jvm_args() {
- MEMORY="${MEMORY:-1G}"
printf -- "-Xms$MEMORY -Xmx$MEMORY "
printf -- "-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 "
printf -- "-XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch "
@@ -18,6 +19,10 @@ jvm_args() {
printf -- "-XX:MaxTenuringThreshold=1"
}
+lower() {
+ echo "$1" | tr '[:upper:]' '[:lower:]'
+}
+
#
# ENV VARS
#
@@ -25,13 +30,24 @@ jvm_args() {
SERVER_DIR="$(realpath ${SERVER_DIR:-./server})"
JVMARGS=${JVMARGS:-$(jvm_args)}
+MC_TYPE="$(lower "${MC_TYPE:-vanilla}")"
+MC_VERSION="$(lower "${MC_VERSION:-latest}")"
+
#
# PREDEFINE VARS
#
MCLAUNCHER_INFO=""
MCLAUNCHER_BINARY=""
-MCLAUNCHER_QUIET=1
+MCLAUNCHER_QUIET=0
+MCLAUNCHER_CACHE="$SERVER_DIR/.mclauncher"
+
+#
+# INTERNET CHECK
+#
+
+HAS_INTERNET=1
+UPDATED=0
#
# HELPERS
@@ -48,6 +64,12 @@ log() {
fi
}
+warn() {
+ if [ "$MCLAUNCHER_QUIET" -eq 0 ]; then
+ printf '\x1b[33m[WARN]\t\x1b[0m%s\n' "$*" > /dev/stderr
+ fi
+}
+
step() {
if [ "$MCLAUNCHER_QUIET" -eq 0 ]; then
printf '\x1b[36m[STEP]\t\x1b[0m%s\n' "$*" > /dev/stderr
@@ -66,9 +88,29 @@ get_key() {
info_step() {
step "info"
- # getting latest info from mcjar
- MCLAUNCHER_INFO="$(mcjar -a)"
+ # check if we can use the internet
+ if ! nc -zw1 google.com 443 &>/dev/null; then
+ warn "Cannot internet access internet"
+ HAS_INTERNET=0
+ fi
+
+ # get the latest from mcjar if possible
+ if [ $HAS_INTERNET -eq 1 ]; then
+ if ! MCLAUNCHER_INFO="$(mcjar -a)"; then
+ warn "Failed to get newest information from mcjar"
+ MCLAUNCHER_INFO=""
+ fi
+ fi
+ # get information from cache if latest failed
+ if [ "$MCLAUNCHER_INFO" == "" ]; then
+ if [ ! -e "$MCLAUNCHER_CACHE" ]; then
+ error "No offline cache file found"
+ fi
+ MCLAUNCHER_INFO="$(cat "$MCLAUNCHER_CACHE")"
+ fi
+
+ echo "$MCLAUNCHER_INFO" > "$MCLAUNCHER_CACHE"
[ "$MCLAUNCHER_QUIET" -eq 1 ] || echo "$MCLAUNCHER_INFO";
}
@@ -128,15 +170,24 @@ download_step() {
step "download"
if [ "$MCLAUNCHER_BINARY" != "" ]; then
- log "jar is up to date... skipping"
- return;
+ # check if jar file is valid
+ if ! 7z t "$MCLAUNCHER_BINARY" &>/dev/null; then
+ warn "jar file is corrupted"
+ else
+ log "jar is up to date... skipping"
+ return;
+ fi
+ fi
+
+ if [ $HAS_INTERNET -eq 0 ]; then
+ error "Cannot download jar due to lack of internet"
fi
# clean up old files
rm -f "$SERVER_DIR"/*.jar
rm -f "$SERVER_DIR"/*.jar.log
rm -f "$SERVER_DIR"/*.bat
- rm -f "$SERVER_DIR/run.sh"
+ rm -f "$SERVER_DIR"/run.sh
# update the jar
log "jar is out of date... updating"
@@ -145,6 +196,7 @@ download_step() {
log "downloading '$jar_url'"
wget -q "$jar_url" -O "$SERVER_DIR/$jar_name"
MCLAUNCHER_BINARY="$jar_name"
+ UPDATED=1
}
#
@@ -166,11 +218,19 @@ install_step_forge() {
install_step() {
step "install"
+ if [ "$UPDATED" -eq 0 ]; then
+ log "jar not updated... skipping"
+ return;
+ fi
+
type="$(get_key "MC_TYPE")"
case "$type" in
"forge")
install_step_forge
;;
+ "neoforged")
+ install_step_forge
+ ;;
*)
log "install step not needed for '$type'"
;;
@@ -207,6 +267,9 @@ execute_step() {
"forge")
execute_step_forge
;;
+ "neoforged")
+ execute_step_forge
+ ;;
*)
execute_step_default
;;