Gaming intermediate ⏱ 60 minutes

Pterodactyl: Professional Game Server Management

Open-source game server management panel. Docker-based with resource isolation and user management.

By homelabbing.io • 2025-12-17
#pterodactyl#game-servers#docker#management#panel

Introduction

Running game servers used to be a nightmare. Manually managing files, SSH-ing into servers at 3 AM to restart crashed services, editing configuration files in vim, explaining to your friends how to connect - the overhead was massive. What if you wanted to run multiple games? Multiply that complexity by every server you manage.

Enter Pterodactyl, the open-source game server management panel that’s revolutionizing how homelabbers and hosting companies alike run game servers. It’s the same software used by professional game hosting providers, and it’s completely free.

Here’s what makes Pterodactyl special: it doesn’t just run game servers - it provides a complete management ecosystem. Your players get their own web interfaces with file managers, console access, scheduling, databases, and backups. You get centralized management, user permissions, resource allocation, and a REST API for automation. All wrapped in a modern, beautiful interface.

Think of it as Proxmox for game servers. The learning curve is steeper than running a single Minecraft server in Docker, but the payoff is extraordinary. You can manage dozens of game servers across multiple physical machines, each with its own users, resource limits, and configurations - all from one control panel.

By the end of this guide, you’ll:

  • Understand Pterodactyl’s architecture (Panel + Wings)
  • Install and configure both components on your homelab
  • Deploy your first game server (Minecraft as example)
  • Configure user management and permissions
  • Set up automated backups and schedules
  • Optimize resource allocation across servers
  • Integrate with Docker and your existing infrastructure

Real-world context: Pterodactyl powers thousands of game servers worldwide. Hosting companies use it to manage customer servers. Discord community admins use it to run multiple game servers for their communities. Homelabbers use it because it’s professional-grade infrastructure you can run at home.

Let’s transform your homelab into a professional game hosting platform.


Prerequisites

Before diving in, ensure you have the appropriate foundation.

Hardware Requirements

Minimum Specifications:

  • CPU: 4 cores (8+ recommended for multiple game servers)
  • RAM: 8GB minimum (16GB+ recommended)
    • Panel: ~512MB
    • Wings (per node): ~256MB
    • Each game server: 1-8GB depending on game
  • Storage: 40GB+ free space, SSD strongly recommended for database performance
  • Network: 1Gbps Ethernet, low latency internet connection for players

Typical Homelab Setups:

  • Single Server: Panel + Wings on same machine (good for starting)
  • Dual Server: Panel on one VM, Wings on dedicated game server VM
  • Multi-Node: Panel on one VM, Wings on multiple game server nodes

Resource Planning Example:

8GB RAM homelab allocation:
- Pterodactyl Panel: 512MB
- Wings daemon: 256MB
- Minecraft server 1: 4GB
- Small Terraria server: 1GB
- Remaining for OS: 2.25GB

Software Prerequisites

Operating System Requirements:

  • Panel: Ubuntu 20.04+ or Debian 11+ (Ubuntu 22.04 recommended)
  • Wings: Ubuntu 20.04+ or Debian 11+ (can be separate machines)
  • Clean installation preferred (avoid installing on existing web servers)

Required Services:

  • Panel:
    • Nginx or Apache web server
    • MySQL 8+ or MariaDB 10.5+
    • PHP 8.1+ with extensions
    • Redis cache
    • Certbot for SSL (recommended)
  • Wings:
    • Docker Engine
    • Standalone daemon (no other web server required)

Important Notes:

  • Do NOT install Panel and another web application on the same machine unless you’re experienced with Nginx configuration
  • Wings must be able to run Docker containers without restrictions
  • Each Wings node needs its own public IP or proper port forwarding

Knowledge Assumptions

You should be comfortable with:

  • Linux command line operations
  • Basic web server concepts (virtual hosts, SSL)
  • Docker fundamentals (images, containers, volumes)
  • MySQL/MariaDB database basics
  • Understanding of DNS and port forwarding

Helpful but not required:

  • PHP application administration
  • Game server configuration
  • Nginx reverse proxy setup
  • Let’s Encrypt SSL certificates

Understanding Pterodactyl Architecture

Before installation, understanding Pterodactyl’s two-component architecture is crucial.

The Two Components

1. Pterodactyl Panel (The Control Center)

The Panel is the web-based interface - the brain of your operation:

┌─────────────────────────────────────────┐
│        Pterodactyl Panel                │
│   (Web Interface + Database)            │
├─────────────────────────────────────────┤
│  - User management & authentication     │
│  - Server allocation & configuration    │
│  - MySQL database (servers, users, etc) │
│  - Web UI for admins and users          │
│  - REST API for automation              │
│  - Billing integration (optional)       │
└─────────────────────────────────────────┘
         ↓ ↓ ↓ (API calls)
    ┌────────────────────────┐
    │   Wings Node 1         │
    │  (Game Server Host)    │
    └────────────────────────┘

