A Minecraft Java server is one file. You put server.jar in an empty folder, run it with a Java version that matches the Minecraft version, accept the EULA in the text file it writes, run it again, and you have a world listening on TCP port 25565. Everything else - the properties file, the permissions, the plugins, the backups - is refinement on top of those four steps. This guide does the four steps properly, then covers the decisions you will regret getting wrong later: which Java, which server software, how much memory, and how people actually reach the address.
If you are on a panel-based host, steps one to five are already done for you and you can skip to the sections on server.properties, ports and operators. The mechanics are worth reading anyway, because they explain every error message you are going to see.
What you are actually installing#
There is no "Minecraft server" product in the way there is a Valheim server or a Counter-Strike server. There are four things people mean:
- The vanilla server jar, published by Mojang for every version. It is the game's own server code, behaves exactly like single player, and has no plugin support at all.
- Paper, a fork of the vanilla server with the hot code paths rewritten and the Bukkit/Spigot plugin API attached. Several times faster with the same world and the same players, and it is what nearly every public server runs. A handful of exotic redstone and mob-farm behaviours differ from vanilla, deliberately and documented.
- Fabric, NeoForge or Forge, which are mod loaders. These change the game itself, so every player needs the same mods at the same versions. That is the dividing line worth understanding before you pick: plugins are server-side and players join with an unmodified launcher, mods are not.
- Bedrock's dedicated server, a completely separate program for the console and mobile editions. It does not read Java worlds, does not run Java plugins, and Java clients cannot join it. Crossplay in the other direction is possible with a translation layer - see Geyser and Floodgate for Bedrock crossplay.
For a first server that friends join by typing an address, run Paper. You get vanilla behaviour to within a few edge cases, room to add a permissions plugin and a map later, and the performance headroom that a 2 GB box needs. Paper, Fabric or vanilla is the longer version of that argument. The rest of this guide assumes Paper and notes where vanilla differs.
Pick the Java version first#
This is the single most common reason a brand-new server refuses to start. Minecraft's server is compiled against a specific Java release, and running it on anything older fails immediately with a class-file version error. Newer Java is usually fine; older never is.
| Minecraft version | Minimum Java | Notes |
|---|---|---|
| 1.8 - 1.16.5 | Java 8 | Java 11 works for most of this range |
| 1.17 - 1.17.1 | Java 16 | The one version that wants exactly 16 or newer |
| 1.18 - 1.20.4 | Java 17 | The long-lived plateau |
| 1.20.5 and newer | Java 21 | Including all of 1.21 |
Paper follows the same requirements as the Minecraft version it targets, and refuses to boot with a clear message if Java is too old. Check what you have before anything else:
$ java -versionopenjdk version "21.0.4" 2024-07-16 LTSGet Java from Eclipse Temurin at adoptium.net or Amazon Corretto. Take the JDK or the JRE - either runs a server - and take the long-term-support release (8, 11, 17, 21) rather than a short-lived one. On Debian or Ubuntu, apt install openjdk-21-jre-headless is enough; the headless package skips the graphics libraries a server will never use.
On RE:NODE the Java version is chosen to match the Minecraft version when the server is created, so this whole section is handled. If you later change the Minecraft version yourself, check the Startup tab - a 1.21 jar on a Java 17 image will not start.
Memory, CPU and disk#
A Minecraft server holds loaded chunks, entities and block entities in memory. Memory therefore scales with how much of the world is loaded at once, which is roughly player count multiplied by view distance, and barely at all with how large the world is on disk. A 40 GB world with three players online is cheap. A 2 GB world with thirty players spread across it is not.
| Players | Memory | CPU | Shape of server |
|---|---|---|---|
| 1-5 | 2 GB | 1 core | Paper, vanilla gameplay, view-distance=8 |
| 5-15 | 4 GB | 1.5 cores | A handful of plugins, a map, permissions |
| 15-30 | 6 GB | 2 cores | Public SMP, view-distance=6, pre-generated world |
| Modpack, 2-8 players | 6-8 GB | 2 cores | 100+ mods, most of the cost is mod initialisation |
| Large modpack, full server | 10-14 GB | 3+ cores | The point at which tuning beats buying |
Two things about that table matter more than the numbers.
The first is that Minecraft's main game loop is effectively single-threaded. Chunk loading, some world generation and network I/O run off the main thread on Paper, but the tick itself does not, so a fast core beats many slow ones. If the server is at 100% of one core and the memory graph is flat, more memory changes nothing. CPU vs RAM for game servers is the diagnostic.
The second is that more heap is not better. Java does not use memory it has not been asked for, and a larger heap makes each garbage collection pause longer rather than shorter. A twenty-player Paper server given 16 GB usually ticks no better than the same server given 6 GB with sensible flags, and pauses worse. How much RAM a Minecraft server needs has the by-player-count breakdown, and Minecraft JVM flags and Java versions covers heap sizing against a container limit, which is where people usually go wrong.
Disk is modest: the server files are around 200 MB for Paper plus whatever the jar downloads, and a world grows with explored area - 100 MB to a few gigabytes for a normal survival server. NVMe matters for one thing specifically, which is the autosave hitch every five minutes on a large world.
Install it: the jar, the EULA, the first start#
On your own machine, in an empty directory:
$ mkdir -p /srv/minecraft && cd /srv/minecraft$ wget -O server.jar "https://api.papermc.io/v2/projects/paper/versions/1.21.1/builds/132/downloads/paper-1.21.1-132.jar"$ java -Xms2G -Xmx2G -jar server.jar --noguiTake the exact build URL from papermc.io/downloads/paper rather than guessing a build number; the page gives you a direct link for the version you pick. For the vanilla jar, the download is on minecraft.net and the last argument is nogui without the dashes.
That first run does not start a server. It writes a file and quits:
[ServerMain/WARN]: Failed to load eula.txt[ServerMain/INFO]: You need to agree to the EULA in order to run the server.Go to eula.txt for more info.Open eula.txt and change the one line that matters:
#By changing the setting below to TRUE you are indicating your agreement to our EULA.eula=trueWhat you are agreeing to is Mojang's end user licence agreement, and the part that catches server owners is the commercial section: you may not charge for access to the game or sell anything that affects gameplay. Cosmetics and ranks that do not confer an advantage are the accepted line, and it is narrower than most donation stores assume. If money is going to be involved, read the EULA itself rather than a summary on a forum.
Now start it for real. Paper's jar is a patcher: on first run it downloads the matching vanilla server from Mojang, patches it, and caches the result, so the machine needs outbound internet access once. Vanilla's jar since 1.18 is a bundler that unpacks itself the same way. Either way you get a libraries/ and a versions/ folder that you should leave alone.
[Server thread/INFO]: Starting minecraft server version 1.21.1[Server thread/INFO]: Preparing level "world"[Server thread/INFO]: Preparing start region for dimension minecraft:overworld[Server thread/INFO]: Time elapsed: 6471 ms[Server thread/INFO]: Done (18.402s)! For help, type "help"Done is the line you are waiting for. World generation on a fresh server takes anywhere from fifteen seconds to two minutes depending on the disk and the spawn region size. Stop it with stop typed into the console, never by closing the window or killing the process - the world is written on autosave and on a clean stop, and a kill throws away everything since the last save.
On RE:NODE this step does not exist. Minecraft plans run Paper with the matching Java version, the EULA already accepted and the world already generated, so the server is up the first time you open the console. If you want a different jar - a Fabric or NeoForge server, a Paper fork, a modpack's own launcher - you upload it through the file manager or SFTP and point the Startup tab at it. There is no whitelist of allowed mods or plugins, and there is no one-click modpack installer either; you bring the files.
The files the server creates#
After the first successful start the directory looks like this, and knowing what each piece is saves you an hour later.
| Path | What it is |
|---|---|
server.properties | The main config. Read at startup only |
eula.txt | The line you just changed |
world/ | Overworld region files, level.dat, player data |
world/DIM-1, world/DIM1 | Nether and End, inside the same world folder |
ops.json | Operators, with a permission level each |
whitelist.json, banned-players.json, banned-ips.json | Access lists, by UUID |
usercache.json | Name to UUID cache. Safe to delete |
logs/latest.log, logs/*.log.gz | Current log, then one gzip per restart |
plugins/ | Paper only. One jar per plugin, config folders beside them |
bukkit.yml, spigot.yml | Paper's inherited Bukkit and Spigot config |
config/paper-global.yml | Paper's own settings, server-wide |
config/paper-world-defaults.yml | Paper's per-world settings, applied to all worlds |
libraries/, versions/, cache/ | Unpacked server code. Do not edit |
crash-reports/ | Written when the JVM dies badly |
Three notes on that list. Paper's settings moved out of a single paper.yml into the config/ folder in the 1.19 era, so any guide telling you to edit paper.yml is out of date. The Nether and the End live inside world/ on vanilla and Paper but in separate top-level folders on Spigot-era setups and on some hosts, which is the classic reason a world upload loses the Nether. And ops.json and whitelist.json are keyed by UUID, not name, which is why they survive a player renaming themselves and why they break entirely on an offline-mode server.
The whole of server.properties deserves its own read - there are more than sixty keys and about a dozen that change how the server feels. Every server.properties key explained goes through them with defaults.
Ports, addresses and getting people in#
| Port | Protocol | Purpose |
|---|---|---|
25565 | TCP | Game traffic and the server list ping |
25565 | UDP | Query protocol, only if enable-query=true |
25575 | TCP | RCON, only if enable-rcon=true |
Java Edition is TCP, and that is the whole story - unlike most survival games there is no separate UDP game port. Change it with server-port in server.properties if you must, and remember that players then have to type the port too, unless you use an SRV record.
There are three ways people connect:
- Direct address. Multiplayer, then Add Server, then
203.0.113.10if you are on the default port or203.0.113.10:25566if you are not. Always test this first; it removes DNS from the equation. - A domain. Point an
Arecord at the address and players typemc.example.com:25565. Covered in connecting a domain to a game server. - A domain with no port. An
SRVrecord at_minecraft._tcp.mc.example.comcarries the port, so players typemc.example.comand nothing else. This is the setup worth doing, and SRV records for Minecraft has the exact record.
Leave server-ip empty in server.properties so the server binds every interface. Filling it in with your public address is a popular piece of bad advice that breaks local connections and does nothing useful. Game server ports explained covers what a query port is for and why a server can be running but invisible.
RE:NODE Minecraft plans come with one port allocation, which is the game port; more can be added on the Network tab, and query and RCON allocations are included when you need them. If you do expose RCON, read RCON safely first - it is an unencrypted protocol with a single shared password.
Operators, permission levels and the whitelist#
An operator is a player listed in ops.json. The reliable way to create the first one is from the console, because the console is already level 4:
> op NotchMade Notch a server operator> deop NotchMade Notch no longer a server operatorops.json then holds a record per operator. The level field is the interesting one, because op is not a single switch:
[ { "uuid": "069a79f4-44e9-4726-a5be-fca90e38aaf5", "name": "Notch", "level": 4, "bypassesPlayerLimit": false }]| Level | What it grants |
|---|---|
| 1 | Bypass spawn protection. Nothing else |
| 2 | /gamemode, /give, /tp, /setblock, /summon, /effect, /difficulty, and command blocks |
| 3 | Level 2 plus /ban, /kick, /op, /deop, /whitelist |
| 4 | Everything, including /stop and /save-all |
op-permission-level in server.properties sets the level /op hands out, and it defaults to 4. On a server with more than two staff, drop it to 2 and give the people who need bans level 3 by editing the file. Better still, stop using op for staff roles at all and use a permissions plugin, which gives you per-command grants rather than four buckets - LuckPerms groups and permissions is the standard answer, and whitelists and permissions covers the trade-off.
The whitelist is the other thing to set up before you tell anyone the address:
> whitelist add Notch> whitelist on> whitelist reloadThat writes whitelist.json and flips white-list=true in server.properties. Two details catch people. Operators bypass the whitelist unless enforce-whitelist=true, and turning the whitelist on does not kick the people already connected until you run whitelist reload - or, on modern versions, enforce-whitelist does it at the next check.
Restarts, backups and updates#
A Minecraft server does not need a daily restart the way a modded one does, but three habits are worth building on day one.
Stop cleanly. /stop from the console, or the panel's Stop button, flushes the world to disk and exits. A kill, a host crash or hitting a memory limit loses everything since the last autosave, which is up to five minutes of play by default. /save-all flush forces a write immediately and is the right thing to run before any risky change.
Back up off the machine. The world is a folder of region files, and a corrupt level.dat or a mis-aimed delete takes the lot. A copy on the same disk is not a backup. RE:NODE includes backup slots on every Minecraft plan, stored off the machine they protect, restored with a button and lockable against rotation - and the Schedules tab will run a nightly one on a cron expression, with an ordered task list so you can save, back up and restart in sequence. Deleting a server deletes its backups, locked ones included, so keep a download of anything irreplaceable. Backups that actually restore makes the case for testing one before you need it.
Update deliberately. Paper publishes builds continuously; there is no reason to chase every one. Update when a version you care about is released, when a security fix is announced, or when a plugin needs it. A Minecraft version jump is a bigger event: worlds upgrade forwards and never backwards, plugins break against new Bukkit APIs, and a 1.20 world opened once by a 1.21 server cannot go back. Take a backup first, every time. Minecraft version upgrades is the checklist.
One more thing worth doing before people arrive: pre-generate the world out to your intended border. Chunk generation is the most expensive thing a server does, and generating it once in advance turns the first week's exploration lag into a one-off job. World borders and pre-generation covers the tooling, and the SMP launch checklist has the rest of the pre-launch list.
Errors you will actually see#
`FAILED TO BIND TO PORT!` followed by java.net.BindException: Address already in use. Something is already on 25565 - usually a copy of the server you thought you stopped. Find it and stop it, or change server-port.
`You need to agree to the EULA in order to run the server.` eula.txt still says false, or you edited a copy in a different folder.
`java.lang.OutOfMemoryError: Java heap space`. The heap is genuinely full. Raise -Xmx if there is room under the container or machine limit, and if there is not, find what is consuming it - usually a plugin holding chunks, or a view distance too high for the memory you bought. Note the difference between this and the container being stopped for exceeding its memory limit: the first is Java running out of the heap you gave it, the second is the kernel stopping the process. On RE:NODE the second case stops the container and restarts it clean rather than letting it swap, which is fast but does mean an unsaved world loses its last few minutes.
`Can't keep up! Is the server overloaded? Running 2140ms behind, skipping 42 tick(s)`. The server missed its tick budget badly. A one-off during world generation or an autosave is normal. Repeated, it is a performance problem - why TPS drops and what to do and the Paper optimisation guide between them cover the causes.
`Internal Exception: io.netty.handler.timeout.ReadTimeoutException` on the client. The server stopped answering for thirty seconds - a long garbage collection pause, a frozen tick, or a network problem between you and it.
`io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused` on the client. Nothing is listening on that address and port. The server is not running, the port is wrong, or a firewall is dropping it.
`Outdated server! I'm still on 1.21.1` or Outdated client!. Java Edition has no version tolerance: client and server must match exactly, to the patch. A proxy can hide this from players, nothing else can.
`Failed to verify username` or `Failed to login: Invalid session`. Mojang's authentication is unreachable or the player's session is stale. Have them restart the launcher. If it happens to everyone at once, it is not you.
The server starts, `Done` appears, nobody can join. Test the address from outside your own network. A server that works on the LAN and not from the internet is a firewall or a port-forward problem in nine cases out of ten, and reading the console will show you whether the connection attempt is even arriving.
FAQ#
Do I need to buy Minecraft to run a server?
The server software is free to download and run. Players need a licensed copy of Minecraft to join an online-mode=true server, because that check is what authentication does. You do not need an account on the machine running the server.
Can I run a server on my home PC?
Yes, and it is the cheapest way to test. The problems are all outside Minecraft: you need to forward 25565 to the machine, you need a router that does that at all (many mobile and fibre connections put you behind carrier-grade NAT, where it is impossible), your upload speed is shared with everyone in the house, and the world is only online while the PC is. It is fine for an evening with two friends and poor for anything that people expect to be there tomorrow.
How do I change the world seed or start a new world?
Set level-seed in server.properties and change level-name to a folder that does not exist yet, then restart. The old world stays on disk under its own name, so you can switch back by changing level-name again. Changing the seed without changing the name does nothing, because the seed is stored in level.dat once the world exists.
Why does my server show 20 players maximum when I have room for more?
max-players=20 is the default and it is only a number in server.properties. Raise it to what your memory and CPU can actually carry, which the table above estimates. Nothing enforces a slot count except that setting.
Vanilla or Paper for a small friends server?
Paper, unless you specifically need vanilla redstone behaviour. It runs the same world, players join with the normal launcher, and you can add a permissions plugin, a web map or a backup plugin later without migrating anything. Going from vanilla to Paper is a jar swap that keeps the world; going back is too.
What is the first plugin I should install?
A permissions plugin and a profiler, before anything fun. LuckPerms so staff roles are not four levels of op, and spark so that when the server stutters you can find out what did it instead of guessing. Minecraft plugins worth installing is the short list.




Comments
Completely anonymous: no account, no email, no cookie. We store the name you type, the text and the time - nothing else. Links are limited and markup is not rendered.