Set Up a Modded Minecraft Server with Hermes Agent
Host modded Minecraft servers (CurseForge, Modrinth).
Written by Neura Market from the official Hermes Agent documentation for Minecraft Modpack Server. Commands, paths, and version numbers are reproduced from the source unchanged.
Read the official documentationThis guide walks through hosting a modded Minecraft server from a CurseForge or Modrinth server pack using Hermes Agent. It covers downloading the pack, installing the correct Java version, configuring the mod loader, tuning performance settings, and setting up automated backups. By the end, you will have a running server that friends can join.
What it does
Hermes Agent can automate the entire process of setting up a modded Minecraft server. It inspects the server pack to determine the mod loader (NeoForge or Forge) and required Java version, installs dependencies, configures server.properties and JVM arguments based on your hardware and expected player count, opens the firewall, creates a clean launch script, and schedules backups. This saves you from manually reading installer scripts and guessing performance settings.
Before you start
- A server pack ZIP from CurseForge or Modrinth. The pack must include a
startserver.shscript or an installer jar. - A Linux or macOS machine (the skill only supports these platforms).
sudoaccess to install Java and open firewall ports.- At least 8 GB of free RAM for the OS plus the server. Modded servers with 200+ mods need 12-24 GB.
wget,unzip, andcroninstalled. Most systems have these; if not, install them with your package manager.
Gather user preferences
Before running any commands, Hermes Agent asks for these settings. You can accept defaults for any you do not care about.
- Server name / MOTD, the message shown in the multiplayer server list.
- Seed, a specific world seed or random.
- Difficulty, peaceful, easy, normal, or hard.
- Gamemode, survival, creative, or adventure.
- Online mode, true for Mojang authentication (legit accounts only), false for LAN or cracked clients.
- Player count, expected concurrent players. Affects RAM and view distance.
- RAM allocation, how much RAM to give the server. If not specified, the agent picks based on mod count and available RAM.
- View distance / simulation distance, or let the agent choose based on player count and hardware.
- PvP, on or off.
- Whitelist, open server or whitelist only.
- Backups, whether to enable automated backups and how often.
Steps
1. Download and inspect the pack
mkdir -p ~/minecraft-server
cd ~/minecraft-server
wget -O serverpack.zip "<URL>"
unzip -o serverpack.zip -d server
ls server/
Look for: startserver.sh, installer jar (neoforge/forge), user_jvm_args.txt, mods/ folder. Check the script to determine: mod loader type, version, and required Java version.
2. Install Java
- Minecraft 1.21+ → Java 21:
sudo apt install openjdk-21-jre-headless - Minecraft 1.18-1.20 → Java 17:
sudo apt install openjdk-17-jre-headless - Minecraft 1.16 and below → Java 8:
sudo apt install openjdk-8-jre-headless - Verify:
java -version
3. Install the mod loader
Most server packs include an install script. Use the INSTALL_ONLY env var to install without launching:
cd ~/minecraft-server/server
ATM10_INSTALL_ONLY=true bash startserver.sh
# Or for generic Forge packs:
# java -jar forge-*-installer.jar --installServer
This downloads libraries, patches the server jar, etc.
4. Accept EULA
echo "eula=true" > ~/minecraft-server/server/eula.txt
5. Configure server.properties
Key settings for modded/LAN:
motd=\u00a7b\u00a7lServer Name \u00a7r\u00a78| \u00a7aModpack Name
server-port=25565
online-mode=true # false for LAN without Mojang auth
enforce-secure-profile=true # match online-mode
difficulty=hard # most modpacks balance around hard
allow-flight=true # REQUIRED for modded (flying mounts/items)
spawn-protection=0 # let everyone build at spawn
max-tick-time=180000 # modded needs longer tick timeout
enable-command-block=true
Performance settings (scale to hardware):
# 2 players, beefy machine:
view-distance=16
simulation-distance=10
# 4-6 players, moderate machine:
view-distance=10
simulation-distance=6
# 8+ players or weaker hardware:
view-distance=8
simulation-distance=4
6. Tune JVM args (user_jvm_args.txt)
Scale RAM to player count and mod count. Rule of thumb for modded:
- 100-200 mods: 6-12GB
- 200-350+ mods: 12-24GB
- Leave at least 8GB free for the OS/other tasks
-Xms12G
-Xmx24G
-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
7. Open firewall
sudo ufw allow 25565/tcp comment "Minecraft Server"
Check with: sudo ufw status | grep 25565
8. Create launch script
cat > ~/start-minecraft.sh << 'EOF'
#!/bin/bash
cd ~/minecraft-server/server
java @user_jvm_args.txt @libraries/net/neoforged/neoforge/<VERSION>/unix_args.txt nogui
EOF
chmod +x ~/start-minecraft.sh
Note: For Forge (not NeoForge), the args file path differs. Check startserver.sh for the exact path.
9. Set up automated backups
Create backup script:
cat > ~/minecraft-server/backup.sh << 'SCRIPT'
#!/bin/bash
SERVER_DIR="$HOME/minecraft-server/server"
BACKUP_DIR="$HOME/minecraft-server/backups"
WORLD_DIR="$SERVER_DIR/world"
MAX_BACKUPS=24
mkdir -p "$BACKUP_DIR"
[ ! -d "$WORLD_DIR" ] && echo "[BACKUP] No world folder" && exit 0
TIMESTAMP=$(date +%Y-%m-%d_%H-%M-%S)
BACKUP_FILE="$BACKUP_DIR/world_${TIMESTAMP}.tar.gz"
echo "[BACKUP] Starting at $(date)"
tar -czf "$BACKUP_FILE" -C "$SERVER_DIR" world
SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
echo "[BACKUP] Saved: $BACKUP_FILE ($SIZE)"
BACKUP_COUNT=$(ls -1t "$BACKUP_DIR"/world_*.tar.gz 2>/dev/null | wc -l)
if [ "$BACKUP_COUNT" -gt "$MAX_BACKUPS" ]; then
REMOVE=$((BACKUP_COUNT - MAX_BACKUPS))
ls -1t "$BACKUP_DIR"/world_*.tar.gz | tail -n "$REMOVE" | xargs rm -f
echo "[BACKUP] Pruned $REMOVE old backup(s)"
fi
echo "[BACKUP] Done at $(date)"
SCRIPT
chmod +x ~/minecraft-server/backup.sh
Add hourly cron:
(crontab -l 2>/dev/null | grep -v "minecraft/backup.sh"; echo "0 * * * * $HOME/minecraft-server/backup.sh >> $HOME/minecraft-server/backups/backup.log 2>&1") | crontab -
When not to use it
This skill is for server pack ZIPs that include a startserver.sh or installer jar. It does not cover vanilla servers, Bukkit/Spigot/Paper setups, or manually assembling a modpack from individual mod files. For those cases, use the standard Minecraft server skill.
Limits and gotchas
- Always set
allow-flight=truefor modded servers. Mods with jetpacks or flight items will kick players otherwise. - Set
max-tick-time=180000or higher. Modded servers often have long ticks during world generation. - First startup is slow (several minutes for big packs). Do not panic.
- "Can't keep up!" warnings on first launch are normal. They settle after initial chunk generation.
- If
online-mode=false, also setenforce-secure-profile=falseor clients get rejected. - The pack's
startserver.shoften has an auto-restart loop. Make a clean launch script without it. - Delete the
world/folder to regenerate with a new seed. - Some packs use environment variables to control behavior (e.g., ATM10 uses
ATM10_JAVA,ATM10_RESTART,ATM10_INSTALL_ONLY).
Verification
pgrep -fa neoforgeorpgrep -fa minecraftto check if running.- Check logs:
tail -f ~/minecraft-server/server/logs/latest.log - Look for "Done (Xs)!" in the log = server is ready.
- Test connection: player adds server IP in Multiplayer.
Related skills
- Minecraft Server, for vanilla or Bukkit/Spigot/Paper servers.
- Minecraft Bot, for adding an automated player or testing the server.