What the Panel does:

  • Provides the web interface at https://panel.yourdomain.com
  • Stores all configuration in MySQL database
  • Handles user authentication and permissions
  • Manages server allocation across nodes
  • Provides file manager, console access, and schedules
  • Communicates with Wings nodes via API

What the Panel does NOT do:

  • Run game servers directly
  • Handle player connections
  • Use significant CPU/RAM during gameplay

2. Wings (The Worker Nodes)

Wings is the daemon that actually runs game servers:

┌─────────────────────────────────────────┐
│            Wings Daemon                 │
│         (Server Runner)                 │
├─────────────────────────────────────────┤
│  - Communicates with Panel via API      │
│  - Manages Docker containers            │
│  - Runs actual game servers             │
│  - Handles networking and storage       │
│  - Monitors resource usage              │
│  - Streams console logs to Panel        │
└─────────────────────────────────────────┘
         ↓ ↓ ↓ (Docker containers)
    ┌──────────┬──────────┬──────────┐
    │ Minecraft│ Terraria │ Valheim  │
    │  Server  │  Server  │  Server  │
    └──────────┴──────────┴──────────┘

What Wings does:

  • Runs as a systemd service on game server host(s)
  • Creates and manages Docker containers for each server
  • Exposes game server ports to players
  • Monitors server status and resource usage
  • Executes commands from Panel (start, stop, restart)
  • Streams console output back to Panel

Communication Flow

Player connects to game server:

Player → Game Server Port (25565 for Minecraft)
         → Wings Docker Container
         → Game Server Process

Admin manages server via Panel:

