Modrinth Generic
A generic egg for a Modrinth modpack.
Ports
Add an allocation on the node for each port.
- Game 25565
Install
- Installer image
- eclipse-temurin:17-jdk
- Install script
- 347 lines
Images
New servers use the first image. Users can change it on the Startup page.
- Java 8 default ghcr.io/ptero-eggs/yolks:java_8
- Java 11 ghcr.io/ptero-eggs/yolks:java_11
- Java 16 ghcr.io/ptero-eggs/yolks:java_16
- Java 17 ghcr.io/ptero-eggs/yolks:java_17
- java 21 ghcr.io/ptero-eggs/yolks:java_21
- java 22 ghcr.io/ptero-eggs/yolks:java_22
- Java 25 ghcr.io/ptero-eggs/yolks:java_25
Panel features
- eula
The Panel asks the user to accept the Minecraft EULA when the server needs it.
- java_version
The Panel lets the user change the Java version when the server needs a different one.
- pid_limit
The Panel tells the user when the server reaches its process or memory limit.
Startup
The Panel runs this command to start the server. It replaces each variable in the command with the value of that variable.
2 variables
Startup command
java $([[ -f user_jvm_args.txt ]] && printf %s "@user_jvm_args.txt") -Xms128M -Xmx1024M -Dterminal.jline=false -Dterminal.ansi=true $([[ ! -f unix_args.txt ]] && printf %s "-jar `cat .serverjar`" || printf %s "@unix_args.txt")Dotted values come from the server settings. These values are examples.
This is the modpack project ID from the Modrinth site. For example, the project ID of 'https://modrinth.com/modpack/fabulously-optimized/' is 1KVo5zza
PROJECT_IDUsers can edit
required|string|max:8A value is required.
This is the modpack version ID from the Modrinth site. For example, the version ID of 'https://modrinth.com/modpack/fabulously-optimized/version/4.7.4' is P9wA6exe
VERSION_IDUsers can edit
string|max:8
Wings
- Stop command
- stop
- Running when the console shows
- )! For help, type
Files Wings edits
Wings sets these values in these files before each start.
server.properties properties
- server-ip
- 0.0.0.0
- server-port
- {{server.build.default.port}}
- query.port
- {{server.build.default.port}}
Readme
Modrinth Generic
This is a generic egg for Modrinth modpacks
You will need to give it a modpack project ID. The project ID for Extreme Optimization! is 1oIpaoJo for example.
This can be found on the modpack page in the Technical information section in the left sidebar.
You can also optionally specify a version ID. If you do not specify a version ID, the latest version will be used. The version ID for Extreme Optimization! version 1.12.2For2.0 is SyMW2FDv for example. This can be found on the modpack page by clicking the version number in the Versions section.
The script will automatically setup of Forge, Fabric, or Quilt depending on the modpack.
Server Ports
The minecraft server requires a single port for access (default 25565) but plugins may require extra ports to enabled for the server.
| Port | default |
|---|---|
| Game | 25565 |
Changes
- Adding java 25 to most minecraft eggs
· Red-Banana-Official · fb0c032
- Updating MC docker images (#23)
· Red Banana · 8f3fc4d
- Add Minecraft eggs
· Daniel Barton · 7322302
Problem with this egg?
Open an issue on GitHub. Include your Panel and Wings versions.
Install script 347 lines bash in eclipse-temurin:17-jdk Show Hide
#!/bin/bash
# shellcheck disable=SC2155
#
# Modrinth Installation Script
#
# Server Files: /mnt/server
: "${SERVER_DIR:=/mnt/server}"
: "${PROJECT_ID:=}"
: "${VERSION_ID:=}"
if [[ ! -d $SERVER_DIR ]]; then
mkdir -p "$SERVER_DIR"
fi
if ! cd "$SERVER_DIR"; then
echo -e "Failed to change directory to ${SERVER_DIR}"
exit 1
fi
function install_required {
echo -e "Installing required packages..."
echo -e "\tRunning apt update"
if ! apt update > /dev/null 2>&1; then
echo -e "\tERROR: apt update failed!"
exit 1
fi
echo -e "\tRunning apt install"
if ! apt install -y wget jq unzip dos2unix > /dev/null 2>&1; then
echo -e "\tERROR: apt install failed!"
exit 1
fi
}
MODRINTH_API_URL="https://api.modrinth.com/v2"
function get_download {
echo -e "Retrieving Modrinth project information..."
local PROJECT_DATA=$(wget -q "${MODRINTH_API_URL}/project/${PROJECT_ID}" -O -)
local PROJECT_TITLE=$(echo "$PROJECT_DATA" | jq -r '.title // empty')
local PROJECT_SUPPORTED=$(echo "$PROJECT_DATA" | jq -r '."server_side" // empty')
if [[ -z "${PROJECT_DATA}" ]]; then
echo -e "\tERROR: Failed to retrieve project data for project id '${PROJECT_ID}'"
exit 1
fi
if [[ "${PROJECT_SUPPORTED}" == "unsupported" ]]; then
echo -e "\tWARNING: The project '${PROJECT_TITLE}' is listed as unsupported for server use. Continuing anyway..."
fi
if [[ -z "${VERSION_ID}" || "${VERSION_ID}" == "latest" ]]; then
echo -e "\tNo version ID specified, using latest version"
VERSION_ID=$(echo "$PROJECT_DATA" | jq -r '.versions[-1] // empty')
else
echo -e "\tChecking if provided version id '${VERSION_ID}' exists"
if [[ $(echo "$PROJECT_DATA" | jq -r --arg VERSION_ID "$VERSION_ID" '.versions[]? | select(. == $VERSION_ID)') != "${VERSION_ID}" ]]; then
echo -e "\tERROR: Version id '${VERSION_ID}' not found for project '${PROJECT_TITLE}'"
exit 1
fi
fi
if [[ -z "${VERSION_ID}" ]]; then
echo -e "\tERROR: No version id found for project '${PROJECT_TITLE}'"
exit 1
fi
# get json data to work with
echo -e "\tRetrieving version information for '${VERSION_ID}'"
local JSON_DATA=$(wget -q "${MODRINTH_API_URL}/version/${VERSION_ID}" -O -)
if [[ -z "${JSON_DATA}" ]]; then
echo -e "\tERROR: Failed to retrieve version data for version id '${VERSION_ID}'"
exit 1
fi
echo -e "\tParsing Modrinth pack download url"
local DOWNLOAD_URL=$(echo "$JSON_DATA" | jq -r '.files[]? | select(.primary == true) | .url')
if [[ -z "${DOWNLOAD_URL}" ]]; then
echo -e "\tERROR: No download url found for version ${VERSION_ID}"
exit 1
fi
## download modpack files
echo -e "\tDownloading ${DOWNLOAD_URL}"
if ! wget -q "${DOWNLOAD_URL}" -O server.zip; then
echo -e "\tERROR: Failed to download modpack files!"
exit 1
fi
}
function unpack_zip {
unzip -o server.zip
rm -rf server.zip
}
function json_download_mods {
echo "Downloading mods..."
local MANIFEST="${SERVER_DIR}/modrinth.index.json"
jq -c '.files[]? | select(.env.server == "required") | {name: .path, url: .downloads[0]}' "${MANIFEST}" | while read -r mod; do
local FILE_URL=$(echo "${mod}" | jq -r '.url // empty')
local FILE_NAME=$(echo "${mod}" | jq -r '.name // empty')
if [[ -z "${FILE_URL}" ]]; then
echo -e "\tERROR: No download url found for mod '${mod}'"
exit 1
fi
echo -e "\tDownloading ${FILE_URL}"
if ! wget -q "${FILE_URL}" -P "${SERVER_DIR}/mods"; then
echo -e "\tERROR: Failed to download mod '${FILE_NAME}'"
exit 1
fi
done
}
function json_download_overrides {
echo "Copying overrides..."
if [[ -d "${SERVER_DIR}/overrides" ]]; then
echo -e "\tCopying shared overrides"
chmod -R 755 "${SERVER_DIR}/overrides/"*
cp -r "${SERVER_DIR}/overrides/"* "${SERVER_DIR}"
rm -r "${SERVER_DIR}/overrides"
fi
if [[ -d "${SERVER_DIR}/server-overrides" ]]; then
echo -e "\tCopying server overrides"
chmod -R 755 "${SERVER_DIR}/server-overrides/"*
cp -r "${SERVER_DIR}/server-overrides/"* "${SERVER_DIR}"
rm -r "${SERVER_DIR}/server-overrides"
fi
}
FORGE_INSTALLER_URL="https://maven.minecraftforge.net/net/minecraftforge/forge/"
function json_download_forge {
echo "Downloading Forge..."
local MANIFEST="${SERVER_DIR}/modrinth.index.json"
local MC_VERSION=$(jq -r '.dependencies.minecraft // empty' "${MANIFEST}")
local FORGE_VERSION=$(jq -r '.dependencies.forge // empty' "${MANIFEST}")
if [[ -z "${MC_VERSION}" ]]; then
echo -e "\tERROR: No Minecraft version found in manifest '${MANIFEST}'"
exit 1
fi
if [[ -z "${FORGE_VERSION}" ]]; then
echo -e "\tERROR: No Forge version found in manifest '${MANIFEST}'"
exit 1
fi
FORGE_VERSION="${MC_VERSION}-${FORGE_VERSION}"
if [[ "${MC_VERSION}" == "1.7.10" || "${MC_VERSION}" == "1.8.9" ]]; then
FORGE_VERSION="${FORGE_VERSION}-${MC_VERSION}"
fi
local FORGE_JAR="forge-${FORGE_VERSION}.jar"
if [[ "${MC_VERSION}" == "1.7.10" ]]; then
FORGE_JAR="forge-${FORGE_VERSION}-universal.jar"
fi
local FORGE_URL="${FORGE_INSTALLER_URL}${FORGE_VERSION}/forge-${FORGE_VERSION}"
echo -e "\tUsing Forge ${FORGE_VERSION} from ${FORGE_URL}"
local FORGE_INSTALLER="${FORGE_URL}-installer.jar"
echo -e "\tDownloading Forge Installer ${FORGE_VERSION} from ${FORGE_INSTALLER}"
if ! wget -q -O forge-installer.jar "${FORGE_INSTALLER}"; then
echo -e "\tERROR: Failed to download Forge Installer ${FORGE_VERSION}"
exit 1
fi
rm -rf libraries/net/minecraftforge/forge/
rm -f unix_args.txt
echo -e "\tInstalling Forge Server ${FORGE_VERSION}"
if ! java -jar forge-installer.jar --installServer > /dev/null 2>&1; then
echo -e "\tERROR: Failed to install Forge Server ${FORGE_VERSION}"
exit 1
fi
if [[ $MC_VERSION =~ ^1\.(17|18|19|20|21|22|23) || $FORGE_VERSION =~ ^1\.(17|18|19|20|21|22|23) ]]; then
echo -e "\tDetected Forge 1.17 or newer version. Setting up Forge Unix arguments"
ln -sf libraries/net/minecraftforge/forge/*/unix_args.txt unix_args.txt
else
mv "$FORGE_JAR" forge-server-launch.jar
echo "forge-server-launch.jar" > ".serverjar"
fi
rm -f forge-installer.jar
}
FABRIC_INSTALLER_URL="https://meta.fabricmc.net/v2/versions/installer"
function json_download_fabric {
echo "Downloading Fabric..."
local MANIFEST="${SERVER_DIR}/modrinth.index.json"
local MC_VERSION=$(jq -r '.dependencies.minecraft // empty' "${MANIFEST}")
local FABRIC_VERSION=$(jq -r '.dependencies."fabric-loader" // empty' "${MANIFEST}")
if [[ -z "${MC_VERSION}" ]]; then
echo -e "\tERROR: No Minecraft version found in manifest '${MANIFEST}'"
exit 1
fi
if [[ -z "${FABRIC_VERSION}" ]]; then
echo -e "\tERROR: No Fabric version found in manifest '${MANIFEST}'"
exit 1
fi
local INSTALLER_JSON=$(wget -q -O - ${FABRIC_INSTALLER_URL} )
local INSTALLER_VERSION=$(echo "$INSTALLER_JSON" | jq -r '.[0].version // empty')
local INSTALLER_URL=$(echo "$INSTALLER_JSON" | jq -r '.[0].url // empty')
if [[ -z "${INSTALLER_VERSION}" ]]; then
echo -e "\tERROR: No Fabric installer version found in manifest!"
exit 1
fi
if [[ -z "${INSTALLER_URL}" ]]; then
echo -e "\tERROR: No Fabric installer url found in manifest!"
exit 1
fi
echo -e "\tDownloading Fabric Installer ${MC_VERSION}-${FABRIC_VERSION} (${INSTALLER_VERSION}) from ${INSTALLER_URL}"
if ! wget -q -O fabric-installer.jar "${INSTALLER_URL}"; then
echo -e "\tERROR: Failed to download Fabric Installer ${MC_VERSION}-${FABRIC_VERSION} (${INSTALLER_VERSION})"
exit 1
fi
echo -e "\tInstalling Fabric Server ${MC_VERSION}-${FABRIC_VERSION} (${INSTALLER_VERSION})"
if ! java -jar fabric-installer.jar server -mcversion "${MC_VERSION}" -loader "${FABRIC_VERSION}" -downloadMinecraft; then
echo -e "\tERROR: Failed to install Fabric Server ${MC_VERSION}-${FABRIC_VERSION} (${INSTALLER_VERSION})"
exit 1
fi
echo "fabric-server-launch.jar" > ".serverjar"
rm -f fabric-installer.jar
}
QUILT_INSTALLER_URL="https://meta.quiltmc.org/v3/versions/installer"
function json_download_quilt {
echo "Downloading Quilt..."
local MANIFEST="${SERVER_DIR}/modrinth.index.json"
local MC_VERSION=$(jq -r '.dependencies.minecraft // empty' "${MANIFEST}")
local QUILT_VERSION=$(jq -r '.dependencies."quilt-loader" // empty' "${MANIFEST}")
if [[ -z "${MC_VERSION}" ]]; then
echo -e "\tERROR: No Minecraft version found in manifest!"
exit 1
fi
if [[ -z "${QUILT_VERSION}" ]]; then
echo -e "\tERROR: No Quilt version found in manifest!"
exit 1
fi
local INSTALLER_JSON=$(wget -q -O - ${QUILT_INSTALLER_URL} )
local INSTALLER_VERSION=$(echo "$INSTALLER_JSON" | jq -r '.[0].version // empty')
local INSTALLER_URL=$(echo "$INSTALLER_JSON" | jq -r '.[0].url // empty')
if [[ -z "${INSTALLER_JSON}" ]]; then
echo -e "\tERROR: Failed to retrieve Quilt installer information from manifest!"
exit 1
fi
if [[ -z "${INSTALLER_VERSION}" ]]; then
echo -e "\tERROR: No Quilt installer version found in manifest!"
exit 1
fi
if [[ -z "${INSTALLER_URL}" ]]; then
echo -e "\tERROR: No Quilt installer URL found in manifest!"
exit 1
fi
echo -e "\tDownloading Quilt Installer ${MC_VERSION}-${QUILT_VERSION} (${INSTALLER_VERSION}) from ${INSTALLER_URL}"
if ! wget -q -O quilt-installer.jar "${INSTALLER_URL}"; then
echo -e "\tERROR: Failed to download Quilt installer ${MC_VERSION}-${QUILT_VERSION} (${INSTALLER_VERSION})"
exit 1
fi
echo -e "\tInstalling Quilt Server ${MC_VERSION}-${QUILT_VERSION} (${INSTALLER_VERSION})"
if ! java -jar quilt-installer.jar install server "${MC_VERSION}" "${QUILT_VERSION}" --download-server --install-dir=./; then
echo -e "\tERROR: Failed to install Quilt Server ${MC_VERSION}-${QUILT_VERSION} (${INSTALLER_VERSION})"
exit 1
fi
echo "quilt-server-launch.jar" > ".serverjar"
rm quilt-installer.jar
}
install_required
if [[ -z "${PROJECT_ID}" ]]; then
echo "ERROR: You must specify a PROJECT_ID environment variable!"
exit 1
fi
if [[ ! "${PROJECT_ID}" = "zip" ]]; then
get_download
unpack_zip
else
unpack_zip
fi
if [[ -f "${SERVER_DIR}/modrinth.index.json" ]]; then
echo "Found modrinth.index.json, installing mods"
json_download_mods
json_download_overrides
fi
if [[ -f "${SERVER_DIR}/modrinth.index.json" ]]; then
MANIFEST="${SERVER_DIR}/modrinth.index.json"
if [[ $(jq -r '.dependencies.forge' "${MANIFEST}") != "null" ]]; then
json_download_forge
fi
if [[ $(jq -r '.dependencies."fabric-loader"' "${MANIFEST}") != "null" ]]; then
json_download_fabric
fi
if [[ $(jq -r '.dependencies."quilt-loader"' "${MANIFEST}") != "null" ]]; then
json_download_quilt
fi
fi
echo -e "\nInstall completed succesfully, enjoy!"