How to Create a Minecraft Server
Your own server gives you full control over the world and the game rules. It is an opportunity to play with friends without paying monthly…
Your own server gives you full control over the world and the game rules. It is an opportunity to play with friends without paying monthly subscriptions, install any modifications, create mini-games or technical builds. The server runs as a separate program on your computer: it handles the game logic, and players' clients connect to it. The setup process consists of choosing a core, basic configuration of the config files, and opening access to the network.
Choosing a Server Core
The core type determines the server's functionality. You cannot install Forge mods on Paper, or plugins on Vanilla.
Core type | Support | What it suits |
Vanilla | Datapacks only | Pure survival, speedruns. The worst optimization. |
Paper | Plugins (Bukkit/Spigot/Paper) | Public servers, survival with friends, mini-games. Excellent optimization. |
Purpur | Plugins (Paper) + its own config | Like Paper, but with fine-tuning of mechanics (for example, allowing players to ride bees). |
Fabric | Mods (Fabric) | Technical servers (Carpet mod), vanilla+ builds, optimization (Lithium). |
NeoForge / Forge | Mods (Forge/NeoForge) | Heavy modpacks with new dimensions, machinery, magic. |
For 90% of private servers without large global mods, Paper is the optimal choice. It does not require installing mods on players' clients (everything works from the vanilla client), supports plugins for land protection, and runs faster than the official core.
⚠️ Important: Hybrid cores (Arclight, Mohist), which support both mods and plugins at the same time, often break mod mechanics and cause instability. Choose one or the other: either plugins or mods.
System Requirements and Preparation
The server consumes RAM and processor resources. The graphics card is irrelevant for a server — world generation runs exclusively on the CPU.
For 2–5 players (Paper):
RAM: 2–3 GB of allocated memory.
CPU: any modern processor with 4 cores or more.
For 10+ players or heavy modpacks (NeoForge):
RAM: 6–8 GB of allocated memory.
CPU: high single-core performance.
Installing Java
Minecraft 1.21+ requires Java 21 (versions 26.1+ require Java 26). The server does not use the Java built into the client; it must be installed on the system separately.
Download JDK 21 (or JDK 26) from the official Oracle website.
Install it, making sure to enable the “Add to PATH” option in the installer.
Check it in the terminal: java -version. It should output version 21.0.x.
Basic Installation and Launch
Example installation for the Paper core:
Step 1. Downloading the core
Go to the official papermc.io website, choose the game version (for example, 26.1) and download the file. Create an empty folder for the server and move the file there. Rename it to server.jar for convenience.
Step 2. Creating a launch file
The server does not start with a double click. You need to allocate memory to it via a script.
Create a text document start.txt in the server folder,
open it and paste the code:
DOS
java -Xmx4G -Xms4G -jar server.jar nogui
pause
The -Xmx4G parameter sets the maximum RAM limit (4 GB). -Xms4G is the starting amount. Save the file and change its extension from .txt to .bat (for Windows).
On Linux/macOS, create start.sh and add #!/bin/bash as the first line.
Step 3. Accepting the EULA
Run start.bat. The console will open for a few seconds and close. Open the new file eula.txt. Change the line eula=false to eula=true. This is the official agreement to the developers' license terms.
Step 4. Full launch
Run start.bat again. The server will generate the world and the configuration files. The message Done! will appear in the console. Stop the server exclusively with the stop command in the console, otherwise the world may become corrupted.
Configuring server.properties
The server.properties file contains the main server settings. To open it, right-click (RMB) on the file and select “Open with…”, then choose “Notepad” or any other text editor.\
Below is a table with the default server.properties settings and a description of each parameter:
Parameter | Value | Description |
accepts-transfers | FALSE | Determines whether this server accepts transfers of players from other servers. |
allow-flight | FALSE | Allows or forbids flying on the server in survival mode (if a player uses third-party modifications). When false, the server will kick such players. |
broadcast-console-to-ops | TRUE | If enabled, the results of console command execution will be sent to the chat of all server operators (administrators). |
broadcast-rcon-to-ops | TRUE | The same as the previous one, but for commands sent via remote access (RCON). |
bug-report-link | (empty) | A link that will be shown to players on screen when they are disconnected from the server due to an error or crash. |
debug | FALSE | Enables debug mode for extended error logging. |
difficulty | easy | The difficulty level on the server (peaceful, easy, normal, hard). |
enable-code-of-conduct | FALSE | Whether to require players to agree to the Microsoft Code of Conduct when connecting. |
enable-jmx-monitoring | FALSE | Allows the use of JMX (Java Management Extensions) for monitoring server performance. |
enable-query | FALSE | Enables the GameSpy4 protocol (Query), which allows third-party monitoring sites to obtain information about the server (online count, plugins). |
enable-rcon | FALSE | Enables remote access to the server console (RCON) for management without direct access to the machine's terminal. |
enable-status | TRUE | Allows the server to be shown as "online" in the game client's server list. |
enforce-secure-profile | TRUE | Requires players to have signed Mojang profile public keys (protection against forging chat messages). |
enforce-whitelist | FALSE | If true, the server will forcibly kick players who are not on the whitelist when this list is activated. |
entity-broadcast-range-percentage | 100 | Controls the range (as a percentage) at which the server sends the client data about entities (mobs, other players, items). |
force-gamemode | FALSE | Forcibly sets players to the default game mode every time they connect to the server. |
function-permission-level | 2 | The permission level (from 1 to 4) for functions executed through datapacks. |
gamemode | survival | The default game mode (survival, creative, adventure, spectator). |
generate-structures | TRUE | Determines whether structures will be generated in the world (villages, dungeons, temples, etc.). |
generator-settings | {} | Special settings for the world generator (usually used for custom worlds). |
hardcore | FALSE | "Hardcore" mode. If true, after death the player switches to spectator mode permanently. |
hide-online-players | FALSE | If true, hides the list of active players' nicknames in the multiplayer menu. |
initial-disabled-packs | (empty) | A list of datapacks that will be disabled when a new world is created. |
initial-enabled-packs | vanilla | A list of datapacks enabled by default (the base "vanilla" game). |
level-name | world | The name of the folder in which your world's files are stored. |
level-seed | (empty) | The seed (numeric seed) for world generation. If empty, a random one is generated. |
level-type | minecraft\:normal | The world generation type (normal, flat, large_biomes, amplified - mountainous). |
log-ips | TRUE | Determines whether players' IP addresses will be recorded in the server log files. |
management-server-* | (various) | A group of parameters (ports, keys, settings) for external server management tools (rarely used). |
max-chained-neighbor-updates | 1000000 | The limit of chained block updates (for example, during a TNT explosion or complex redstone circuits) to prevent the server from freezing. |
max-players | 20 | The maximum number of players who can be on the server at the same time. |
max-tick-time | 60000 | The maximum time (in milliseconds) to execute a single "tick". If the server "thinks" longer than this time, it will automatically shut down (protection against a "dead" freeze). |
max-world-size | 29999984 | The maximum radius of the world border (in blocks). |
motd | A Minecraft Server | Message Of The Day. The description/name of the server that players see in the server list. |
network-compression-threshold | 256 | The minimum packet size (in bytes) after which the server will start compressing it to save internet traffic. |
online-mode | TRUE | A very important parameter. If true — it only lets in players with a licensed game. If false — it allows players with "pirate" launchers to join. |
op-permission-level | 4 | The default operator permission level (1-4, where 4 gives access to all commands, including stop). |
pause-when-empty-seconds | -1 | The idle time (in seconds) after which the server puts the world "on pause" if there are no players (-1 means disabled). |
player-idle-timeout | 0 | The time (in minutes) after which an inactive (AFK) player is automatically kicked. 0 — disabled. |
prevent-proxy-connections | FALSE | Forbids connections from players who use a VPN or proxy (works in conjunction with the Mojang authentication system). |
query.port | 25565 | The port for the Query protocol (if it is enabled by the enable-query parameter). |
rate-limit | 0 | The maximum number of packets from the client to the server. Used to protect against packet spam (0 — disabled). |
rcon.password | (empty) | The password for remote access to the server console (must be filled in if enable-rcon=true). |
rcon.port | 25575 | The port for the RCON connection. |
region-file-compression | deflate | The compression algorithm for world files (regions). deflate is the standard and most common one. |
require-resource-pack | FALSE | If true, a player cannot join the server until they agree to download the server resource pack. |
resource-pack | (empty) | A direct link (URL) to the .zip archive of the server resource pack, which will be offered to players. |
resource-pack-id | (empty) | A unique identifier of the resource pack (UUID). |
resource-pack-prompt | (empty) | The message a player will see when offered to download the resource pack (for example: "Please download the pack for a better game"). |
resource-pack-sha1 | (empty) | The SHA-1 hash of the resource pack archive. Needed so that the client does not download the pack again if it has not changed. |
server-ip | (empty) | The IP address to "bind" the server to. It is usually left empty so that the server works on all of the machine's network interfaces. |
server-port | 25565 | The main server port through which players will connect. |
simulation-distance | 10 | The radius (in chunks) around the player within which the world is simulated (plants grow, mobs move, machinery works). |
spawn-protection | 16 | The protection radius of the spawn zone (in blocks). In this zone, regular players cannot break or place blocks. |
status-heartbeat-interval | 0 | The interval for sending extended server status data (usually not used). |
sync-chunk-writes | TRUE | Makes chunk saving to disk synchronous (more reliable for avoiding world data loss during crashes, but may slow the server down slightly). |
text-filtering-config | (empty) | Settings for a third-party system for filtering profanity in chat. |
text-filtering-version | 0 | The API version for the text filtering system. |
use-native-transport | TRUE | Allows the server to use the system's optimized network libraries (for example, epoll for Linux), which improves network performance. |
view-distance | 10 | The render distance (in chunks) sent by the server to the client (which the player's view distance relies on). |
white-list | FALSE | Enabling the "whitelist". If true, only players whose nicknames are added to this list (with the command /whitelist add <nick>) will be able to join the server. |
⚠️ Important: If you set online-mode=false, any player can join under the administrator's nickname. Be sure to install an authorization plugin (for example, AuthMe Reloaded) for protection.
How to Install Plugins
Plugins extend the server's capabilities without the need for players to install mods. They only work on Paper, Purpur and Spigot.
Download the plugin in .jar format.
Place the file in the plugins folder inside the server.
Restart the server (stop -> start.bat).
A folder with the plugin's configs will appear in the plugins folder, where its settings are edited (usually in the config.yml file).
How to Install Mods
To play with mods, you need the Fabric or NeoForge core. All players must have an identical set of mods in their client.
For Fabric:
Download the installer from fabricmc.net.
Run it, select the "Server" tab, specify the game version and an empty folder. Click "Install".
Launch the downloaded fabric-server-launch.jar via start.bat.
Drop mods into the generated mods folder. For Fabric, the Fabric API mod is mandatory.
For NeoForge:
Download the installer from neoforged.net.
Run it, select "Install server" and specify the folder.
After installation, run the run.bat file (the installer creates it itself).
Place the server mods in the mods folder.
Client-side mods (minimaps, shaders, rendering optimization like Sodium) must not be installed on the server — they cause the core to crash on startup.
How to Let Players onto the Server
Method 1: Port Forwarding
The best method with the lowest ping. It requires access to the router.
Go to the router settings panel (192.168.1.1 in the browser).
Find the "Port Forwarding" or "NAT" section.
Create a rule: port 25565, protocol TCP/UDP, local IP — your computer's address (find it via ipconfig).
Players connect using your external IP address (the 2ip.ua website).
Method 2: Tunnels (Playit.gg)
If your provider blocks ports.
Download the program from playit.gg.
Run it together with the server. It will open a page in the browser.
Register, and the service will issue a public address (for example, auto-bridge.playit.gg).
Players enter this address in the game.
Method 3: Radmin VPN
Install Radmin VPN on all computers.
Create a network and give your friends its name.
They join the network.
Players connect using your PC's IP address shown in Radmin VPN.
Technical Details / How It Works Inside
The Minecraft server is a single-threaded application. The main game cycle (tick loop), which handles mob movement, physics and machinery, runs exclusively on one processor core.
The game tries to perform 20 ticks per second (TPS - Ticks Per Second). 50 milliseconds are allotted for one tick. If the calculations take more time, the TPS drops and players experience delays. This is exactly why the clock speed of a single core is more important for the server than the total number of cores.
Multithreading in cores like Paper is used only for asynchronous loading of chunks from disk and network processing, but the game logic itself remains on a single thread.
Basic Administrator Commands
Entered in the server console (without /).
Action | Command |
Grant operator rights | op [nick] |
Revoke rights | deop [nick] |
Enable the whitelist | whitelist on |
Add to the whitelist | whitelist add [nick] |
Kick a player | kick [nick] [reason] |
Ban a player | ban [nick] [reason] |
Save the world manually | save-all |
Hosting as an Alternative
If your home computer is weak, the server can be rented.
Type | Examples | Advantages | Limitations |
Free | Aternos, FalixNodes | No payment needed | Launch queues, lag under load, the server shuts down without players. |
Budget paid | PebbleHost, Bloom.host | From $1 per GB, 24/7 operation | You need to pay monthly. |
VDS/VPS | Hetzner, Oracle | Full control over the machine | Requires Linux administration skills. |
Common Mistakes and How to Avoid Them
Error 1: FAILED TO BIND TO PORT. The server does not start because port 25565 is already taken. This often happens when two start.bat files are launched. Open the task manager and close all Java(TM) Platform SE binary processes.
Error 2: UnsupportedClassVersionError. The Java version is outdated. For 1.20.5+ you need Java 21, and for 1.16.5 — Java 11.
Error 3: Lag during fast flight. The server cannot generate new chunks in time. Install the Chunky plugin and pre-generate the world within a radius of 5000 blocks.
Error 4: A Fabric/Forge server crash on startup. A client-side mod (minimap, Sodium) got into the mods folder. The server has no graphical interface and crashes when trying to load them.
Error 5: An Invalid session error when connecting. The player is using a pirate launcher while online-mode=true is enabled. Change the value to false in server.properties.
Conclusion
Your own server based on Paper is the optimal choice for private survival with friends, since it provides excellent performance and allows you to add plugins without changing the game client. For large builds with new mechanics, you will have to use Fabric or NeoForge, which require synchronizing mods between the server and players. The main challenge in setting up a home server is the correct opening of ports, but using services like Playit.gg solves the problem of the provider's closed ports. If your home PC's performance is not enough, switching to inexpensive paid hosting guarantees stable 24/7 access.
No comments yet. Be the first to share your thoughts.