Pterodactyl: Professional Game Server Management
Open-source game server management panel. Docker-based with resource isolation and user management.
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:
- Admin clicks “Start” in Panel web UI
- Panel sends API request to Wings:
POST /api/servers/{uuid}/power - Wings receives request, starts Docker container
- Minecraft server boots inside container
- Wings streams console output to Panel
- Panel updates UI: “Server is running”
- 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:
Navigate to Admin Panel → Nodes → Create New
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)
- Name:
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%
Click “Create Node”
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' Step 5: Set Up SSL for Wings (Optional but Recommended)
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:
- Navigate to Admin Panel → Nodes
- Click on your node (e.g., “Node 1”)
- 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:
- Navigate to Admin Panel → Nodes → Your Node → Allocation
- 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 like25565-25575for multiple servers
- Click Submit
Step 2: Import Minecraft Egg
Eggs are server configuration templates. Minecraft egg is usually included by default.
Verify or import:
- Navigate to Admin Panel → Nests → Minecraft
- 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:
- 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
25565or 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 like1.20.4) - Build Number:
latest
Click “Create Server”
Step 4: Start the Server
In the Panel:
- Navigate to your server’s console page
- You’ll see the server installing (downloading Paper, accepting EULA, etc.)
- 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:
- Open Minecraft Java Edition
- Multiplayer → Add Server
- Server Address:
your-server-ip:25565 - 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
- Daily restarts:
Example: Daily 4 AM Restart:
- Click Create Schedule
- Name:
Daily Restart - Cron:
0 4 * * * - Add Task:
- Action:
Send Command - Payload:
say Server restarting in 60 seconds! - Time offset:
0 seconds
- Action:
- Add another task:
- Action:
Send Power Action - Payload:
Restart Server - Time offset:
60 seconds
- Action:
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:
- Navigate to Admin Panel → Users → Create New
- Fill in details:
- Email: [email protected]
- Username: playerusername
- First Name: John
- Last Name: Doe
- Password: (generate or set)
- 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:
- Navigate to server page
- Click Users tab
- Click New User
- Enter user’s email
- Select permissions:
Available permissions:
Console Permissions:
console.view- View console outputconsole.send- Send console commands
File Permissions:
file.view- View file managerfile.create- Create filesfile.update- Edit filesfile.delete- Delete filesfile.archive- Create/extract archives
Backup Permissions:
backup.view- See backup listbackup.create- Create backupsbackup.delete- Delete backupsbackup.download- Download backups
Allocation Permissions:
allocation.view- See allocationsallocation.update- Change allocations
Startup Permissions:
startup.view- View startup settingsstartup.update- Modify startup settings
Database Permissions:
database.view- See databasesdatabase.create- Create databasesdatabase.delete- Delete databases
Schedule Permissions:
schedule.view- View schedulesschedule.create- Create schedulesschedule.update- Edit schedulesschedule.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:
- Admin Panel → Users → Select User
- 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 core200%= 2 full cores400%= 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:
- Admin Panel → Nodes → Your Node
- View:
- Total memory used vs. allocated
- Disk usage
- Running servers count
Per-Server Java Optimization (Minecraft)
Edit server startup parameters:
- Navigate to server → Startup tab
- 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:
- Navigate to server → Backups tab
- Click Create Backup
- Backup name:
pre-update-backup - Locked: Toggle on to prevent auto-deletion
- 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:
- Server → Schedules → Create Schedule
- Name:
Daily Backups - Cron Expression:
0 3 * * *(3 AM daily) - Only When Server Is Offline: Unchecked (backups work while running)
- Enabled: Checked
- Add Task:
- Action:
Create Backup - Payload: Leave empty (backs up everything)
- Time Offset:
0 seconds
- Action:
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:
- Admin Panel → Servers → Edit Server
- Backup Limit:
5(keeps only 5 most recent) - 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:
- Server → Backups
- Find the backup to restore
- Click ⋮ (three dots) → Restore
- Warning: This will DELETE current files and restore backup
- 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:
- Repeat Wings installation steps
- Install Docker
- Download Wings binary
In Panel:
- Admin Panel → Nodes → Create New
- Configure Node 2 with different FQDN:
node2.yourdomain.com - Copy auto-generated config
- Paste into
/etc/pterodactyl/config.ymlon Node 2 - 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:
- Admin Panel → Application API → Create New
- Description:
Automation Scripts - Allowed IPs: Leave empty (all IPs) or restrict
- Select permissions: Read/Write for resources you need
- 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:
- Admin Panel → Nests → Minecraft → Paper
- Click Configuration tab
- 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:
- Visit: https://github.com/parkervcp/eggs
- Download egg JSON for games like:
- Valheim
- Terraria
- Rust
- Factorio
- CS:GO
- And hundreds more!
Import process:
- Download
egg-*.jsonfile - Admin Panel → Nests → Select nest → Import Egg
- Upload JSON
- 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.ymlmatches 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=falsetoeula=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:
- https://github.com/parkervcp/eggs (hundreds of games!)
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:
- Two-component architecture: Panel manages, Wings executes
- Professional features: User permissions, resource limits, automated backups
- Scalable: Single server to multi-node clusters
- API-driven: Automate everything
- 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!