Deploying Heavy Forge Modpacks via Pterodactyl
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.
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 EggStep 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.
sftp -P 2022 panel-username.server-uuid@your-wings-hostsftp> cd modssftp> put -r /local/path/to/modpack/mods/*sftp> cd ../configsftp> 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.
JAVA_VERSION=17MINECRAFT_VERSION=1.20.1FORGE_VERSION=47.2.0SERVER_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# On the Wings host, prevent Docker from over committing memoryecho 'vm.overcommit_memory=2' | sudo tee -a /etc/sysctl.confsudo sysctl -pStep 5: First Boot and Mod Validation
# 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:+UseG1GCwithMaxGCPauseMillis=200via the egg's JVM flag variable for sustained TPS. - Enable
view-distance=8inserver.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.