Host a Minecraft server with Pterodactyl

A complete walkthrough: rent a VM, install the Pterodactyl panel with its one-script installer, launch a Paper server, add plugins like BlueMap and Simple Voice Chat, and set up automated backups. No domain required, one hour start to finish.

Prerequisites

  • A ServersCamp account (registration guide)
  • An SSH key added to your account (the Create a VM wizard can generate one)
  • Any SSH client on your machine

Pick a size for your Minecraft server

Start from how many players and plugins you expect. Pterodactyl and the Java runtime eat a share of the machine themselves, so the game server never gets 100% of the box - the table already accounts for that.

Plan Specs Best for
hf-s 2 vCPU, 4 GB RAM 3-5 players and a few plugins. Give the game server itself no more than 2 GB.
hf-m 4 vCPU, 8 GB RAM The sweet spot. 10-15 players with 12-chunk render distance and 20+ plugins, BlueMap included.
hf-l 6 vCPU, 16 GB RAM Communities of 20-30 people that want a smooth BlueMap, shaders and a plugin-heavy economy.
hf-xl 8 vCPU, 32 GB RAM Large networks and multi-world setups.

This guide uses hf-m (4 vCPU / 8 GB): every number below (memory limits, CPU limits) assumes it. Scale them if you picked another size.

Create the VM

  1. In the Cloud Panel go to Virtual Machines and click Create VM
  2. OS: Ubuntu. We use the current LTS; the pterodactyl-installer README lists every supported version
  3. Hardware: High Frequency - Minecraft is single-thread bound, fast cores matter more than many cores
  4. Size: hf-m or whatever row of the table fits your community
Choosing the VM size for a Minecraft server in the ServersCamp Cloud Panel
Picking the hardware and size in the Create VM wizard
  1. Disk: 100 GB or more - a grown world, BlueMap renders and a stack of backups all live here. This guide assumes 160 GB. Disk speed can stay at the default
  2. Attach your SSH key and click Create

Connect and update

SSH to the VM's public IP (shown on the VM details page; see Connect to your VM) and bring the packages up to date:

sudo apt update && sudo apt upgrade -y
ServersCamp images usually ship with packages already at the latest versions, so this step tends to finish in seconds.

Install the Pterodactyl panel

Switch to root and run the community installer:

