RE:NODE

All the Mods 10 server setup: files, Java 21 and RAM

By RE:NODE Team
14 min read


An All the Mods 10 server is the pack's ServerFiles zip, Java 21, and one start script. The current release at the time of writing, ATM10 8.2, is Minecraft 1.21.1 on NeoForge 21.1.251 with 464 mods in the server folder; the zip is about 1.2 GB and already contains the NeoForge installer. You unpack it, run startserver.sh, accept the EULA, and wait several minutes for the first start. Memory is set in user_jvm_args.txt, which ships with -Xms4G -Xmx8G. Treat 8 GB of heap as the floor for a small group and put it inside a container with at least 2 GB more than that. Most of the trouble comes from what the script does without telling you, and the rest of this guide goes through it.

The broader ATM picture (which packs exist, how chunk loading slows a server over months, updating safely) is in All the Mods server: ATM10 and ATM9 setup. General modpack handling, such as building a server from a client export, is in modpack servers from CurseForge or Modrinth. This post goes deeper on the ATM10 install itself: what each file does, what each script line does, and what to change.

Downloading the right server files#

ATM10 is published on CurseForge. Each release has the client pack as its main file and a separate server pack attached as an additional file, named ServerFiles-<version>.zip. For 8.2 that is ServerFiles-8.2.zip. On the pack's Files tab, open the release your players are on and look under Additional Files. Do not build a server from the client zip. The server files already have the client-only mods removed, and they come with the scripts and the JVM arguments file.

Match the version exactly. ATM10 has had dozens of releases since it launched (5.x, 6.x, 7.x and now 8.x), and the CurseForge app updates players' clients when a new one appears. A server on 8.1 with players on 8.2 will refuse them, or let them in and then fail on mismatched content. Write the version in your Discord and update server and players on the same day.

There are also spin-offs with their own server files. ATM10 Lite is a smaller pack, ATM10 To The Sky is a skyblock variant, and there is now an Aeronautics edition. Everything below applies to all of them, but the version numbers, mod counts and memory needs are different. Read the start script in whichever zip you download rather than assuming it matches this one.

What is in the 8.2 zip:

PathWhat it is
mods/464 jars, client-only mods already removed
config/, defaultconfigs/Pack configuration; defaultconfigs/ seeds per-world configs
kubejs/Recipe and loot changes the pack depends on
datapacks/Pack datapacks, copied into new worlds
neoforge-21.1.251-installer.jarThe loader installer, so no download is needed
startserver.sh, startserver.batInstall-and-run scripts for Linux and Windows
user_jvm_args.txtMemory and garbage collector flags
server-icon.pngThe icon shown in the server list

There is no eula.txt, no server.properties and no world. The first run creates all three.

NeoForge and Java 21#

Minecraft 1.21.1 needs Java 21, and the ATM10 script checks for it. It runs java -fullversion, takes the major version, and refuses to start below 21 with Minecraft 1.21 requires Java 21 - found Java 17. If Java is missing altogether you get Minecraft 1.21 requires Java 21 - Java not found. The check is -ge 21, so a newer Java passes it. NeoForge for 1.21.1 was built and tested against 21, though, and Java 21 is what you should run. On a machine with several Java installs, point the script at the right one with the ATM10_JAVA environment variable, set to the full path of the java binary.

The loader version is pinned in the first lines of the script:

startserver.sh (8.2)
NEOFORGE_VERSION=21.1.251# To use a specific Java runtime, set an environment variable named ATM10_JAVA# To disable automatic restarts, set an environment variable named ATM10_RESTART to false.# To install the pack without starting the server, set ATM10_INSTALL_ONLY to true.

Do not upgrade NeoForge on your own. Every ATM release pins a build. 8.1 to 8.2 moved from 21.1.249 to 21.1.251, and the pack was tested on that build. A newer build is usually fine, but when it is not, you get a crash that nobody else on that pack version has seen. NeoForge server setup explains the installer and the libraries/ layout it produces. For an ATM server, the rule is simple: run the build the script names.

What startserver.sh actually does#

