← All articles
Pterodactyl

Pterodactyl: Self-Hosted Game Server Management Done Right

Gaming 2026-02-13 · 13 min read pterodactyl game-server minecraft docker panel server-management gaming
By Selfhosted Guides Editorial TeamSelf-hosting practitioners covering open source software, home lab infrastructure, and data sovereignty.

If you have ever managed game servers by hand — SSHing in to restart a crashed Minecraft instance at 2 AM, manually editing config files over SFTP, or trying to remember which screen session is running your Valheim world — you know the pain. It works for one server. It falls apart at two. By three, you are begging for a panel.

Photo by ThisisEngineering on Unsplash

Pterodactyl Panel is the open-source answer to commercial game server management platforms. It gives you a polished web interface for creating, managing, and monitoring game servers, all running in isolated Docker containers on one or more machines. Your players get a self-service portal for restarting their servers and managing files. You get centralized control without the recurring licensing fees of commercial panels.

The project has been around since 2015, is actively maintained, and runs thousands of game server hosting businesses worldwide. It is not the simplest option to set up — the split architecture between the Panel and Wings daemon takes some effort — but the payoff is a professional-grade management layer that scales from a handful of personal servers to hundreds of client instances.

Pterodactyl game server panel logo

Pterodactyl vs AMP vs Crafty Controller vs PufferPanel

Choosing a game server panel depends on what you need: simple personal use, a commercial hosting operation, or something in between.

