On this page
A Minecraft server is one long-running process you own on a machine you have root on. The first decision, Java Edition or Bedrock Edition, changes the software you download, the port you open, the extensions you can install, and who can join, so make it before anything else.
Java Edition or Bedrock Edition
These are two different games that happen to share a name. They do not run the same server software and they do not speak the same protocol.
Java Edition is the desktop version played on Windows, macOS, and Linux. The
server is a .jar file you run with a Java runtime. It has the large plugin and
mod ecosystem, and it listens on TCP 25565 by default.
Bedrock Edition is the version on consoles, phones, tablets, and the Microsoft Store build for Windows. The server is Bedrock Dedicated Server, a native Linux x86-64 binary from Mojang. It is extended with add-ons and scripts rather than plugins, and it listens on UDP 19132 by default.
What the choice changes downstream
| Java Edition | Bedrock Edition | |
|---|---|---|
| Server software | A .jar, run by a Java runtime | A native Linux binary |
| Default port | TCP 25565 | UDP 19132, plus 19133 for IPv6 |
| Extensions | Plugins (Bukkit API) or mods (Fabric, Forge) | Add-ons, behaviour packs, script API |
| Who can join | Desktop Java clients only | Console, mobile, and Windows Bedrock clients |
| Transport | TCP, so gameplay and the server list ping share one port | UDP, over RakNet |
Players cannot cross between the two on their own. A Java server can accept Bedrock clients if you run a protocol translator such as Geyser, which listens on its own UDP port and speaks Bedrock on one side and Java on the other. That is an extra moving part with its own port to open, not a setting you switch on.
Pick the edition your players are on. If most of them are on consoles or phones, Bedrock is not optional. If you want plugins, Java is not optional.
Choosing server software for Java
Vanilla is the reference implementation and everything else is a fork of it or a loader that sits on top of it.
| Software | What it is | Pick it when |
|---|---|---|
| Vanilla | Mojang's own server jar. No plugin API. | You want exact vanilla behaviour and no extensions, on a small private server. |
| Paper | A performance-focused fork in the CraftBukkit and Spigot line. Runs Bukkit API plugins, adds a large set of configurable behaviour and optimisations. | Almost any plugin server. This is the default choice. |
| Purpur | A fork of Paper that adds gameplay toggles and further options. Runs the same plugins as Paper. | You want Purpur's specific gameplay switches and accept that it tracks Paper, so its builds for a new Minecraft version arrive after Paper's. |
| Fabric | A lightweight mod loader. Mods, not plugins, and most need Fabric API installed alongside. | You are running a Fabric modpack, or you need mods that change the game itself. Fabric usually updates to a new Minecraft version quickly. |
| Forge and NeoForge | The heavyweight modding platforms. Most large modpacks target one of these. | Your players want a specific modpack. The pack tells you which loader and which version to use. |
| Velocity and BungeeCord | Proxies, not servers. They sit in front of several backend servers and move players between them. | You are running more than one server as one network. Velocity is the current one, BungeeCord is the older. |
Plugins and mods are not interchangeable, and this is the trap people fall into first. See Installing and managing Minecraft plugins for what loads where. Hybrid servers that claim to run both exist, but they lag behind on version updates and are supported by neither project, so treat them as a last resort rather than a way to avoid the decision.
What the server needs from a machine
Minecraft is unusual as a server workload, and reading a generic VPS spec sheet will lead you to the wrong choice.
Single-core speed matters more than core count
The world runs on one main thread. Every tick, that thread moves entities, runs redstone, checks block updates, spawns mobs, and fires plugin events, in order. The server aims for 20 ticks per second, which gives each tick a budget of 50 milliseconds. When a tick takes longer than that budget, the tick rate falls and players feel it as rubber-banding, delayed block breaking, and hoppers running slowly.
Adding cores does not make a single tick finish sooner. A faster core does. When you compare plans, the per-core clock speed and the generation of the processor matter more than the number of vCPUs.
Extra cores are not wasted. They carry chunk loading and generation, world saving, garbage collection, plugin tasks that run off the main thread, and any other server you run on the same box. They raise how much the machine can do around the tick, not how fast the tick itself completes.
RAM, and why more is not always better
The server keeps loaded chunks, entities, and everything your plugins hold in the Java heap. More players, a bigger view distance, and more plugins all need more heap.
Giving the Java process every gigabyte on the machine is a mistake, and a common one. The operating system needs memory left over, the Java runtime uses memory outside the heap you configure, and a very large heap takes longer to collect, which shows up as a pause in the middle of a tick. Heap sizing is the first section of Optimising a Minecraft server.
Disk
Worlds are stored as region files and chunk access is a lot of small reads and writes. Solid state storage, ideally NVMe, is what keeps chunk loading from becoming the thing that stalls a tick. Plan for the world to grow as players explore, and pregenerate it so that growth happens when you choose rather than while people are playing.
Network
Per player, Minecraft does not move much data. What players notice is latency and packet loss, not bandwidth, so the region you place the server in matters more than the port speed. Pick the location closest to the majority of your players.
Ports
| What | Protocol and port | Notes |
|---|---|---|
| Java gameplay | TCP 25565 | Set by server-port in server.properties. Gameplay and the server list ping both use it, so this is the only port Java players need. |
| Bedrock gameplay | UDP 19132 | Set by server-port in the Bedrock server.properties. server-portv6 defaults to 19133. |
| Query | UDP, same number as server-port unless you change query.port | Only exists when enable-query=true. Leave it off unless a monitoring tool needs it. |
| RCON | TCP 25575 | Only exists when enable-rcon=true. Do not expose it. See Protecting a Minecraft server from attacks. |
On a Clouduxe server the port is opened with an inbound rule, and there is a ready-made bundle for each edition. See Game presets and Port rules.
Related
Java, a dedicated user, Paper, and keeping it running under systemd.
Optimising a Minecraft serverHeap sizing, view distance, Paper config, and finding what is actually lagging.
Installing and managing Minecraft pluginsWhere jars go, matching versions, and reading a crash report.
Protecting a Minecraft server from attacksConnection floods, bot joins, and securing RCON.