sudo su
bash <(curl -s https://pterodactyl-installer.se)

The script asks a series of questions. Here is the map:

  • What to install: option 2 - panel and Wings together
  • Database: press Enter for database name and username, set your own password
  • Timezone: yours, in tz format, for example Europe/Berlin
  • Email for Let's Encrypt: any address - this walkthrough runs without a domain, so it is not used
  • Admin profile: email, username, first and last name, password. The email and username are your panel login - remember them
  • FQDN: the VM's public IP. The script warns that no SSL certificate will be requested for a bare IP - accept
  • UFW rules: yes, let it configure the firewall
  • Answer the telemetry question, confirm with y, and let it install

When the panel part finishes, the script moves on to Wings (the daemon that actually runs game servers):

  • Let it configure UFW rules for Wings
  • Let it configure the database user automatically
  • Say no to exposing MySQL publicly - a single-box setup does not need it
  • Set the database password when prompted
  • Say no to HTTPS via Let's Encrypt (no domain, remember)

Open http://your_server_ip in a browser and log in with the admin credentials you just created. The login page may show a captcha - that is the panel's built-in bot protection.

Pterodactyl panel login page
The Pterodactyl login page on the VM's public IP

Configure the panel: location and node

Pterodactyl was designed to manage fleets, so it has a Location → Node → Servers hierarchy. Even a single-box setup needs one of each. Click Admin (top left) to open the admin area.

1. Create a location

Under Management → Locations click Create New and enter any short code, for example lvl0. Locations only group nodes; with one server the name does not matter.

2. Create the node

Go to Nodes → Create New and fill in:

  • Name: Default Node
  • Location: lvl0
  • Node Visibility: public
  • FQDN: the VM's public IP
  • Communicate over SSL: Use HTTP Connection
  • Behind Proxy: Not Behind Proxy
  • Total Memory: 8192, Memory Over-allocation: 0
  • Total Disk Space: 160000, Disk Over-allocation: 0
  • Daemon Port: 8080, Daemon SFTP Port: 2022

Zero over-allocation means the panel will refuse to create a second server past the machine's real capacity - a useful guard on a single box. Click Create Node.

Creating a Wings node in the Pterodactyl admin panel
Node configuration for a single-box setup

3. Allocate ports

After the node is created you land on its allocations page. Under Assign New Allocations enter:

  • IP Address: 0.0.0.0
  • Ports: 25565 - the Minecraft default. Add 8100 for BlueMap and 25545 for Simple Voice Chat now if you plan to run them

Click Submit.

Connect Wings to the panel

Open the node's Configuration tab and click Generate Token. Copy the generated command into your SSH session and run it - it writes the Wings config for this panel.

Two small config fixes remain. First, the panel talks to Wings from the browser, and a bare-IP setup needs the origin allowed explicitly:

nano /etc/pterodactyl/config.yml

Find allowed_origins: [] and change it to (with your real IP):

allowed_origins:
  - http://your_server_ip

Save with Ctrl+S, exit with Ctrl+X. Second, game servers run in Docker containers, and UFW blocks forwarded traffic by default:

sudo nano /etc/default/ufw

Change DEFAULT_FORWARD_POLICY="DROP" to "ACCEPT", save, then sudo ufw reload. Give the containers public DNS resolvers as well:

sudo nano /etc/docker/daemon.json
{
  "dns": ["8.8.8.8", "1.1.1.1"]
}

Restart everything and enable autostart:

systemctl restart wings
systemctl restart docker
systemctl enable docker
systemctl enable wings
ufw enable

Back in the panel, the node should now show a green heart: Wings is healthy and connected.

Create the Minecraft server

Admin area → ServersCreate New:

  • Server Name: anything, for example MinecraftServer
  • Server Owner: start typing your admin username and pick it
  • Node: Default Node
  • Default Allocation: 0.0.0.0:25565
  • Additional Allocations: the plugin ports, if you created them
  • Backup Limit: 5 - covered in the backups section below
  • CPU Limit: 400% - all four cores
  • Memory: 8192, Disk Space: 160000
  • Nest / Egg: Minecraft / Paper
  • Docker Image: Java 21

Startup command

The one number that matters here is the Java heap. The panel, Wings and the OS need room, so on an 8 GB machine cap the server at 4 GB:

java -Xms4000M -Xmx4000M -XX:+UseZGC -XX:+ZGenerational -Dterminal.jline=false -Dterminal.ansi=true -jar server.jar

4 GB of heap comfortably runs about 20 plugins with 10+ players online. In Service Variables set the Minecraft version you want (for example 1.21.5) and leave the rest at defaults - the egg downloads the matching Paper build as server.jar on its own. Click Create Server.

Open the server's console, accept the EULA prompt, and wait for the Done! line. That is it: add the VM's public IP as a server in your Minecraft client and join.

Pterodactyl console showing the Minecraft server Done message
The console after a successful first start

Add plugins: BlueMap, Simple Voice Chat

  1. Download the plugin from Modrinth or CurseForge, matching your server flavor and version (Paper 1.21.5 here)
  2. In the server's Files tab open the plugins folder and upload the jar
  3. If the plugin listens on its own port (BlueMap: 8100, Simple Voice Chat: 25545), add that port under the node's Allocations with IP 0.0.0.0
  4. Then attach it to the server: Build Configuration → Allocation Management → additional allocation, and save
  5. Restart the server from the console

BlueMap's live world map then appears at http://your_server_ip:8100/, and Simple Voice Chat works for every player in range.

Automated backups

One bad plugin update or one griefer is all it takes. Backups in Pterodactyl are scheduled per server, and the 160 GB disk fits 10+ backups of a small world or about 5 of a large one.

  1. Open the server's Schedules tab and click Create Schedule
  2. The timing uses cron syntax: minutes, hours, day of month, month, day of week. 30 23 * * * is every night at 23:30; 0 4 * * 1 is Mondays at 04:00
  3. Open the new schedule, click New Task, and pick Create backup as the action
Scheduling automated Minecraft server backups in Pterodactyl
A nightly backup schedule in the Schedules tab
BlueMap's rendered tiles can weigh as much as the world itself and are fully regenerable. Exclude them by putting bluemap/web/maps/tiles/** in the task's Ignored Files field - backups shrink dramatically.

Every so often, download a backup off the box too: Backups tab → the three dots next to a backup → Download. A copy on your own machine survives anything that happens to the server.

Optimization tips

  1. Pre-generate chunks. Chunk generation is the most expensive thing a Minecraft server does. Run the Chunky plugin overnight while nobody is online, and exploration stops costing TPS during play
  2. Tame the farms. If your players build heavy mob farms, FarmControl trims entity AI and keeps the tick budget sane
  3. Schedule BlueMap renders. On a 4 vCPU / 8 GB box, configure BlueMap to render only when the server is empty - players get their frames, the map gets rendered while they sleep. See the BlueMap performance guide

What's next?

Stuck anywhere? Open a ticket from the Cloud Panel - we are happy to help with game server setups.