Game catalogue

Minecraft (NeoForge)

Minecraft Java Edition with the NeoForge mod loader. Put mods (.jar) into the mods folder (Files or SFTP), then restart. Choose a Minecraft version, or "latest".

Downloadinstall script
Architecturesany
Portsgame TCP 25565 · rcon TCP 25575
Recommended4096 MB memory + 64 MB per player · 3 cores · 10 GB disk
Player countminecraft
RCONsource
Version46a9eb2eed34

Settings

Template

minecraft-neoforge.yaml · import it in the panel or add it from the catalogue.

# Minecraft Java Edition with NeoForge, for mods. Installed with NeoForge's own installer.
id: minecraft-neoforge
name: Minecraft (NeoForge)
description: Minecraft Java Edition with the NeoForge mod loader. Put mods (.jar) into the mods folder (Files or SFTP), then restart. Choose a Minecraft version, or "latest".
images:
  - label: Java 25 (Minecraft 26.x and newer)
    image: registry.audifire.ch/hosting-panel/runtime-images/java:25
  - label: Java 21 (Minecraft 1.20.5 – 1.21)
    image: registry.audifire.ch/hosting-panel/runtime-images/java:21
  - label: Java 17 (Minecraft 1.18 – 1.20.4)
    image: registry.audifire.ch/hosting-panel/runtime-images/java:17
  - label: Java 8 (Minecraft 1.16 and older)
    image: registry.audifire.ch/hosting-panel/runtime-images/java:8
startupMode: shell
# NeoForge's launch arguments (the installed version is in .neoforge-version); exec: Java gets the stop signal
startup: >-
  exec java -Xms128M -Xmx{{SERVER_MEMORY}}M
  @libraries/net/neoforged/neoforge/$(cat .neoforge-version)/unix_args.txt nogui
stop:
  command: stop
  timeoutSeconds: 60
readyPattern: ")! For help, type"
ports:
  - role: game
    protocol: tcp
    default: 25565
  - role: rcon
    protocol: tcp
    default: 25575
    variable: RCON_PORT
# players, MOTD and version from the Server List Ping (as in the game's server list)
query:
  protocol: minecraft
# Source RCON for integrations (e.g. whitelists); on when an RCON password is set
rcon:
  protocol: source
  password: "{{env.RCON_PASSWORD}}"
# starting points for the limits when creating a server; memory grows with the player slots
resources:
  memoryMb: 4096
  memoryPerPlayerMb: 64
  playersVariable: MAX_PLAYERS
  cpuPercent: 300
  diskMb: 10240
variables:
  - key: RCON_PASSWORD
    name: RCON password
    description: Turns RCON on, for tools and integrations. Empty keeps it off.
    visibility: secret
    rules: nullable|string|max:64
  - key: MINECRAFT_VERSION
    name: Minecraft version
    description: '"latest", or a version like 1.21.1 or 26.3 (mods must be made for it). Reinstall to change it (worlds are kept).'
    default: latest
    rules: required|regex:/^(latest|[0-9]+(\.[0-9]+){1,2})$/
  - key: NEOFORGE_VERSION
    name: NeoForge version
    description: '"latest" (the newest stable NeoForge for the Minecraft version), or an exact one like 21.1.259.'
    default: latest
    visibility: admin
    rules: required|regex:/^(latest|[0-9][0-9.]*(-beta)?)$/
  - key: MAX_PLAYERS
    name: Max players
    default: "20"
    rules: required|integer|between:1,500
  - key: MOTD
    name: Server list description
    default: A Minecraft Server
    rules: required|string|max:59
configFiles:
  - path: server.properties
    parser: properties
    values:
      - key: server-port
        value: "{{server.build.default.port}}"
      - key: server-ip
        value: ""
      - key: max-players
        value: "{{env.MAX_PLAYERS}}"
      - key: motd
        value: "{{env.MOTD}}"
      - key: enable-rcon
        value: "true"
      - key: rcon.port
        value: "{{env.RCON_PORT}}"
      - key: rcon.password
        value: "{{env.RCON_PASSWORD}}"
      - key: enable-query
        value: "false"
prompts:
  - id: eula
    when: You need to agree to the EULA
    title: The server needs the Minecraft EULA accepted
    message: By accepting you agree to the Minecraft End User License Agreement.
    link:
      label: Minecraft EULA
      url: https://aka.ms/MinecraftEULA
    action: Accept and start
    writeFiles:
      - path: eula.txt
        content: "eula=true\n"
    then: start
install:
  # NeoForge's installer needs Java; the runtime image has it (and curl)
  image: registry.audifire.ch/hosting-panel/runtime-images/java:25
  entrypoint: bash
  script: |
    set -e
    cd /mnt/server
    meta=$(curl -fsSL https://maven.neoforged.net/releases/net/neoforged/neoforge/maven-metadata.xml)
    mc="${MINECRAFT_VERSION}"
    nf="${NEOFORGE_VERSION}"
    if [ "$nf" = "latest" ]; then
      if [ "$mc" = "latest" ]; then
        nf=$(echo "$meta" | grep -oE '<release>[^<]+' | sed 's/<release>//')
      else
        # NeoForge versions follow Minecraft's: 1.21.1 → 21.1.x, 26.3 → 26.3.0.x, 26.3.1 → 26.3.1.x
        case "$mc" in
          1.*) prefix="${mc#1.}." ;;
          *.*.*) prefix="$mc." ;;
          *) prefix="$mc.0." ;;
        esac
        versions=$(echo "$meta" | grep -oE '<version>[^<]+' | sed 's/<version>//' | awk -v p="$prefix" 'index($0, p) == 1')
        nf=$(echo "$versions" | grep -v -- '-beta' | sort -V | tail -1)
        if [ -z "$nf" ]; then
          nf=$(echo "$versions" | sort -V | tail -1)
          [ -n "$nf" ] && echo "No stable NeoForge for Minecraft $mc yet: using the beta $nf."
        fi
      fi
    fi
    if [ -z "$nf" ]; then echo "There is no NeoForge for Minecraft $mc."; exit 1; fi
    echo "Installing NeoForge $nf…"
    curl -fsSL -o neoforge-installer.jar "https://maven.neoforged.net/releases/net/neoforged/neoforge/$nf/neoforge-$nf-installer.jar"
    java -jar neoforge-installer.jar --installServer > neoforge-installer.out 2>&1 || { tail -20 neoforge-installer.out; exit 1; }
    rm -f neoforge-installer.jar neoforge-installer.jar.log neoforge-installer.out run.bat
    if [ ! -f "libraries/net/neoforged/neoforge/$nf/unix_args.txt" ]; then echo "The installer didn't set up NeoForge $nf."; exit 1; fi
    echo "$nf" > .neoforge-version
    mkdir -p mods
    [ -f server.properties ] || printf 'server-port=25565\n' > server.properties
    echo "NeoForge $nf installed. Put mods into the mods folder."