
Paper is a high-performance Minecraft server implementation that extends Spigot with patches for improved tick performance, configurable gameplay mechanics, and an expanded plugin API. It remains compatible with Bukkit and Spigot plugins while correcting mechanics inconsistencies present in the vanilla server.
This article explains how to deploy Paper on an Ubuntu 20.04 server. It covers installing the Eclipse Temurin Java runtime from the Adoptium package repository, downloading a verified Paper build through the PaperMC Fill API, running the server under a dedicated system account managed by systemd, and opening the required firewall port.
Ubuntu 20.04 LTS reached the end of its standard five-year support window on 31 May 2025. It no longer receives security updates through the normal channels, so a server running it accumulates unpatched kernel and package vulnerabilities and is not suitable for a host exposed to the public internet.
Before you begin, you need to:
Paper requires Java 25 or later starting with Minecraft 26.1. Eclipse Temurin provides supported OpenJDK builds through the Adoptium package repository at packages.adoptium.net.
Update the package index.
Install the packages required to fetch the repository key and query the Paper API.
Create the keyring directory.
Download the Adoptium signing key and convert it to a binary keyring.
Grant read access to the keyring so that APT can verify the repository.
Add the Adoptium repository and bind it to the keyring.
The awk expression resolves the release codename from /etc/os-release, which returns focal on Ubuntu 20.04. The signed-by option scopes the key to this repository alone, unlike the deprecated apt-key add command, which trusted a key across every configured repository.
Refresh the package index to include the new repository.
Install Temurin 25.
Verify the installed runtime.
The output confirms a Temurin LTS build:
Running a public-facing game server under a dedicated unprivileged account limits the damage a compromised plugin or exploit can cause. The account requires no login shell because systemd starts the process directly.
Create a system user with a home directory and no interactive shell.
Create the server directory and assign ownership to the new account.
PaperMC distributes builds through the Fill API at fill.papermc.io. The previous api.papermc.io/v2 endpoint now returns HTTP 410 Gone and cannot supply builds. Every Fill response includes a SHA-256 checksum, which lets you confirm the download before running it.
Query the API for the current version identifier.
Display the resolved version.
The output shows the newest release, such as 26.2.
Fetch the metadata for the latest build of that version.
Extract the download URL and its checksum.
In the above command:
PAPER_URL: The signed object URL on fill-data.papermc.io that serves the server JAR.PAPER_SHA: The SHA-256 digest published alongside the build.Download the server JAR.
Verify the download against the published checksum.
The output reports OK. Stop and download the file again if the check reports a mismatch.
Transfer ownership of the JAR to the service account.
Mojang requires explicit acceptance of the Minecraft End User License Agreement before a server accepts connections. The first launch writes a template eula.txt and exits without binding a port.
Run the server once to generate the configuration files.
The server writes its default files and exits with a notice:
Open the generated agreement file.
Change the eula value to true after reading the agreement.
Save and close the file.
A systemd unit starts Paper at boot, restarts it after a crash, and routes its console output to the journal. Stopping the unit sends SIGINT, which Paper traps to save every loaded world before exiting.
Create the unit file.
Add the following configuration:
Save and close the file.
ExecStart: Launches Paper with the G1 garbage collector tuned for a fixed heap. Match -Xms and -Xmx to each other, and leave at least 2 GB of system memory outside the heap for the operating system and Java metadata.KillSignal=SIGINT: Delivers the interrupt that Paper handles as a graceful shutdown, saving all dimensions before the process exits.SuccessExitStatus=0 130 143: Treats the exit codes produced by SIGINT (130) and SIGTERM (143) as clean. Without 130, a normal systemctl stop leaves the unit in a failed state.Restart=on-failure: Recovers the server after a crash, but leaves it stopped after a deliberate systemctl stop.ProtectSystem=full: Mounts /usr and /boot read-only for the service, restricting writes to the server directory.Reload the systemd manager configuration.
Enable the service to start at boot.
Start the service.
Confirm the service is running.
Verify that the output reports Active: active (running).
Follow the startup log until the server reports readiness.
World generation on a new server takes roughly 20 to 45 seconds:
Press Ctrl + C to stop following the log. The server keeps running.
Paper listens on TCP port 25565. Ubuntu ships with ufw inactive, so enable it and permit both SSH and the game port before locking the host down.
Allow SSH so that enabling the firewall does not end your session.
Allow Minecraft client traffic.
Enable the firewall.
The command warns that it may disrupt existing SSH connections and asks for confirmation. Enter y to proceed. The preceding rule keeps your session open.
Review the active rules.
The output lists both services:
Confirm that Paper holds the port locally and answers connections from outside the instance.
Verify that the Java process is listening.
The output shows the listening socket owned by java:
Test the port from your local machine, replacing SERVER-IP with your instance's public IP address.
Open the Minecraft Java Edition client, select Multiplayer, click Add Server, and enter your instance's public IP address in the Server Address field.
The server binds port 25565 only after the log prints Done. A connection attempt during world generation fails even though the service is already active.
The service exposes standard systemd controls, and the journal retains the full server console history.
Stop the server, allowing it to save all worlds.
Restart the server after changing a configuration file.
Review recent console output.
To issue in-game commands from a terminal, enable RCON by setting enable-rcon=true, rcon.password, and rcon.port in /opt/minecraft/paper/server.properties, then restart the service. Restrict the RCON port to trusted addresses in ufw, because the protocol transmits its password without encryption.
You have successfully deployed Paper on your Ubuntu 20.04 server using the supported Adoptium repository for Java, a checksum-verified build from the PaperMC Fill API, and a systemd service that runs the server under a dedicated account. Adjust gameplay settings in server.properties, tune Paper-specific behavior in config/paper-global.yml, and add plugins to the plugins directory before restarting the service. For more information, visit the official Paper documentation.
0 Comments
Be the first to comment and share your perspective with the community.