The script is short. Reading it once explains most first-start problems. In order:

  1. It checks that Java exists.
  2. If there is no libraries/ folder, it installs NeoForge. It uses the bundled installer if present and downloads it from maven.neoforged.net otherwise, then runs java -jar neoforge-21.1.251-installer.jar -installServer.
  3. If there is no server.properties, it writes one with five lines: allow-flight=true, motd=All the Mods 10, max-tick-time=180000, simulation-distance=5 and view-distance=8.
  4. If ATM10_INSTALL_ONLY=true, it stops there.
  5. It checks that Java is at least 21.
  6. It starts the server in a loop. When the process exits, it waits 10 seconds and starts it again, unless ATM10_RESTART=false.
noyesrestart loopstartserver.shchecks Javalibraries/ present?skip install if yesNeoForge installer-installServerserver.propertieswritten if missingLaunch serverjava @argfiles noguiExitrestart after 10 s
What the ATM10 start script does on each run

The launch line is the part to understand:

bash
java @user_jvm_args.txt \  @libraries/net/neoforged/neoforge/21.1.251/unix_args.txt nogui

There is no server jar. The @ arguments are Java argument files. The first holds your memory and GC flags. The second, written by the installer, holds the classpath and main class for that exact NeoForge build. The version number is part of that path, and that causes the update problem covered under crashes below.

Three behaviours catch people out:

  • The defaults are written only once. If a server.properties already exists, for example from a host's default install or a previous server, the script leaves it alone. You do not get allow-flight=true or the 180-second watchdog, and the first jetpack flight kicks a player for flying. Add those lines yourself.
  • The restart loop does not care why the server stopped. On the very first run the server writes eula.txt with eula=false and exits, and the script restarts it every 10 seconds, forever, until you edit that file. Under a panel that has its own restart handling, the script's loop and the panel's can also fight. When a panel or systemd supervises the process, set ATM10_RESTART=false and let the supervisor do the restarting.
  • Under `set -eu` the script stops on errors, except the Java line, where the exit code is caught on purpose so the loop can continue. A crashing server therefore restarts quietly every 10 seconds. Read the log, not the uptime.

A clean first install on your own Linux machine looks like this:

bash
$ mkdir -p /srv/atm10 && cd /srv/atm10$ unzip ~/ServerFiles-8.2.zip$ chmod +x startserver.sh$ ATM10_INSTALL_ONLY=true ./startserver.sh   # install NeoForge, write properties$ echo "eula=true" > eula.txt                # after reading the EULA$ ATM10_RESTART=false ./startserver.sh

Installing first and accepting the EULA before the real start skips the restart loop, so the server goes straight to building the world.

user_jvm_args.txt, line by line#

ATM10 ships this file, comments trimmed:

user_jvm_args.txt
-Xms4G-Xmx8G-XX:+UseG1GC-XX:+ParallelRefProcEnabled-XX:MaxGCPauseMillis=200-XX:+UnlockExperimentalVMOptions-XX:+DisableExplicitGC-XX:+AlwaysPreTouch-XX:G1NewSizePercent=30-XX:G1MaxNewSizePercent=40-XX:G1HeapRegionSize=8M-XX:G1ReservePercent=20-XX:G1HeapWastePercent=5-XX:G1MixedGCCountTarget=4-XX:InitiatingHeapOccupancyPercent=15-XX:G1MixedGCLiveThresholdPercent=90-XX:G1RSetUpdatingPauseTimePercent=5-XX:SurvivorRatio=32-XX:+PerfDisableSharedMem-XX:MaxTenuringThreshold=1

These are the widely used G1 flags tuned for Minecraft, often called Aikar's flags. You only need to touch two lines.

  • `-Xmx` is the heap ceiling. It is the number that decides whether the pack fits. Raise it for more players or a mature world. Never set it to the whole memory of the machine or container.
  • `-Xms` is the starting heap. Combined with -XX:+AlwaysPreTouch, the JVM claims and touches all of -Xms at startup. With the shipped values, 4 GB is committed before a single mod loads. Setting -Xms equal to -Xmx is common and avoids resizing, but the full heap is then committed from the first second. Make sure the container really has that much plus overhead, or the server is killed during startup instead of an hour later.
  • Leave the G1 flags alone unless you are measuring. They are reasonable for a heap from 6 to 16 GB. If you go past 12 GB, some guides raise G1HeapRegionSize to 16M and the new-generation percentages, which is a tuning step and not a fix for lag. JVM flags and Java versions explains what each one changes.

