Hosting Guides

Deploying Heavy Forge Modpacks via Pterodactyl

9 min readDebian 12PterodactylJava
Once your server is online, jump to the Minecraft (Java Edition) command and config reference.

Pterodactyl ships with a generic vanilla Minecraft egg, which is the wrong starting point for heavy Forge modpacks (All The Mods, Create Astral, RLCraft variants). Forge needs a different startup jar layout, much more memory than the egg's defaults, and SFTP access for the multi gigabyte mod folder. This guide swaps the egg, raises the container memory ceiling, and walks through pushing modpacks to the daemon without exceeding the panel's web upload limits.

Prerequisites

  • A Debian 12 host running Pterodactyl Panel and Wings, with at least 16 GB of host RAM.
  • Admin access to the panel UI and SSH access to the Wings node.
  • An SFTP client (FileZilla, Cyberduck, or the command line sftp).

Step 1: Import the Forge Egg

The pterodactyl/yolks community maintains a Forge specific egg with the correct startup script and Java 17 image. Download it from the panel's nest browser and import via Admin, Nests, Import Egg.

user@panel
wget -O /tmp/egg-forge.json \
https://raw.githubusercontent.com/pelican-eggs/games-minecraft/master/java/forge/egg-forge.json
# Then in the panel: Admin > Nests > Minecraft > Import Egg

Step 2: Create the Server

  • Nest: Minecraft. Egg: Forge.
  • Memory limit: 8192 MB minimum for medium packs, 12288 MB for heavy packs.
  • CPU limit: 200 (two cores) at minimum.
  • Disk: 15 GB or more.

Step 3: Push the Modpack via SFTP

Web uploads choke past 500 MB. SFTP is the correct path. Connect to the Wings daemon on port 2022 using your panel credentials.

user@laptop
sftp -P 2022 panel-username.server-uuid@your-wings-host
sftp> cd mods
sftp> put -r /local/path/to/modpack/mods/*
sftp> cd ../config
sftp> put -r /local/path/to/modpack/config/*

Step 4: Override the Container Memory Ceiling

Forge will silently exceed the egg's default Xmx flag if the modpack registers too many entities. Override the startup variable so the JVM uses the full container allocation, then add an OS swap guard so the daemon does not double allocate.

Startup Variables
JAVA_VERSION=17
MINECRAFT_VERSION=1.20.1
FORGE_VERSION=47.2.0
SERVER_JARFILE=forge-server.jar
# Tell the wrapper to use almost the entire container allocation.
# Leave 1 GB headroom for Mojang offheap buffers.
SERVER_MEMORY=11264
root@wings
# On the Wings host, prevent Docker from over committing memory
echo 'vm.overcommit_memory=2' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

Step 5: First Boot and Mod Validation

server console
# Watch for these critical lines:
# [main/INFO] [net.minecraftforge.fml.loading.LoadingModList/LOADING]: Loading X mods
# [main/INFO] [minecraft/MinecraftServer]: Done (NN.NNNs)! For help, type "help"

Performance and Tuning

  • Switch to -XX:+UseG1GC with MaxGCPauseMillis=200 via the egg's JVM flag variable for sustained TPS.
  • Enable view-distance=8 in server.properties, never higher with heavy mods.
  • Disable mods that register thousands of recipes (JEI plugins, recipe expansion) if startup exceeds 5 minutes.

Conclusion

Pterodactyl handles Forge cleanly once the egg, container memory ceiling, and SFTP workflow are in place. Treat the panel as orchestration, treat SFTP as the file transport, and Forge modpacks become as reliable as vanilla.