How to self-host a Minecraft server on Linux with Paper
A practical step-by-step guide to running a Minecraft Java server on Linux with Paper, including setup, updates, backups, and the operational work that starts after launch.
If you want full control over your hardware, plugins, backups, and update timing, self-hosting a Minecraft server still makes a lot of sense.
This guide walks through a clean Linux setup for one Minecraft Java server using Paper. It assumes a recent Debian or Ubuntu-style system and a basic comfort level with the terminal.
Quick answer
If you want the shortest path, do four things first: match Java to the Paper
build, run the server as a dedicated Linux user, manage it with systemd, and
open 25565/TCP in the right place. Most first-day setup failures come from
the wrong Java version, missing EULA acceptance, or firewall mistakes.
Pick your environment first
Choose this path if the server runs on a machine behind your own router.
You will usually need:
- a stable LAN IP for the server
- a router port forward for
25565/TCP - a host firewall rule if one is enabled
Choose this path if the server runs on rented cloud or dedicated infrastructure.
You will usually need:
- an inbound firewall or security-group rule for
25565/TCP - the service listening on the expected interface
- no consumer-router port forwarding at all
What a good first install looks like
Java matches Paper
You checked the exact Java version against the Paper build you chose.
The service restarts cleanly
You can start, stop, and restart the server with one predictable command.
Players can connect
The game port is reachable from the right network path for your setup.
Backups exist before updates
You can roll back world and plugin data before changing the server.
Why use Paper instead of the vanilla server
For most self-hosted Minecraft servers, Paper is the sensible default.
It is widely used, performs better than the vanilla server in most real-world cases, and gives you access to the plugin ecosystem used by a lot of admins. Paper also publishes clear getting-started docs and a version-to-Java compatibility matrix, which matters because Java requirements have changed recently.
As of April 27, 2026, Paper's own docs say:
- Minecraft
1.20through1.21.11use Java21 - newer
26.1+Paper builds use Java25
That means the first thing to verify is not RAM. It is the exact Java version your chosen Paper build needs.
What this guide covers
This guide is for one self-hosted Java server on Linux.
It covers:
- installing the correct Java runtime
- creating a dedicated Linux user
- downloading and starting Paper
- running the server with
systemd - opening the game port
- handling basic updates and backups
It does not cover:
- setting up a proxy network with Velocity
- running multiple nodes or multiple game types
- hosting a public control panel like Pterodactyl
Before you start
You need:
- a Linux machine or VPS with
sudoaccess - enough RAM and CPU for the player count you expect
- a reachable network path for players
- a Paper download URL for the exact Minecraft version you want
If this server will be public, also decide now whether it will live:
- on a home connection behind a router
- on a VPS with a cloud firewall or security group
That difference matters when you get to networking.
Set the server up
Install the right Java version
First, check whether Java is already installed:
java -versionIf you do not have the required version yet, install it with your package manager. For example, on a recent Debian or Ubuntu system:
sudo apt update
sudo apt install openjdk-21-jre-headlessThat package name is an example for servers running a Paper build that still
uses Java 21. If you are following Paper's newest branch, install the Java
version Paper currently documents for that branch instead.
Verify again:
java -versionCreate a dedicated server user
Do not run your Minecraft server as your normal login user or as root.
Create a dedicated system user and a home directory for server files:
sudo useradd \
--system \
--home /srv/minecraft \
--create-home \
--shell /usr/sbin/nologin \
minecraftCreate a place for the live server and backups:
sudo mkdir -p /srv/minecraft/server
sudo mkdir -p /srv/minecraft/backups
sudo chown -R minecraft:minecraft /srv/minecraftDownload Paper
Paper publishes runnable JARs from its downloads page. Copy the exact
download URL for your target version, then switch to the server user and place
the file in the server directory. Naming it paper.jar keeps later commands
simple:
sudo -u minecraft -H bash
cd /srv/minecraft/server
curl -Lo paper.jar "<paper-download-url>"You now have the server binary, but the rest of the server files do not exist yet. The first start creates them.
Run the server once and accept the EULA
Start the server once so Paper can generate the working directory:
cd /srv/minecraft/server
java -Xms2G -Xmx4G -jar paper.jar --noguiThe first run stops because the EULA has not been accepted yet. Edit
eula.txt and change eula=false to eula=true:
sed -i 's/^eula=false$/eula=true/' /srv/minecraft/server/eula.txtAt this point you also have server.properties, logs/, plugins/, and the
world folders on disk.
Create a start script
You can start the server with a long Java command every time, but it is cleaner to put that command in a script.
Create /srv/minecraft/server/start.sh with content like this:
#!/usr/bin/env bash
cd /srv/minecraft/server
exec java -Xms2G -Xmx4G -jar paper.jar --noguiThen make it executable:
chmod +x /srv/minecraft/server/start.shTwo quick notes here:
Xmxis the maximum heap the JVM can use- more RAM is not always the answer to lag, especially if your single-core CPU performance is weak
If you are hosting a small friends-only server, start conservatively and increase memory only when you have evidence that you need it.
Run the server with systemd
systemd is a better long-term setup than manually keeping the process alive
in a shell window.
Create /etc/systemd/system/minecraft.service:
[Unit]
Description=Minecraft Paper Server
After=network.target
[Service]
User=minecraft
Group=minecraft
WorkingDirectory=/srv/minecraft/server
ExecStart=/srv/minecraft/server/start.sh
Restart=on-failure
RestartSec=10
LimitNOFILE=65535
[Install]
WantedBy=multi-user.targetReload systemd, enable the service, and start it:
sudo systemctl daemon-reload
sudo systemctl enable --now minecraftUseful commands from here on:
sudo systemctl status minecraft
sudo journalctl -u minecraft -f
sudo systemctl restart minecraft
sudo systemctl stop minecraftOpen the game port
For Minecraft Java, the default server port is 25565/TCP unless you changed
it in server.properties.
If you use ufw, open that port:
sudo ufw allow 25565/tcpIf this server lives behind a home router, you also need to forward
25565/TCP from the router to the machine's local LAN IP.
If this server lives on a VPS, you usually do not need "port forwarding" at
all. You need an inbound firewall or security-group rule that allows
25565/TCP.
Set the basics in server.properties
Before inviting people, open server.properties and set the obvious items:
motddifficultygamemodemax-playersview-distancesimulation-distancewhite-list
Two defaults matter more than people think:
- Keep
online-mode=trueunless you fully understand the security tradeoff. - Turn the allow list on if this is meant to be a private server.
Install plugins carefully
Paper becomes much more useful once you add plugins, but plugin quality varies a lot.
A few practical rules:
- add one plugin at a time when the server is new
- keep a copy of the plugin JAR and its config before large changes
- restart only after you know what changed
- track your plugin versions alongside your Minecraft version
The messy part of Minecraft administration often starts here, not at the Java install step.
Back up the right things
At minimum, back up:
- the world folders
plugins/server.properties- any plugin-specific config that matters to your economy, permissions, or moderation flow
For a small server, a simple first pass is enough:
- stop the server cleanly
- archive
/srv/minecraft/server - copy the archive to another disk or object store
Do not treat "the disk is still there" as a backup strategy.
Update without making a mess
Paper updates are usually straightforward, but major Minecraft upgrades still deserve caution.
A safe update flow looks like this:
- Take a backup.
- Read the Paper and plugin changelogs for your target version.
- Replace
paper.jarwith the new build. - Start the server and watch the console closely.
- Check that plugins, permissions, and world loading all behave normally.
If you jump across major Minecraft versions, expect at least some plugin churn.
Common first-day mistakes
Check Java before you do anything else. A lot of "broken update" reports are really just version mismatches between the Paper build and the installed JVM.
Read logs/latest.log and journalctl first. The most common causes are a
missing EULA acceptance, a bad plugin, or a command path problem in your
systemd unit or start script.
That is usually a networking split, not a Paper problem. On a home server, check the router forward. On a VPS, check the cloud firewall and host firewall rules.
Where self-hosting gets harder
Most guides stop once the server is reachable. That is the easy part.
The ongoing work is what consumes time:
- reading logs when a plugin breaks after an update
- editing configs without losing context
- keeping track of who changed what
- updating plugins safely
- inspecting player issues without bouncing between SSH, FTP, and chat
- handing the server off to teammates without giving everyone raw shell access
That is the gap between "I can run a Minecraft server" and "I can operate this cleanly every week."
Where EnderDash fits
If you like self-hosting the game server but do not want to babysit a second public panel, that is where EnderDash is meant to fit.
The server stays on your infrastructure. You keep your host, your Linux box, your plugin stack, and your world data. EnderDash is the admin layer for the day-to-day work after launch: console, files, plugins, permissions, players, and shared operational context.
If you want to see that flow, start with:
Connect Your First Server
See what the post-launch operational layer looks like once the server is up.
Server Panels
Browse the surfaces EnderDash exposes for console, files, plugins, players, and more.
Recover an Offline Server
Use the docs flow when the agent or connectivity side is the actual problem.
Related articles
Minecraft server port forwarding not working? Check these things first
A practical troubleshooting guide for Minecraft Java server port forwarding problems, including LAN testing, firewalls, double NAT, CGNAT, and VPS-specific gotchas.
How to read Minecraft server crash reports
Learn how to work through Minecraft server crash reports, `latest.log`, and common failure patterns so you can find the real cause faster.
Pterodactyl vs EnderDash for Minecraft server management
Pterodactyl and EnderDash solve different parts of the Minecraft server problem. Here is where each one fits, what you maintain yourself, and which teams should choose which.