There is one rule for where memory is set. If a panel or wrapper also passes -Xmx on the command line, two values compete, and the result depends on the order. Pick one place, usually this file, and remove the other.

RAM and CPU by player count#

The shipped -Xmx8G is what the pack's authors consider a working minimum, and that matches experience. Below 8 GB, ATM10 starts, but garbage collection runs constantly once players spread out, and the first busy evening ends in an out-of-memory crash. The container needs more than the heap, because Java also uses memory for metaspace (the classes of 464 mods), thread stacks, direct buffers and the JIT. On a pack this size that overhead is roughly 1.5 to 2.5 GB.

Players-Xmx in user_jvm_args.txtContainer or plan
1-3, fresh world8G10 GB
4-8, a few bases10G12-14 GB
8-15, mature world12G14-16 GB
15+ or heavy automation14G+16 GB+, and profile first

A few notes on the table:

  • Players cost less than worlds. A player standing still costs little. A player generating new terrain, or a base full of Mekanism and AE2 machines force-loaded around the clock, costs a lot. Four players with large factories can need more than ten who mostly explore pre-generated ground.
  • CPU is the other half. Minecraft's main tick is one thread, so per-core speed decides how much automation the server can carry before it drops below 20 TPS. Extra cores help chunk generation, garbage collection and networking. Plan on at least two fast cores and three or more for a busy server.
  • More heap is not always better. A 20 GB heap on a server that uses 9 GB only makes each full collection longer. Size from what spark reports, not from the size of the plan. How much RAM a Minecraft server needs covers how to read the numbers.

On RE:NODE, the Minecraft tiers that fit ATM10 are Pro at 10 GB and Premium at 14 GB, with 2.5 and 3.5 vCPU. Pro is right for a small group with -Xmx8G. Premium suits a busy server with -Xmx12G. The 2 to 6 GB tiers will not run this pack, and we would rather say so than sell one for it. If the container reaches its memory limit, the kernel stops it and the server restarts clean rather than swapping, so the headroom between -Xmx and the plan is the setting that matters most.

Installing on a panel#

On a hosted panel the steps are the same, but you run them through the file manager and console instead of a shell. RE:NODE's Minecraft line installs Paper with the matching Java version, the EULA accepted and a world generated. An ATM10 server replaces that install with your own upload. There is no modpack installer, and nothing on the panel reads a CurseForge pack.

  1. Take a backup of the default install, then stop the server.
  2. Delete the Paper files you do not need: the server jar, plugins/ and the generated world folders.
  3. Upload ServerFiles-8.2.zip through the file manager or SFTP and unpack it in place.
  4. Edit the existing server.properties and add allow-flight=true and max-tick-time=180000, because the script will not write them over an existing file.
  5. Set memory in user_jvm_args.txt so -Xmx sits 2 GB or more under the plan.
  6. Make sure the startup runs the ATM script, or the same java @user_jvm_args.txt @libraries/... line, with ATM10_RESTART=false so the panel controls restarts. If the Startup tab does not expose what you need, open a ticket and ask.
  7. Start the server and watch the console until Done.

SFTP and the file manager has the connection details. A 1.2 GB upload is more reliable over SFTP than through a browser on a slow line.

Pre-generating the world#

The ATM10 server files include spark and FTB Chunks, but not a pre-generator. Terrain in this pack is expensive, with extra ores, modded structures and several added dimensions. Players exploring on jetpacks or elytra generate chunks faster than one tick thread can handle, and everybody feels the stutter. Pre-generating moves that work to a time when nobody is online.

Chunky has a NeoForge build for 1.21.1 and runs on the server only, so players do not need it. Add the jar to mods/, restart, and run:

code
/chunky world minecraft:overworld/chunky center 0 0/chunky radius 4000/chunky start/chunky worldborder