Admin → Panel Web UI (https://panel.domain.com)
        → Panel API call
        → Wings API listener
        → Docker container action
        → Game server affected

Example: Starting a Minecraft server:

  1. Admin clicks “Start” in Panel web UI
  2. Panel sends API request to Wings: POST /api/servers/{uuid}/power
  3. Wings receives request, starts Docker container
  4. Minecraft server boots inside container
  5. Wings streams console output to Panel
  6. Panel updates UI: “Server is running”
  7. Players can now connect

Deployment Scenarios

Scenario 1: All-In-One (Testing/Small Homelab)

Single VM/Server:
├── Pterodactyl Panel (port 443/80)
├── Wings Daemon (port 8080, 2022)
└── Game Servers (various ports)

Pros: Simple, minimal resource overhead Cons: Panel downtime = game server management downtime

Scenario 2: Separated Panel + Wings (Recommended)

VM 1 (Panel):
└── Pterodactyl Panel + Database

VM 2 (Wings Node 1):
├── Wings Daemon
└── Game Servers (Minecraft, Terraria, etc.)

VM 3 (Wings Node 2):
├── Wings Daemon
└── More Game Servers (Valheim, Rust, etc.)

Pros: Better resource isolation, node failures don’t affect Panel Cons: More complex networking, multiple VMs to manage

Scenario 3: Multi-Node Production (Large Communities)

VM 1: Panel + Database + Redis
VM 2: Wings Node (Minecraft Servers)
VM 3: Wings Node (Survival Games)
VM 4: Wings Node (Modded Servers)
VM 5: Wings Node (Other Games)

Pros: Massive scalability, distribute load, node-specific optimizations Cons: Complex to manage, requires good networking


Installing the Pterodactyl Panel

Let’s install the control center first. This section assumes a fresh Ubuntu 22.04 VM.

Step 1: System Preparation

Update your system:

# Update package lists
sudo apt update && sudo apt upgrade -y

# Install required dependencies
sudo apt install -y software-properties-common curl apt-transport-https   ca-certificates gnupg lsb-release

Add required repositories:

# Add PHP 8.1 repository
sudo add-apt-repository -y ppa:ondrej/php
sudo apt update

Step 2: Install Dependencies

Install MariaDB:

# Install MariaDB server
sudo apt install -y mariadb-server mariadb-client

# Secure the installation
sudo mysql_secure_installation

MariaDB secure installation prompts:

  • Switch to unix_socket authentication? N
  • Change root password? Y (set a strong password)
  • Remove anonymous users? Y
  • Disallow root login remotely? Y
  • Remove test database? Y
  • Reload privilege tables? Y

Install PHP 8.1 and extensions:

sudo apt install -y php8.1 php8.1-{cli,gd,mysql,pdo,mbstring,tokenizer,bcmath,xml,fpm,curl,zip}

Install Nginx:

sudo apt install -y nginx

Install Redis:

sudo apt install -y redis-server

# Enable Redis to start on boot
sudo systemctl enable redis-server
sudo systemctl start redis-server

Install Composer (PHP dependency manager):

curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer

Step 3: Create Database

Create the Pterodactyl database and user:

# Login to MySQL as root
sudo mysql -u root -p

In the MySQL prompt, execute:

-- Create database
CREATE DATABASE panel;

-- Create user (replace 'yourpassword' with a strong password)
CREATE USER 'pterodactyl'@'127.0.0.1' IDENTIFIED BY 'yourpassword';

-- Grant privileges
GRANT ALL PRIVILEGES ON panel.* TO 'pterodactyl'@'127.0.0.1' WITH GRANT OPTION;

-- Apply changes
FLUSH PRIVILEGES;

-- Exit
exit;

Step 4: Download and Install Panel

Create directory and download:

# Create directory
sudo mkdir -p /var/www/pterodactyl
cd /var/www/pterodactyl

# Download latest release
sudo curl -Lo panel.tar.gz https://github.com/pterodactyl/panel/releases/latest/download/panel.tar.gz

# Extract
sudo tar -xzvf panel.tar.gz

# Set permissions
sudo chmod -R 755 storage/* bootstrap/cache/

Step 5: Configure Panel

Install Composer dependencies:

# Switch to web server user
sudo -u www-data bash

# Inside www-data shell:
cd /var/www/pterodactyl
composer install --no-dev --optimize-autoloader

# Exit www-data shell
exit

Generate application encryption key:

cd /var/www/pterodactyl

# Copy environment file
sudo cp .env.example .env

# Generate key
sudo php artisan key:generate --force

Configure environment variables:

sudo nano /var/www/pterodactyl/.env

Key settings to configure:

APP_URL=https://panel.yourdomain.com
APP_TIMEZONE=America/New_York

DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=panel
DB_USERNAME=pterodactyl
DB_PASSWORD=yourpassword

CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

Run database migrations:

cd /var/www/pterodactyl

sudo php artisan migrate --seed --force

Create first admin user:

sudo php artisan p:user:make

Follow the prompts:

  • Email: [email protected]
  • Username: admin
  • First Name: Your Name
  • Last Name: Last Name
  • Password: (strong password)
  • Admin: yes

Step 6: Configure Nginx

Create Nginx site configuration:

sudo nano /etc/nginx/sites-available/pterodactyl.conf

Add this configuration (replace panel.yourdomain.com):

server {
    listen 80;
    server_name panel.yourdomain.com;

    root /var/www/pterodactyl/public;
    index index.php;

    access_log /var/log/nginx/pterodactyl.app-access.log;
    error_log  /var/log/nginx/pterodactyl.app-error.log error;

    client_max_body_size 100m;
    client_body_timeout 120s;

    sendfile off;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ .php$ {
        fastcgi_split_path_info ^(.+.php)(/.+)$;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param PHP_VALUE "upload_max_filesize = 100M \n post_max_size=100M";
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTP_PROXY "";
        fastcgi_intercept_errors off;
        fastcgi_buffer_size 16k;
        fastcgi_buffers 4 16k;
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
    }

    location ~ /.ht {
        deny all;
    }
}

Enable the site:

# Create symbolic link
sudo ln -s /etc/nginx/sites-available/pterodactyl.conf /etc/nginx/sites-enabled/pterodactyl.conf

# Test Nginx configuration
sudo nginx -t

# Restart Nginx
sudo systemctl restart nginx

Step 7: Configure Queue Workers

Create queue worker service:

sudo nano /etc/systemd/system/pteroq.service

Add this content:

[Unit]
Description=Pterodactyl Queue Worker
After=redis-server.service

[Service]
User=www-data
Group=www-data
Restart=always
ExecStart=/usr/bin/php /var/www/pterodactyl/artisan queue:work --queue=high,standard,low --sleep=3 --tries=3
StartLimitInterval=180
StartLimitBurst=30
RestartSec=5s

[Install]
WantedBy=multi-user.target

Enable and start the service:

sudo systemctl enable pteroq.service
sudo systemctl start pteroq.service

Step 8: Set Up SSL with Let’s Encrypt

Install Certbot:

sudo apt install -y certbot python3-certbot-nginx

Obtain SSL certificate:

# Replace with your actual domain
sudo certbot --nginx -d panel.yourdomain.com

Follow Certbot prompts:

  • Email address: [email protected]
  • Agree to terms: Y
  • Redirect HTTP to HTTPS: 2 (recommended)

Test automatic renewal:

sudo certbot renew --dry-run

Step 9: Verify Installation

Access your Panel: Open browser to https://panel.yourdomain.com

You should see:

  • Login page with Pterodactyl branding
  • No SSL errors (if you set up Let’s Encrypt)
  • Ability to login with your admin credentials

After logging in:

  • Navigate to Admin Panel (top right)
  • Verify you can access Settings, Nodes, Servers, etc.

Your Pterodactyl Panel is now installed and ready!


Installing Wings (Server Daemon)

Wings is the daemon that runs on each game server host. You can install it on the same machine as the Panel, or on separate dedicated game server hosts.

Step 1: Prepare the Wings Host

Update system:

sudo apt update && sudo apt upgrade -y

Install Docker:

# Install Docker using convenience script
curl -sSL https://get.docker.com/ | CHANNEL=stable bash

# Start and enable Docker
sudo systemctl enable docker
sudo systemctl start docker

Verify Docker installation:

docker --version
# Should show: Docker version 24.x.x or newer

Step 2: Download Wings

Create directory and download Wings:

sudo mkdir -p /etc/pterodactyl
cd /etc/pterodactyl

# Download latest Wings release
sudo curl -L -o /usr/local/bin/wings "https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_$([[ "$(uname -m)" == "x86_64" ]] && echo "amd64" || echo "arm64")"

# Make executable
sudo chmod u+x /usr/local/bin/wings

Step 3: Create Node in Panel

Before configuring Wings, you need to create a Node in the Panel.

In the Pterodactyl Panel web interface:

  1. Navigate to Admin Panel → Nodes → Create New

  2. Fill in Node details:

    • Name: Node 1 (or descriptive name like “Main-Game-Server”)
    • Description: Optional description
    • Location: Select or create a location
    • FQDN: node1.yourdomain.com (or IP if no domain)
    • Communicate Over SSL: Use SSL Connection (recommended)
    • Behind Proxy: Not Behind Proxy (unless you’re using a proxy)
    • Daemon Port: 8080 (default)
    • Daemon SFTP Port: 2022 (default)
  3. Configuration tab:

    • Memory: Total RAM to allocate (e.g., 8192 MB)
    • Memory Over-Allocation: 0% (don’t over-allocate)
    • Disk Space: Total disk to allocate (e.g., 50000 MB)
    • Disk Over-Allocation: 0%
  4. Click “Create Node”

  5. On the Configuration tab of your new node:

    • You’ll see an auto-generated configuration
    • Copy this entire configuration block

Step 4: Configure Wings

Create Wings configuration file:

sudo nano /etc/pterodactyl/config.yml

Paste the configuration from the Panel: (This will look similar to below, but use the actual configuration from your Panel)

debug: false
uuid: your-node-uuid-here
token_id: your-token-id
token: your-token-here
api:
  host: 0.0.0.0
  port: 8080
  ssl:
    enabled: true
    cert: /etc/letsencrypt/live/node1.yourdomain.com/fullchain.pem
    key: /etc/letsencrypt/live/node1.yourdomain.com/privkey.pem
  upload_limit: 100
system:
  data: /var/lib/pterodactyl/volumes
  sftp:
    bind_port: 2022
allowed_mounts: []
remote: 'https://panel.yourdomain.com'

Install Certbot:

sudo apt install -y certbot

Obtain certificate (standalone mode):

# Stop Wings if running
sudo systemctl stop wings

# Get certificate
sudo certbot certonly --standalone -d node1.yourdomain.com

# Certificate will be at:
# /etc/letsencrypt/live/node1.yourdomain.com/

Update config.yml with SSL paths:

api:
  ssl:
    enabled: true
    cert: /etc/letsencrypt/live/node1.yourdomain.com/fullchain.pem
    key: /etc/letsencrypt/live/node1.yourdomain.com/privkey.pem

Set up automatic renewal:

# Edit crontab
sudo crontab -e

# Add renewal check (runs daily at 2 AM)
0 2 * * * certbot renew --pre-hook "systemctl stop wings" --post-hook "systemctl start wings"

Step 6: Create Wings Systemd Service

Create service file:

sudo nano /etc/systemd/system/wings.service

Add this content:

[Unit]
Description=Pterodactyl Wings Daemon
After=docker.service
Requires=docker.service
PartOf=docker.service

[Service]
User=root
WorkingDirectory=/etc/pterodactyl
LimitNOFILE=4096
PIDFile=/var/run/wings/daemon.pid
ExecStart=/usr/local/bin/wings
Restart=on-failure
StartLimitInterval=180
StartLimitBurst=30
RestartSec=5s

[Install]
WantedBy=multi-user.target

Enable and start Wings:

# Reload systemd
sudo systemctl daemon-reload

# Enable Wings to start on boot
sudo systemctl enable wings

# Start Wings
sudo systemctl start wings

# Check status
sudo systemctl status wings

Expected output:

● wings.service - Pterodactyl Wings Daemon
     Loaded: loaded
     Active: active (running)

Step 7: Verify Wings Connection

In the Pterodactyl Panel:

  1. Navigate to Admin Panel → Nodes
  2. Click on your node (e.g., “Node 1”)
  3. Look for the status indicator:
    • Green heartbeat: Wings is connected successfully
    • Red/No heartbeat: Connection issue (check logs)

Check Wings logs if having issues:

# View Wings logs
sudo journalctl -u wings -f

# Look for errors or connection issues

Common connection issues:

  • Firewall blocking ports 8080/2022
  • SSL certificate mismatch
  • Incorrect Panel URL in config.yml
  • Token/UUID mismatch between Panel and Wings

Deploying Your First Game Server

Now that Panel and Wings are installed, let’s deploy a Minecraft server as an example.

Step 1: Create Allocation

Allocations are IP:Port combinations that servers can use.

In the Panel:

  1. Navigate to Admin Panel → Nodes → Your Node → Allocation
  2. Assign New Allocations:
    • IP Address: Your server’s public IP (or 0.0.0.0 for all interfaces)
    • IP Alias: Optional friendly name
    • Ports: 25565 (Minecraft default) or range like 25565-25575 for multiple servers
  3. Click Submit

Step 2: Import Minecraft Egg

Eggs are server configuration templates. Minecraft egg is usually included by default.

Verify or import:

  1. Navigate to Admin Panel → Nests → Minecraft
  2. You should see eggs like:
    • Vanilla Minecraft
    • Paper
    • Forge
    • Fabric

If missing, import from repository:

# Download egg JSON
wget https://raw.githubusercontent.com/parkervcp/eggs/master/game_eggs/minecraft/java/paper/egg-paper.json

# Import via Panel:
# Admin Panel → Nests → Minecraft → Import Egg
# Upload the JSON file

Step 3: Create the Server

In the Panel:

  1. Navigate to Admin Panel → Servers → Create New

Core Details:

  • Server Name: My Minecraft Server
  • Server Owner: Select a user (yourself or create a user first)
  • Server Description: Optional description

Allocation Management:

  • Node: Select your Wings node
  • Default Allocation: Select 25565 or your chosen port
  • Additional Allocations: Optional extra ports

Application Feature Limits:

  • Database Limit: 1 (allow server to create 1 database)
  • Allocation Limit: 1
  • Backup Limit: 3 (allow 3 backups)

Resource Management:

  • Memory: 4096 MB (4GB for Minecraft)
  • Swap: 0 (or 512 MB if needed)
  • Disk Space: 10000 MB (10GB)
  • CPU Limit: 200% (2 cores worth)
  • IO Weight: 500 (default)

Nest Configuration:

  • Nest: Minecraft
  • Egg: Paper (recommended for performance)

Docker Image:

  • Use default: ghcr.io/pterodactyl/yolks:java_17 (for MC 1.20+)

Startup Configuration:

  • Server Version: latest (or specific like 1.20.4)
  • Build Number: latest

Click “Create Server”

Step 4: Start the Server

In the Panel:

  1. Navigate to your server’s console page
  2. You’ll see the server installing (downloading Paper, accepting EULA, etc.)
  3. Once installation completes, click Start

Watch the console as server boots:

[Server thread/INFO]: Starting Minecraft server on *:25565
[Server thread/INFO]: Done! For help, type "help"

Your Minecraft server is now running!

Step 5: Connect as a Player

In Minecraft client:

  1. Open Minecraft Java Edition
  2. Multiplayer → Add Server
  3. Server Address: your-server-ip:25565
  4. Click Done and Join Server

You should connect successfully!

Step 6: Manage Server via Panel

Explore server management features:

Console Tab:

  • View real-time console output
  • Execute commands (type command and press Enter)
  • See player joins/leaves, errors, etc.

File Manager Tab:

  • Browse server files
  • Edit server.properties, bukkit.yml, etc.
  • Upload plugins (for Paper servers)
  • Download configuration files

Databases Tab:

  • Create MySQL databases for plugins
  • Get connection credentials

Schedules Tab:

  • Create automated tasks:
    • Daily restarts: 0 4 * * * (4 AM daily)
    • Automated backups
    • Broadcast messages

Example: Daily 4 AM Restart:

  1. Click Create Schedule
  2. Name: Daily Restart
  3. Cron: 0 4 * * *
  4. Add Task:
    • Action: Send Command
    • Payload: say Server restarting in 60 seconds!
    • Time offset: 0 seconds
  5. Add another task:
    • Action: Send Power Action
    • Payload: Restart Server
    • Time offset: 60 seconds

Backups Tab:

  • Click Create Backup
  • Backup appears in list when complete
  • Download or restore from backups

Settings Tab:

  • Rename server
  • Change SFTP password
  • Reinstall server (fresh install)

User Management & Permissions

Pterodactyl excels at multi-user management. Let’s set up proper permissions.

Creating Users

Admin Panel approach:

  1. Navigate to Admin Panel → Users → Create New
  2. Fill in details:
    • Email: [email protected]
    • Username: playerusername
    • First Name: John
    • Last Name: Doe
    • Password: (generate or set)
  3. Click Create User

Command line approach:

cd /var/www/pterodactyl
sudo php artisan p:user:make

Assigning Server Access

Grant user access to specific server:

  1. Navigate to server page
  2. Click Users tab
  3. Click New User
  4. Enter user’s email
  5. Select permissions:

Available permissions:

Console Permissions:

  • console.view - View console output
  • console.send - Send console commands

File Permissions:

  • file.view - View file manager
  • file.create - Create files
  • file.update - Edit files
  • file.delete - Delete files
  • file.archive - Create/extract archives

Backup Permissions:

  • backup.view - See backup list
  • backup.create - Create backups
  • backup.delete - Delete backups
  • backup.download - Download backups

Allocation Permissions:

  • allocation.view - See allocations
  • allocation.update - Change allocations

Startup Permissions:

  • startup.view - View startup settings
  • startup.update - Modify startup settings

Database Permissions:

  • database.view - See databases
  • database.create - Create databases
  • database.delete - Delete databases

Schedule Permissions:

  • schedule.view - View schedules
  • schedule.create - Create schedules
  • schedule.update - Edit schedules
  • schedule.delete - Delete schedules

Common Permission Sets:

Full Admin (sub-user):

  • All permissions enabled

Moderator:

  • console.view, console.send
  • file.view, file.update
  • backup.view, backup.create
  • database.view

Builder/Developer:

  • console.view
  • file.view, file.create, file.update, file.delete, file.archive
  • backup.create
  • No restart/stop permissions

Player (view only):

  • console.view
  • file.view
  • backup.view

Admin vs. Regular Users

Admin Users:

  • Can access Admin Panel
  • Manage all servers across all nodes
  • Create nodes, locations, nests, eggs
  • Full system control

Regular Users:

  • Can only access servers they’re assigned to
  • No Admin Panel access
  • Permissions controlled per-server

Grant admin access:

cd /var/www/pterodactyl
sudo php artisan p:user:make --admin

Or modify existing user:

  1. Admin Panel → Users → Select User
  2. Toggle Root Admin → Save

Resource Allocation & Optimization

Proper resource allocation prevents server crashes and ensures fair distribution.

Understanding Resource Limits

Memory (RAM):

Server allocation: 4096 MB
- Minecraft server: ~3.5GB actual usage
- JVM overhead: ~300MB
- Buffer: ~200MB

CPU Limit:

  • 100% = 1 full core
  • 200% = 2 full cores
  • 400% = 4 full cores

Example: 8-core server with 3 Minecraft instances:

Server 1: 200% (2 cores) - 50 players
Server 2: 150% (1.5 cores) - 20 players
Server 3: 100% (1 core) - 10 players
Remaining: 350% (3.5 cores) for OS and other processes

Disk Space:

  • Minecraft world size grows over time
  • Allocate generously: 10GB minimum, 20GB+ for established servers
  • Monitor usage in server dashboard

I/O Weight:

  • Range: 10-1000
  • Default: 500
  • Higher = more disk I/O priority
  • Useful when running many servers on same disk

Optimizing Node Resources

Check Wings resource usage:

# View live stats
docker stats

# Check disk usage
df -h /var/lib/pterodactyl/volumes

Monitor in Panel:

  1. Admin Panel → Nodes → Your Node
  2. View:
    • Total memory used vs. allocated
    • Disk usage
    • Running servers count

Per-Server Java Optimization (Minecraft)

Edit server startup parameters:

  1. Navigate to server → Startup tab
  2. Modify Aikar’s Flags (optimal Java arguments):

For 4GB server:

-Xms4G -Xmx4G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1

For 8GB server:

-Xms8G -Xmx8G [same flags as above]

Paper-specific optimizations (server.properties):

# View distance (reduce for better performance)
view-distance=8

# Simulation distance
simulation-distance=6

# Entity activation range (in Paper config)
entity-activation-range.animals=16
entity-activation-range.monsters=24
entity-activation-range.raiders=48
entity-activation-range.misc=8

Preventing Resource Exhaustion

Set appropriate limits in Panel:

When creating servers:

  • Don’t over-allocate memory (leave 20% buffer)
  • Set CPU limits to prevent one server monopolizing
  • Monitor disk usage regularly

Example allocation for 16GB RAM server:

System reserved: 2GB
Wings overhead: 1GB
Usable for servers: 13GB

Server 1 (main): 6GB
Server 2 (test): 4GB
Server 3 (small): 2GB
Buffer: 1GB

Automated Backups & Disaster Recovery

Backups are crucial. Pterodactyl makes them easy.

Manual Backups

Via Panel:

  1. Navigate to server → Backups tab
  2. Click Create Backup
  3. Backup name: pre-update-backup
  4. Locked: Toggle on to prevent auto-deletion
  5. Click Start

Backup progress:

  • Panel shows upload progress
  • Stored in /var/lib/pterodactyl/volumes/{server-uuid}/backups/ on Wings node

Automated Backup Schedules

Create daily backup schedule:

  1. Server → Schedules → Create Schedule
  2. Name: Daily Backups
  3. Cron Expression: 0 3 * * * (3 AM daily)
  4. Only When Server Is Offline: Unchecked (backups work while running)
  5. Enabled: Checked
  6. Add Task:
    • Action: Create Backup
    • Payload: Leave empty (backs up everything)
    • Time Offset: 0 seconds

Cron examples:

0 3 * * *       - Daily at 3 AM
0 */6 * * *     - Every 6 hours
0 2 * * 0       - Weekly on Sunday at 2 AM
0 4 1 * *       - Monthly on 1st at 4 AM
*/30 * * * *    - Every 30 minutes

Backup Retention

Panel stores backups, but they consume disk space.

Configure backup limits:

  1. Admin Panel → Servers → Edit Server
  2. Backup Limit: 5 (keeps only 5 most recent)
  3. Older backups auto-delete when limit reached

Lock critical backups:

  • Locked backups don’t count toward limit
  • Won’t be auto-deleted
  • Use for major milestones: “pre-1.20-update”, “world-reset-2025”

Restoring from Backup

Via Panel:

  1. Server → Backups
  2. Find the backup to restore
  3. Click ⋮ (three dots) → Restore
  4. Warning: This will DELETE current files and restore backup
  5. Confirm restoration

Server will:

  • Stop (if running)
  • Delete current world/files
  • Extract backup files
  • Ready to start with restored state

External Backup Storage

For true disaster recovery, store backups externally.

Option 1: S3-Compatible Storage (Backblaze B2, Wasabi, AWS S3)

Configure in Panel:

# Edit Panel .env
sudo nano /var/www/pterodactyl/.env

Add S3 credentials:

AWS_DEFAULT_REGION=us-east-1
AWS_ACCESS_KEY_ID=your-key
AWS_SECRET_ACCESS_KEY=your-secret
AWS_BACKUPS_BUCKET=pterodactyl-backups
AWS_ENDPOINT=https://s3.us-east-1.wasabisys.com

Restart queue worker:

sudo systemctl restart pteroq

Backups now upload to S3-compatible storage automatically!

Option 2: Manual Sync to External Storage

Script to rsync backups:

#!/bin/bash
# /opt/scripts/backup-sync.sh

BACKUP_DIR="/var/lib/pterodactyl/volumes/*/backups"
REMOTE_HOST="backup-server.local"
REMOTE_DIR="/mnt/backups/pterodactyl"

rsync -avz --progress $BACKUP_DIR $REMOTE_HOST:$REMOTE_DIR

Schedule with cron:

sudo crontab -e

# Sync backups to remote server daily at 5 AM
0 5 * * * /opt/scripts/backup-sync.sh

Advanced Configuration

Multiple Node Setup

When to use multiple nodes:

  • Distribute load across physical servers
  • Separate game types (survival vs. creative, vanilla vs. modded)
  • Geographic distribution (US vs. EU nodes)
  • Dedicated resources for high-performance servers

Adding a second node:

On new Wings host:

  1. Repeat Wings installation steps
  2. Install Docker
  3. Download Wings binary

In Panel:

  1. Admin Panel → Nodes → Create New
  2. Configure Node 2 with different FQDN: node2.yourdomain.com
  3. Copy auto-generated config
  4. Paste into /etc/pterodactyl/config.yml on Node 2
  5. Start Wings on Node 2

Now you can deploy servers to either node!

API Access & Automation

Pterodactyl provides a full REST API for automation.

Generate API key:

  1. Admin Panel → Application API → Create New
  2. Description: Automation Scripts
  3. Allowed IPs: Leave empty (all IPs) or restrict
  4. Select permissions: Read/Write for resources you need
  5. Copy the generated token (shown only once!)

Example: Start server via API:

curl -X POST "https://panel.yourdomain.com/api/client/servers/{server-uuid}/power"   -H "Authorization: Bearer YOUR_API_KEY"   -H "Content-Type: application/json"   -H "Accept: application/json"   -d '{"signal": "start"}'

Example: List all servers:

curl "https://panel.yourdomain.com/api/application/servers"   -H "Authorization: Bearer YOUR_API_KEY"   -H "Accept: application/json"

Use cases:

  • Automated server deployment
  • Discord bot integration (start/stop servers from Discord)
  • Monitoring integrations
  • Custom control panels

Egg Customization

Eggs define how servers are installed and managed.

Modify existing egg:

  1. Admin Panel → Nests → Minecraft → Paper
  2. Click Configuration tab
  3. Edit:
    • Startup Command
    • Docker Images
    • Configuration Files
    • Installation Script

Example: Custom Minecraft startup:

java -Xms128M -Xmx{{SERVER_MEMORY}}M -Dterminal.jline=false -Dterminal.ansi=true -jar {{SERVER_JARFILE}}

Import community eggs:

Import process:

  1. Download egg-*.json file
  2. Admin Panel → Nests → Select nest → Import Egg
  3. Upload JSON
  4. Egg is now available for server creation!

Troubleshooting Common Issues

Wings Not Connecting to Panel

Symptoms:

  • Node shows red/offline in Panel
  • Can’t create servers

Diagnosis:

# Check Wings status
sudo systemctl status wings

# View Wings logs
sudo journalctl -u wings -n 50 --no-pager

# Check Wings network connectivity to Panel
curl -v https://panel.yourdomain.com

Solutions:

1. Firewall blocking:

# Allow Wings API port
sudo ufw allow 8080/tcp

# Allow SFTP port
sudo ufw allow 2022/tcp

2. SSL certificate issues:

# Verify certificate validity
sudo certbot certificates

# Renew if expired
sudo certbot renew

3. Config mismatch:

  • Verify token/UUID in /etc/pterodactyl/config.yml matches Panel
  • Regenerate node config in Panel if needed
  • Restart Wings after config changes

Server Won’t Start

Check server console in Panel for errors:

Common issues:

1. Port already in use:

Failed to bind to 0.0.0.0:25565

Solution: Change server allocation or stop conflicting service

2. Out of memory:

Error occurred during initialization of VM
Could not allocate XXX MB

Solution: Increase server memory limit in Panel

3. EULA not accepted (Minecraft):

You need to agree to the EULA

Solution:

  • File Manager → eula.txt
  • Change eula=false to eula=true

Slow File Manager

Symptoms:

  • File manager takes forever to load
  • Timeouts when editing files

Solutions:

1. Increase PHP limits:

sudo nano /etc/php/8.1/fpm/php.ini

# Increase:
max_execution_time = 180
upload_max_filesize = 100M
post_max_size = 100M

# Restart PHP-FPM
sudo systemctl restart php8.1-fpm

2. Increase Nginx timeouts:

sudo nano /etc/nginx/sites-available/pterodactyl.conf

# Add inside server block:
client_max_body_size 100m;
fastcgi_read_timeout 180;

# Reload Nginx
sudo systemctl reload nginx

Backup Failures

Check Wings logs:

sudo journalctl -u wings -n 100 | grep -i backup

Common causes:

1. Insufficient disk space:

# Check disk usage
df -h /var/lib/pterodactyl

2. S3 credential issues (if using S3):

  • Verify AWS credentials in Panel .env
  • Test S3 access manually with aws s3 ls

3. Permission errors:

# Fix Wings volume permissions
sudo chown -R pterodactyl:pterodactyl /var/lib/pterodactyl/volumes

Next Steps

Congratulations! You now have a professional game server management platform.

Expand Your Setup

Add more game servers:

  • Import eggs for other games (Valheim, Terraria, Rust)
  • Deploy testing servers on separate allocations
  • Create modded Minecraft servers (Forge, Fabric)

Optimize existing servers:

  • Fine-tune Java arguments for performance
  • Configure Paper anti-cheat and optimization
  • Set up automated restarts and backups

Improve infrastructure:

  • Add second Wings node for redundancy
  • Set up monitoring (Uptime Kuma, Grafana)
  • Implement automated updates for game servers

Community Resources

Official Documentation:

Community Eggs:

Discord Community:

  • Official Pterodactyl Discord for support

Related homelabbing.io Guides:

  • “Minecraft Server: Complete Self-Hosting Guide”
  • “Docker Basics for Homelabs”
  • “Nginx Proxy Manager: Complete Setup Guide”

Conclusion

Pterodactyl transforms game server hosting from a tedious manual process into a streamlined, professional operation. What once required SSH knowledge, manual configuration, and constant maintenance now happens through an elegant web interface.

Key Takeaways:

  1. Two-component architecture: Panel manages, Wings executes
  2. Professional features: User permissions, resource limits, automated backups
  3. Scalable: Single server to multi-node clusters
  4. API-driven: Automate everything
  5. Community-supported: Hundreds of game eggs available

Your Pterodactyl homelab is now:

  • Running professional-grade game server infrastructure
  • Capable of hosting multiple games simultaneously
  • Equipped with automated backups and disaster recovery
  • Ready for user management and delegation
  • Scalable to additional Wings nodes as needed

Whether you’re hosting a Minecraft server for friends, running a multi-game community, or learning professional infrastructure management - Pterodactyl provides the tools to do it right.

Now go forth and host all the game servers!


Quick Reference

Essential Commands

# Panel Management
cd /var/www/pterodactyl
sudo php artisan migrate           # Run database migrations
sudo php artisan p:user:make       # Create user
sudo systemctl restart pteroq      # Restart queue worker

# Wings Management
sudo systemctl status wings        # Check Wings status
sudo systemctl restart wings       # Restart Wings
sudo journalctl -u wings -f        # Follow Wings logs

# Docker (on Wings node)
docker ps                          # List running containers
docker stats                       # Resource usage
docker logs CONTAINER_ID           # View container logs

# Backup Panel
sudo mysqldump -u root -p panel > /backup/panel_$(date +%Y%m%d).sql

# Update Panel
cd /var/www/pterodactyl
sudo php artisan p:upgrade

# Update Wings
sudo systemctl stop wings
sudo curl -L -o /usr/local/bin/wings "https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_amd64"
sudo chmod u+x /usr/local/bin/wings
sudo systemctl start wings

Default Ports

Panel:
- HTTP: 80
- HTTPS: 443

Wings:
- API: 8080
- SFTP: 2022

Game Servers:
- Minecraft Java: 25565
- Minecraft Bedrock: 19132
- Terraria: 7777
- Valheim: 2456-2458

Last updated: December 16, 2025 Author: homelabbing.io Difficulty: Intermediate Time to complete: 90 minutes

Happy hosting!