Feature Pterodactyl AMP Crafty Controller PufferPanel
License Open source (MIT) Commercial ($10-150) Open source (GPL) Open source (Apache 2.0)
Web UI Modern, polished Modern, feature-rich Clean, functional Simple, functional
Game support 100+ via eggs 50+ built-in Minecraft-focused 20+ via templates
Container isolation Docker (mandatory) Optional None (bare process) Docker optional
Multi-node Yes (Wings) Yes (ADS) No Yes
User management Full RBAC, subusers Full RBAC Basic Basic roles
API REST API, complete REST API REST API REST API
SFTP Built-in (per-server) Built-in Built-in Built-in
Scheduling Built-in (cron-style) Built-in Built-in Limited
Resource limits Per-server CPU/RAM/disk/IO Per-instance Per-server Per-server
Setup complexity High Medium Low Low
PHP requirement Yes (Laravel) No (C#/.NET) No (Python) No (Go)
Active development Yes (+ Pelican fork) Yes (commercial) Yes Moderate
Best for Hosting businesses, power users Commercial hosts, Windows users Minecraft-only setups Simple multi-game setups

When to choose Pterodactyl

You want a professional, scalable game server panel and you are comfortable with a more involved setup. Pterodactyl is the right choice when:

When to choose AMP

You want a polished, commercial product and are willing to pay for it. AMP (Application Management Panel) is worth the license fee when:

When to choose Crafty Controller

You only need Minecraft servers and want something running in five minutes. Crafty is the path of least resistance when:

When to choose PufferPanel

You want something simpler than Pterodactyl but still multi-game and open source. PufferPanel makes sense when:

How Pterodactyl Works

Pterodactyl has a split architecture that is important to understand before you install it:

Panel — The web application. Built with Laravel (PHP) and a MySQL/MariaDB database. This is where users log in, create servers, manage files, and view console output. The Panel does not run any game servers itself. It is purely the management and API layer.

Wings — The server daemon. Written in Go, Wings runs on each machine that actually hosts game servers. It receives instructions from the Panel, creates Docker containers, manages server processes, handles file operations, and streams console output back to the Panel via WebSocket.

This split means you can have one Panel controlling Wings daemons across multiple physical or virtual machines. It also means the setup is more involved than a single-binary solution — you need to install and configure both components, and they need to communicate over HTTPS.

Installation via Docker Compose

The Panel itself runs well in Docker. Wings, however, needs to run directly on the host because it manages Docker containers — running Docker-in-Docker for game servers adds unnecessary complexity and performance overhead. The recommended setup is Panel in Docker, Wings installed natively.

Panel Setup

Create a directory for the panel and the following docker-compose.yml:

# docker-compose.yml — Pterodactyl Panel
services:
  panel:
    image: ghcr.io/pterodactyl/panel:latest
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - panel_var:/app/var/
      - panel_nginx:/etc/nginx/http.d/
      - panel_certs:/etc/letsencrypt/
      - panel_logs:/app/storage/logs
    environment:
      # App settings
      APP_URL: "https://panel.example.com"
      APP_TIMEZONE: "America/Los_Angeles"
      APP_SERVICE_AUTHOR: "[email protected]"
      APP_ENV: "production"
      # Database
      DB_HOST: "database"
      DB_PORT: "3306"
      DB_DATABASE: "panel"
      DB_USERNAME: "pterodactyl"
      DB_PASSWORD: "CHANGE_ME_DB_PASSWORD"
      # Redis / Cache
      CACHE_DRIVER: "redis"
      SESSION_DRIVER: "redis"
      QUEUE_DRIVER: "redis"
      REDIS_HOST: "cache"
      # Mail (adjust for your SMTP provider)
      MAIL_DRIVER: "smtp"
      MAIL_HOST: "smtp.example.com"
      MAIL_PORT: "587"
      MAIL_USERNAME: "[email protected]"
      MAIL_PASSWORD: "CHANGE_ME_MAIL_PASSWORD"
      MAIL_FROM: "[email protected]"
      MAIL_FROM_NAME: "Pterodactyl Panel"
      MAIL_ENCRYPTION: "tls"
    depends_on:
      database:
        condition: service_healthy
      cache:
        condition: service_started

  database:
    image: mariadb:10.11
    restart: unless-stopped
    volumes:
      - panel_db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: "CHANGE_ME_ROOT_PASSWORD"
      MYSQL_DATABASE: "panel"
      MYSQL_USER: "pterodactyl"
      MYSQL_PASSWORD: "CHANGE_ME_DB_PASSWORD"
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 10s
      timeout: 5s
      retries: 5

  cache:
    image: redis:7-alpine
    restart: unless-stopped
    volumes:
      - panel_cache:/data

volumes:
  panel_var:
  panel_nginx:
  panel_certs:
  panel_logs:
  panel_db:
  panel_cache:

Start the stack and create your first admin user:

# Start the panel
docker compose up -d

# Wait for the database to initialize, then create admin user
docker compose exec panel php artisan p:user:make

# Follow the prompts — set as administrator

The p:user:make command will ask for an email, username, and password. Make sure to set the user as an administrator.

Wings Installation

Wings runs directly on the host machine (not in Docker). Install it on each node that will run game servers:

# Install Docker if not already present
curl -fsSL https://get.docker.com | bash

# Create the Wings directory structure
sudo mkdir -p /etc/pterodactyl
sudo mkdir -p /var/lib/pterodactyl/{volumes,backups}

# Download the Wings binary
sudo curl -Lo /usr/local/bin/wings \
  "https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_amd64"
sudo chmod +x /usr/local/bin/wings

Before starting Wings, you need to configure it from the Panel:

  1. Log into your Panel as administrator
  2. Go to Admin → Nodes → Create New
  3. Fill in the node details (name, FQDN, memory, disk, etc.)
  4. After creating the node, go to the Configuration tab
  5. Copy the generated config.yml and save it to /etc/pterodactyl/config.yml on the Wings machine

Then create a systemd service for Wings:

# /etc/systemd/system/wings.service
[Unit]
Description=Pterodactyl Wings Daemon
After=docker.service
Requires=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
sudo systemctl enable --now wings

Once Wings is running and connected to the Panel, you will see the node status turn green in the admin area.

Like what you're reading? Subscribe to Self-Hosted Weekly — free weekly guides in your inbox.

Core Features

Web Panel

The Panel provides a clean, responsive interface for both administrators and regular users. Administrators get access to node management, server creation, user management, and system settings. Regular users see only their assigned servers, with the ability to:

The interface is genuinely well-designed. It does not feel like an open-source afterthought — it is a polished product that you can hand to non-technical users without embarrassment.

Docker Isolation

Every game server runs in its own Docker container. This is not optional, and that is a good thing. Isolation means:

Pterodactyl uses purpose-built Docker images called "yolks" — minimal base images optimized for game servers (Java, Node.js, Source engine, etc.).

Server Eggs

Eggs are Pterodactyl's templating system for game servers. An egg defines everything needed to install and run a specific game:

The community maintains eggs for over 100 games and applications:

You can browse and import community eggs from the Pterodactyl Eggs repository on GitHub.

Built-in SFTP

Each server gets its own SFTP endpoint for file management. Users connect with their Panel credentials, and they can only access files for servers they have permission to manage. This means players can upload mods, edit configs, and download backups without needing SSH access to the host machine.

The SFTP server is built into Wings, so there is no separate FTP daemon to configure or secure.

Task Scheduling

The built-in scheduler lets users create cron-style tasks for their servers. Common uses:

Tasks can be chained with delays between them, so you can create sequences like "warn players → wait 5 minutes → save world → restart."

Advanced Configuration

Custom Eggs

When a game you need is not in the community repository, you can create your own egg. An egg is a JSON file that defines:

{
  "name": "My Custom Game",
  "description": "A custom egg for My Game Server",
  "docker_images": {
    "ghcr.io/pterodactyl/yolks:java_21": "Java 21"
  },
  "startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar server.jar",
  "config": {
    "startup": {
      "done": "Server started on port"
    },
    "stop": "stop"
  },
  "scripts": {
    "installation": {
      "script": "#!/bin/bash\ncurl -Lo server.jar https://example.com/server.jar",
      "container": "ghcr.io/pterodactyl/installers:alpine",
      "entrypoint": "bash"
    }
  },
  "variables": [
    {
      "name": "Server Port",
      "env_variable": "SERVER_PORT",
      "default_value": "25565",
      "user_viewable": true,
      "user_editable": false
    }
  ]
}

The key parts of an egg are the startup detection string (so Wings knows when the server is ready), the stop command (for graceful shutdowns), the installation script, and the configurable variables. Import custom eggs through the admin panel under Nests → Import Egg.

Resource Limits

Pterodactyl gives you granular control over resources per server:

These limits are enforced by Docker, so they are real constraints, not suggestions. A runaway Minecraft server with a memory leak will be killed when it hits its limit rather than taking down every other server on the machine.

Multi-Node Setup with Wings

Scaling beyond a single machine is where Pterodactyl's architecture shines. Each node runs its own Wings daemon, and the central Panel orchestrates all of them:

  1. Set up a new machine with Docker and Wings installed
  2. Add the node in the Panel admin area with the machine's FQDN, available memory, and disk
  3. Configure allocations — the IP:port combinations available on that node
  4. Deploy the config to /etc/pterodactyl/config.yml on the new node
  5. Start Wings and verify connectivity

From there, you can create servers on any node. The Panel handles routing console connections, SFTP traffic, and API requests to the correct Wings instance. Users do not need to know or care which physical machine their server runs on.

For hosting businesses, this means you can add capacity by plugging in new machines and registering them as nodes. For home users, you might run one node on a beefy desktop and another on a dedicated server, distributing your game servers based on resource needs.

Resource Requirements

Panel (Web Application)

Component RAM CPU Storage
Panel (PHP + Nginx) 200-400 MB 1 core 500 MB
MariaDB 200-400 MB 0.5 cores 1 GB
Redis 50-100 MB Minimal 100 MB
Total (Panel only) ~500 MB - 1 GB ~2 cores ~2 GB

The Panel is lightweight. A $5/month VPS can comfortably run it. You do not need to co-locate the Panel with your game server nodes — it can run on a completely separate machine.

Wings (Game Server Node)

Server Type RAM per Server CPU per Server Disk per Server
Minecraft (vanilla, small) 1-2 GB 1-2 cores 2-5 GB
Minecraft (modded) 4-8 GB 2-4 cores 5-20 GB
Valheim 2-4 GB 2 cores 3-5 GB
Rust 6-12 GB 2-4 cores 10-20 GB
ARK: Survival Evolved 8-16 GB 2-4 cores 20-50 GB
CS2 2-4 GB 2 cores 30-40 GB
Terraria 512 MB - 1 GB 1 core 500 MB
Factorio 1-2 GB 1-2 cores 1-3 GB

Wings itself uses minimal resources (50-100 MB RAM). The real resource consumers are the game servers. Budget your node hardware based on what games you plan to host and how many concurrent servers you expect.

As a rule of thumb, a machine with 32 GB of RAM and an 8-core CPU can comfortably run 8-12 Minecraft servers or 3-4 Rust servers, depending on player counts and mod loads.

Honest Limitations

Pterodactyl is excellent software, but it is not without trade-offs. You should know what you are getting into.

Setup complexity is real. You need a web server, PHP, MariaDB, Redis, and the Panel application configured correctly. Then you need Wings installed separately on each node with its own configuration. Compared to Crafty (download and run) or PufferPanel (single Go binary), the initial setup is a project in itself. Budget an afternoon for your first installation, not an hour.

PHP dependency. The Panel runs on Laravel, which means you are managing a PHP application stack. If you are not familiar with PHP deployments, Composer, or Artisan commands, the learning curve is steeper. The Docker installation mitigates this significantly, but debugging issues still requires some familiarity with the ecosystem.

Panel and Wings must communicate over HTTPS. Both components need valid SSL certificates. If you are running on a local network without a domain, you will need to set up self-signed certificates or use a tunnel solution like Cloudflare Tunnel. This is an extra step that simpler panels do not require.

No built-in game server updating. Pterodactyl installs game servers via egg scripts, but updating a game server (new Minecraft version, new Rust wipe) is usually a manual process or requires reinstalling the server. Some eggs handle updates better than others, but there is no universal "update" button.

The Pelican fork. The original Pterodactyl maintainer stepped back from active development in 2024, and a community fork called Pelican has emerged as the successor. As of early 2026, both projects are active, but if you are starting fresh, it is worth evaluating Pelican alongside Pterodactyl. Pelican aims for the same architecture with modernized internals and a renewed development pace. The egg format is compatible between the two.

Database backups are your responsibility. While Pterodactyl can back up individual game server files, the Panel's own database (your user accounts, server configurations, node settings) is not automatically backed up. Set up MariaDB backups separately — losing that database means reconfiguring everything from scratch.

Practical Tips for Operators

Start with the Docker-based Panel install. The manual installation instructions involve setting up Nginx, PHP-FPM, Composer, and Artisan migrations by hand. The Docker Compose approach gets you running faster and is easier to maintain long-term.

Use a separate machine (or VPS) for the Panel. The Panel is lightweight and does not need to be on the same machine as your game servers. Putting it on a $5 VPS gives you reliable access to management even if a game server node goes down. It also keeps the Panel's web traffic separate from game server network traffic.

Pre-allocate ports thoughtfully. Pterodactyl requires you to create port allocations before creating servers. Plan your allocation ranges in advance. A common pattern is to reserve a range like 25565-25600 for Minecraft, 2456-2470 for Valheim, and so on. This makes it easier to manage firewall rules and understand what is running where.

Set up Wings as a systemd service from day one. The systemd unit ensures Wings starts on boot and restarts automatically if it crashes. Game servers are supposed to be always-on — do not rely on a screen session or manual start.

Use the API for automation. Pterodactyl's REST API is comprehensive and well-documented. If you are running a hosting business, use it to automate server provisioning, billing integration, and monitoring. WHMCS and Blesta both have Pterodactyl modules for automated game server hosting.

Monitor your nodes independently. Pterodactyl shows basic resource usage, but it is not a monitoring solution. Run something like Netdata or Prometheus on your nodes to get real alerting on disk space, memory pressure, and CPU load. A full disk on a Wings node will silently corrupt game server data.

Test your backups. Pterodactyl's backup system works well, but test restoring from a backup before you need to do it in an emergency. Also back up your MariaDB database regularly — that is the single point of failure for your entire setup.

Keep eggs updated. Community eggs get updated when games release new versions or when bugs are found. Periodically check the eggs repository for updates to the games you host, and import the updated versions.

Resources

Get free weekly tips in your inbox. Subscribe to Self-Hosted Weekly