/chunky pause and /chunky continue let you stop at the start of play and resume overnight. Progress survives a restart. On ATM10, a 4,000-block radius takes hours rather than minutes, and the region files grow by several gigabytes. Run it with nobody online and check free disk before you begin. Use tab completion on /chunky world to pre-generate the Nether, the End and whichever modded dimensions your players live in. Leave mining dimensions alone, since they are meant to be reset. World borders and pre-generation covers timing and file sizes in more detail.

Also check the item-clear setting. The pack ships Crash Utilities with item clear switched on in config/crashutilities-server.toml. Every 5 minutes, if more than 1,000 dropped items are loaded, it warns in chat and deletes them all. That keeps entity lag down. It also surprises players who lose a dropped stack, so tell them, or raise maximum if your group would rather keep the items.

Common crash causes and fixes#

The console stops mid-line with no crash report. The process was killed from outside, almost always for memory. -Xmx plus overhead went over the container limit, often during world generation or startup with a large -Xms. Lower the heap or move up a plan. A real Java out-of-memory error, by contrast, prints java.lang.OutOfMemoryError and usually writes a crash report.

`Error: could not open 'libraries/net/neoforged/neoforge/<version>/unix_args.txt'`. You updated the pack to a release with a newer NeoForge build. The script saw an existing libraries/ folder and skipped the installer, then tried to launch a build that is not installed. Run the installer by hand (java -jar neoforge-<version>-installer.jar -installServer), or delete libraries/ and run the script so it installs fresh.

`has been compiled by a more recent version of the Java Runtime (class file version 65.0)`. The server is running on Java 17 (class file version 61). Class version 65 is Java 21. Switch the runtime, or set ATM10_JAVA.

The server restarts every 10 seconds and nobody can join. Either eula.txt still says false, or the server crashes on start and the script's loop hides it. Scroll up to the first error after the restart message.

`Failed to bind to port` on start. Another process, often a second copy left running by a double restart loop, holds port 25565. Stop everything, confirm nothing is running, and start once. On a panel, use the port the plan assigns, not a value copied from a guide.

The watchdog kills the server during heavy generation. You see A single server tick took 60.00 seconds and a thread dump. max-tick-time is still at the vanilla 60000 because the script never wrote its default. Set 180000. Do not set -1, which lets a truly hung server hang forever.

The server crashes when someone enters one area. A block entity in that chunk crashes on every tick. The crash report names the block and its coordinates. Restore that region from a backup or remove the block. Chunk errors and world corruption covers the tools, and crash reports explained shows how to find the guilty mod in a stack trace.

Missing registry entries after an update. A release removed a mod, and the world still contains its blocks. NeoForge warns at load, and confirming deletes them permanently. Read the changelog before updating, and keep the backup from before the update until you are sure.

Take that backup somewhere other than the server's own disk. On RE:NODE, backup slots come with every plan, are stored off the machine, restore with one button, and can be locked so rotation does not delete the pre-update copy while you test. Backups that actually restore explains why you should test a restore before you need one.

FAQ#

What Java version does an All the Mods 10 server need?

Java 21. ATM10 is Minecraft 1.21.1, and the start script refuses to run on anything older. A newer Java passes the script's check, but the pack and NeoForge are tested on 21, so use 21.

Is 6 GB enough for an ATM10 server?

Not for real play. With a 6 GB container, the heap would have to sit near 4 GB once overhead is counted. The pack loads, but garbage collection takes over as soon as players explore. Use an 8 GB heap in a container of 10 GB or more.

Do I need to download NeoForge separately?

No. The 8.2 server files include the NeoForge installer, and the script runs it on the first start. Running it again is only needed when a pack update moves to a new NeoForge build.

Where do I change the server's RAM?

In user_jvm_args.txt: the -Xmx line for the ceiling and -Xms for the starting heap. If your panel also sets memory on the command line, use one or the other, not both.

Can I run the server without the restart loop?

Yes. Set the environment variable ATM10_RESTART=false, and the script exits when the server stops. Do this whenever a panel, systemd or another supervisor already restarts the server.

Can players join ATM10 To The Sky or ATM10 Lite on the same server?

No. Each is a different pack with its own server files and mod list. Players must run the same pack and the same version as the server.