Egg Repository

Pterodactyl Community Egg Repository

NeoForge

NeoForge Server. NeoForge is a modding API (Application Programming Interface), which makes it easier to create mods, and also make sure mods are compatible with each other. NeoForge is a fork of Minecraft Forge.

Read Me

NeoForge 🦊

This is a generic egg for the NeoForge standalone server.

NeoForge is a fork of Minecraft Forge for versions 1.20.1 or newer. The install script is based on the official Forge install script.

The egg supports downloading NeoForge for the latest or a specified Minecraft version, as well as downloading a specific NeoForge version.

Server Ports

The Minecraft server requires a single port for access (default 25565), but plugins may require extra ports to enabled for the server.

PortDefault
Minecraft25565
Yolks
NameTag
Java 17ghcr.io/ptero-eggs/yolks:java_17
java 21ghcr.io/ptero-eggs/yolks:java_21
java 22ghcr.io/ptero-eggs/yolks:java_22
Variables
NameDescriptionEnvironment VariableDefault ValueUser ViewableUser Editable
Minecraft VersionThe version of Minecraft you want to install for. Leaving latest will install the latest version.MC_VERSIONlatestYesYes
NeoForge VersionThe full exact version. Ex. 20.4.194 https://projects.neoforged.net/neoforged/neoforge If it fails to download the server files it will fail to install.NEOFORGE_VERSIONYesYes
Install Script
#!/bin/bash
# NeoForge Installation Script
#
# Server Files: /mnt/server

apt-get update
apt-get install -y curl xq openjdk-17-jdk

if [[ ! -d /mnt/server ]]; then
    mkdir /mnt/server
fi

cd /mnt/server

# Remove spaces from the version number to avoid issues with curl
NEOFORGE_VERSION="$(echo "$NEOFORGE_VERSION" | tr -d ' ')"
MC_VERSION="$(echo "$MC_VERSION" | tr -d ' ')"

# If we have a specific NeoForge version set, use that
if [[ ! -z ${NEOFORGE_VERSION} ]]; then
  if [[ "${NEOFORGE_VERSION}" =~ "1.20.1-" ]]; then
    ARTIFACT_NAME="forge"
  else
    ARTIFACT_NAME="neoforge"
  fi

  BASE_URL="https://maven.neoforged.net/releases/net/neoforged/${ARTIFACT_NAME}/${NEOFORGE_VERSION}/"
  echo "Fetching file list from: ${BASE_URL}"
  FILE_LIST=$(curl -s "${BASE_URL}" | grep -oP 'href="[^"]+"' | cut -d'"' -f2)

  INSTALLER_JAR=$(echo "$FILE_LIST" | grep -E "${ARTIFACT_NAME}-${NEOFORGE_VERSION}.*installer.*\.jar$" | head -n1)
  if [[ -z "$INSTALLER_JAR" ]]; then
    INSTALLER_JAR=$(echo "$FILE_LIST" | grep -E "${ARTIFACT_NAME}-${NEOFORGE_VERSION}.*universal.*\.jar$" | head -n1)
  fi
  if [[ -z "$INSTALLER_JAR" ]]; then
    echo "Could not find a valid JAR file for NeoForge version ${NEOFORGE_VERSION}."
    exit 1
  fi

  echo "Downloading ${INSTALLER_JAR}..."
  curl -o "${INSTALLER_JAR}" "${BASE_URL}${INSTALLER_JAR}"
else
  if [[ "${MC_VERSION}" == "1.20.1" ]]; then
    XML_DATA=$(curl -sSL https://maven.neoforged.net/releases/net/neoforged/forge/maven-metadata.xml)
    ARTIFACT_NAME="forge"
    NEOFORGE_OLD=1
  else
    XML_DATA=$(curl -sSL https://maven.neoforged.net/releases/net/neoforged/neoforge/maven-metadata.xml)
    ARTIFACT_NAME="neoforge"
  fi

  REPO_URL="https://maven.neoforged.net/releases/net/neoforged/${ARTIFACT_NAME}/"

  if [[ "${MC_VERSION}" == "latest" ]] || [[ "${MC_VERSION}" == "" ]]; then
    echo "Getting latest version of NeoForge."
    MC_VERSION="1.$(echo -e ${XML_DATA} | xq -x '/metadata/versioning/release' | cut -d'.' -f1-2)"
  fi

  echo "Minecraft version: ${MC_VERSION}"

  if [[ -z "${NEOFORGE_OLD}" ]]; then
    VERSION_KEY=$(echo -n ${MC_VERSION} | cut -d'.' -f2-)
  else
    VERSION_KEY="${MC_VERSION}-"
  fi

  NEOFORGE_VERSION=$(echo -e ${XML_DATA} | xq -x "(/metadata/versioning/versions/*[starts-with(text(), '${VERSION_KEY}')])" | tail -n1)
  if [[ -z "${NEOFORGE_VERSION}" ]]; then
    echo "The install failed, because there is no valid version of NeoForge for Minecraft version ${MC_VERSION}."
    exit 1
  fi

  BASE_URL="${REPO_URL}${NEOFORGE_VERSION}/"
  echo "Resolved NeoForge version: ${NEOFORGE_VERSION}"
  FILE_LIST=$(curl -s "${BASE_URL}" | grep -oP 'href="[^"]+"' | cut -d'"' -f2)

  INSTALLER_JAR=$(echo "$FILE_LIST" | grep -E "${ARTIFACT_NAME}-${NEOFORGE_VERSION}.*installer.*\.jar$" | head -n1)
  if [[ -z "$INSTALLER_JAR" ]]; then
    INSTALLER_JAR=$(echo "$FILE_LIST" | grep -E "${ARTIFACT_NAME}-${NEOFORGE_VERSION}.*universal.*\.jar$" | head -n1)
  fi
  if [[ -z "$INSTALLER_JAR" ]]; then
    echo "Could not find a valid JAR file for NeoForge version ${NEOFORGE_VERSION}."
    exit 1
  fi

  echo "Downloading ${INSTALLER_JAR}..."
  curl -o "${INSTALLER_JAR}" "${BASE_URL}${INSTALLER_JAR}"
fi

# Clean previous install (for downgrade/upgrade support)
rm -rf libraries/net/neoforged/${ARTIFACT_NAME}


# Run the installer to generate startup arguments
echo "Running installer..."
java -jar "${INSTALLER_JAR}" --installServer

# Symlink unix_args.txt if it exists
if [[ -f "libraries/net/neoforged/${ARTIFACT_NAME}/${NEOFORGE_VERSION}/unix_args.txt" ]]; then
  ln -sf "libraries/net/neoforged/${ARTIFACT_NAME}/${NEOFORGE_VERSION}/unix_args.txt" unix_args.txt
fi

if [[ ! -f unix_args.txt ]]; then
  echo "Installer did not generate unix_args.txt. Installation failed."
  exit 1
fi

# Removal of unnecessary files
rm run.bat
rm run.sh

echo "Installation complete."