{“content”:”---\nname: minecraft-modpack-server\ndescription: Set up a modded Minecraft server from a CurseForge/Modrinth server pack zip. Covers NeoForge/Forge install, Java version, JVM tuning, firewall, LAN config, backups, and launch scripts.\ntags: [minecraft, gaming, server, neoforge, forge, modpack]\n---\n\n# Minecraft Modpack Server Setup\n\n## When to use\n- User wants to set up a modded Minecraft server from a server pack zip\n- User needs help with NeoForge/Forge server configuration\n- User asks about Minecraft server performance tuning or backups\n\n## Gather User Preferences First\nBefore starting setup, ask the user for:\n- Server name / MOTD — what should it say in the server list?\n- Seed — specific seed or random?\n- Difficulty — peaceful / easy / normal / hard?\n- Gamemode — survival / creative / adventure?\n- Online mode — true (Mojang auth, legit accounts) or false (LAN/cracked friendly)?\n- Player count — how many players expected? (affects RAM & view distance tuning)\n- RAM allocation — or let agent decide based on mod count & available RAM?\n- View distance / simulation distance — or let agent pick based on player count & hardware?\n- PvP — on or off?\n- Whitelist — open server or whitelist only?\n- Backups — want automated backups? How often?\n\nUse sensible defaults if the user doesn’t care, but always ask before generating the config.\n\n## Steps\n\n### 1. Download & Inspect the Pack\nbash\nmkdir -p ~/minecraft-server\ncd ~/minecraft-server\nwget -O serverpack.zip \"<URL>\"\nunzip -o serverpack.zip -d server\nls server/\n\nLook for: startserver.sh, installer jar (neoforge/forge), user_jvm_args.txt, mods/ folder.\nCheck the script to determine: mod loader type, version, and required Java version.\n\n### 2. Install Java\n- Minecraft 1.21+ → Java 21: sudo apt install openjdk-21-jre-headless\n- Minecraft 1.18-1.20 → Java 17: sudo apt install openjdk-17-jre-headless\n- Minecraft 1.16 and below → Java 8: sudo apt install openjdk-8-jre-headless\n- Verify: java -version\n\n### 3. Install the Mod Loader\nMost server packs include an install script. Use the INSTALL_ONLY env var to install without launching:\nbash\ncd ~/minecraft-server/server\nATM10_INSTALL_ONLY=true bash startserver.sh\n# Or for generic Forge packs:\n# java -jar forge-*-installer.jar --installServer\n\nThis downloads libraries, patches the server jar, etc.\n\n### 4. Accept EULA\nbash\necho \"eula=true\" > ~/minecraft-server/server/eula.txt\n\n\n### 5. Configure server.properties\nKey settings for modded/LAN:\nproperties\nmotd=\\u00a7b\\u00a7lServer Name \\u00a7r\\u00a78| \\u00a7aModpack Name\nserver-port=25565\nonline-mode=true # false for LAN without Mojang auth\nenforce-secure-profile=true # match online-mode\ndifficulty=hard # most modpacks balance around hard\nallow-flight=true # REQUIRED for modded (flying mounts/items)\nspawn-protection=0 # let everyone build at spawn\nmax-tick-time=180000 # modded needs longer tick timeout\nenable-command-block=true\n\n\nPerformance settings (scale to hardware):\nproperties\n# 2 players, beefy machine:\nview-distance=16\nsimulation-distance=10\n\n# 4-6 players, moderate machine:\nview-distance=10\nsimulation-distance=6\n\n# 8+ players or weaker hardware:\nview-distance=8\nsimulation-distance=4\n\n\n### 6. Tune JVM Args (user_jvm_args.txt)\nScale RAM to player count and mod count. Rule of thumb for modded:\n- 100-200 mods: 6-12GB\n- 200-350+ mods: 12-24GB\n- Leave at least 8GB free for the OS/other tasks\n\n\n-Xms12G\n-Xmx24G\n-XX:+UseG1GC\n-XX:+ParallelRefProcEnabled\n-XX:MaxGCPauseMillis=200\n-XX:+UnlockExperimentalVMOptions\n-XX:+DisableExplicitGC\n-XX:+AlwaysPreTouch\n-XX:G1NewSizePercent=30\n-XX:G1MaxNewSizePercent=40\n-XX:G1HeapRegionSize=8M\n-XX:G1ReservePercent=20\n-XX:G1HeapWastePercent=5\n-XX:G1MixedGCCountTarget=4\n-XX:InitiatingHeapOccupancyPercent=15\n-XX:G1MixedGCLiveThresholdPercent=90\n-XX:G1RSetUpdatingPauseTimePercent=5\n-XX:SurvivorRatio=32\n-XX:+PerfDisableSharedMem\n-XX:MaxTenuringThreshold=1\n\n\n### 7. Open Firewall\nbash\nsudo ufw allow 25565/tcp comment \"Minecraft Server\"\n\nCheck with: sudo ufw status | grep 25565\n\n### 8. Create Launch Script\nbash\ncat > ~/start-minecraft.sh << 'EOF'\n#!/bin/bash\ncd ~/minecraft-server/server\njava @user_jvm_args.txt @libraries/net/neoforged/neoforge/<VERSION>/unix_args.txt nogui\nEOF\nchmod +x ~/start-minecraft.sh\n\nNote: For Forge (not NeoForge), the args file path differs. Check startserver.sh for the exact path.\n\n### 9. Set Up Automated Backups\nCreate backup script:\nbash\ncat > ~/minecraft-server/backup.sh << 'SCRIPT'\n#!/bin/bash\nSERVER_DIR=\"$HOME/minecraft-server/server\"\nBACKUP_DIR=\"$HOME/minecraft-server/backups\"\nWORLD_DIR=\"$SERVER_DIR/world\"\nMAX_BACKUPS=24\nmkdir -p \"$BACKUP_DIR\"\n[ ! -d \"$WORLD_DIR\" ] && echo \"[BACKUP] No world folder\" && exit 0\nTIMESTAMP=$(date +%Y-%m-%d_%H-%M-%S)\nBACKUP_FILE=\"$BACKUP_DIR/world_${TIMESTAMP}.tar.gz\"\necho \"[BACKUP] Starting at $(date)\"\ntar -czf \"$BACKUP_FILE\" -C \"$SERVER_DIR\" world\nSIZE=$(du -h \"$BACKUP_FILE\" | cut -f1)\necho \"[BACKUP] Saved: $BACKUP_FILE ($SIZE)\"\nBACKUP_COUNT=$(ls -1t \"$BACKUP_DIR\"/world_*.tar.gz 2>/dev/null | wc -l)\nif [ \"$BACKUP_COUNT\" -gt \"$MAX_BACKUPS\" ]; then\n REMOVE=$((BACKUP_COUNT - MAX_BACKUPS))\n ls -1t \"$BACKUP_DIR\"/world_*.tar.gz | tail -n \"$REMOVE\" | xargs rm -f\n echo \"[BACKUP] Pruned $REMOVE old backup(s)\"\nfi\necho \"[BACKUP] Done at $(date)\"\nSCRIPT\nchmod +x ~/minecraft-server/backup.sh\n\n\nAdd hourly cron:\nbash\n(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 -\n\n\n## Pitfalls\n- ALWAYS set allow-flight=true for modded — mods with jetpacks/flight will kick players otherwise\n- max-tick-time=180000 or higher — modded servers often have long ticks during worldgen\n- First startup is SLOW (several minutes for big packs) — don’t panic\n- “Can’t keep up!” warnings on first launch are normal, settles after initial chunk gen\n- If online-mode=false, set enforce-secure-profile=false too or clients get rejected\n- The pack’s startserver.sh often has an auto-restart loop — make a clean launch script without it\n- Delete the world/ folder to regenerate with a new seed\n- Some packs have env vars to control behavior (e.g., ATM10 uses ATM10_JAVA, ATM10_RESTART, ATM10_INSTALL_ONLY)\n\n## Verification\n- pgrep -fa neoforge or pgrep -fa minecraft to check if running\n- Check logs: tail -f ~/minecraft-server/server/logs/latest.log\n- Look for “Done (Xs)!” in the log = server is ready\n- Test connection: player adds server IP in Multiplayer\n”}