Pterodactyl is a free, open-source game-server management platform. Its Panel provides users, permissions, schedules, files, backups and a web console. Wings runs on each game node, talks to Docker and keeps every game server inside its own container with defined CPU, memory, disk and network limits.
This guide follows the current Pterodactyl 1.12 documentation for Ubuntu 24.04. It builds a production-minded single-host installation first, then explains when to separate the Panel from Wings. Commands assume a fresh Ubuntu 24.04 server and a sudo-capable administrator.
How Pterodactyl Panel and Wings Fit Together
| Component | Purpose | Typical location |
|---|---|---|
| Pterodactyl Panel | Web UI, API, users, database records and job scheduling | Small VPS or the first game node |
| Wings | Docker control plane, console, files, SFTP and resource enforcement | Every game-server node |
| Game container | Minecraft, Rust, Terraria, Valheim or another server process | Created and managed by Wings |
| Egg | Install script, image, variables and startup command for a game | Imported or selected in the Panel |
A small setup can place Panel, Wings and one game server on the same machine. A larger setup normally keeps the Panel on a modest VPS and adds one or more VDS or dedicated Wings nodes. That prevents a busy game process from starving the web interface and lets nodes be maintained independently.
Pterodactyl VPS Requirements
Pterodactyl officially supports Ubuntu 24.04. Wings requires Docker and a compatible Linux environment; the project specifically warns that OpenVZ and many LXC environments can fail, while KVM is supported. HYEHOST Cloud VPS, VDS and dedicated servers provide the full Linux control required for this design.
| Deployment | Practical starting point | Best HYEHOST fit |
|---|---|---|
| Panel only | 2 vCPU, 2 GB RAM, 20 GB SSD | Cloud VPS |
| Panel + small game server | 2–4 vCPU, 4–8 GB RAM, SSD storage | Cloud VPS or VDS |
| Modded or several servers | 4+ dedicated cores, 16+ GB RAM | VDS |
| Large multi-game node | Dedicated CPU, large RAM and local SSD | Bare metal |
These are planning baselines, not universal game requirements. Player count, world size, mods, view distance and the game engine matter more than the Panel. Keep active world data on fast local SSD storage and send backups to separate storage.
Prepare Ubuntu, DNS and the Firewall
Create two DNS names if Panel and Wings share a machine—for example, panel.example.com and node1.example.com. Point A and, when used, AAAA records to the server. HYEHOST customers can manage these records and DNSSEC through HYE DNS.
sudo apt update
sudo apt full-upgrade -y
sudo apt install -y ufw curl ca-certificates gnupg unzip tar git
sudo timedatectl set-timezone Europe/London
hostnamectl
Change the timezone to your own. Confirm both hostnames resolve before requesting certificates:
getent ahosts panel.example.com
getent ahosts node1.example.com
Allow SSH before enabling UFW. The later Wings steps also require ports 8080 and 2022 plus whichever game allocation ports you create.
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
Install PHP, MariaDB, Redis and Nginx
Pterodactyl 1.12 supports PHP 8.2 or 8.3 and recommends PHP 8.3. Ubuntu 24.04 provides the required packages:
sudo apt install -y php8.3 php8.3-{common,cli,gd,mysql,mbstring,bcmath,xml,fpm,curl,zip} \
mariadb-server nginx redis-server
sudo systemctl enable --now mariadb nginx redis-server php8.3-fpm
Install Composer v2 using the method published by Composer, then verify each runtime:
curl -sS https://getcomposer.org/installer | sudo php -- \
--install-dir=/usr/local/bin --filename=composer
php -v
composer --version
mariadb --version
redis-cli ping
Create the Pterodactyl database
Run sudo mariadb, replace the example password with a long unique value, and execute:
CREATE USER 'pterodactyl'@'127.0.0.1' IDENTIFIED BY 'REPLACE_WITH_A_LONG_RANDOM_PASSWORD';
CREATE DATABASE panel;
GRANT ALL PRIVILEGES ON panel.* TO 'pterodactyl'@'127.0.0.1' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;
Install Pterodactyl Panel
Download the latest packaged Panel release from the official GitHub release endpoint:
sudo mkdir -p /var/www/pterodactyl
cd /var/www/pterodactyl
sudo curl -Lo panel.tar.gz https://github.com/pterodactyl/panel/releases/latest/download/panel.tar.gz
sudo tar -xzvf panel.tar.gz
sudo chmod -R 755 storage/* bootstrap/cache/
sudo cp .env.example .env
sudo env COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader
sudo php artisan key:generate --force
Run the interactive configuration commands. Use the public HTTPS Panel URL, Redis for caching and queues, and the database credentials created above:
cd /var/www/pterodactyl
sudo php artisan p:environment:setup
sudo php artisan p:environment:database
sudo php artisan p:environment:mail
sudo php artisan migrate --seed --force
sudo php artisan p:user:make
sudo chown -R www-data:www-data /var/www/pterodactyl/*
Configure real SMTP rather than relying on local PHP mail. Password resets and administrative notifications must reach users reliably.
Enable the scheduler and queue worker
Add the scheduler with sudo crontab -e:
* * * * * php /var/www/pterodactyl/artisan schedule:run >> /dev/null 2>&1
Create /etc/systemd/system/pteroq.service:
[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
sudo systemctl daemon-reload
sudo systemctl enable --now pteroq.service
sudo systemctl status pteroq.service --no-pager
Configure Nginx and HTTPS
Request the certificates before enabling the SSL-only Nginx configuration. This standalone method briefly stops Nginx so Certbot can answer on port 80. If Panel and Wings use separate hosts, request each certificate on its own host.
sudo apt install -y certbot python3-certbot-nginx
sudo systemctl stop nginx
sudo certbot certonly --standalone -d panel.example.com
sudo certbot certonly --standalone -d node1.example.com
sudo systemctl start nginx
Create /etc/nginx/sites-available/pterodactyl.conf. Replace the domain and compare this configuration with Pterodactyl's current official template before deploying:
server {
listen 80;
server_name panel.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name panel.example.com;
root /var/www/pterodactyl/public;
index index.php;
access_log /var/log/nginx/pterodactyl-access.log;
error_log /var/log/nginx/pterodactyl-error.log error;
client_max_body_size 100m;
client_body_timeout 120s;
sendfile off;
ssl_certificate /etc/letsencrypt/live/panel.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/panel.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTP_PROXY "";
}
location ~ /\.ht {
deny all;
}
}
Enable and validate the site, then test certificate renewal:
sudo rm -f /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/pterodactyl.conf /etc/nginx/sites-enabled/pterodactyl.conf
sudo nginx -t
sudo systemctl reload nginx
sudo certbot renew --dry-run
Open https://panel.example.com and sign in with the administrator created earlier. Do not continue until HTTPS, the queue worker and scheduled tasks all work.
Install Docker and Pterodactyl Wings
Install Docker Engine from Docker's official Ubuntu repository. Avoid the Ubuntu docker.io package when following Pterodactyl's documented Docker CE path:
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
-o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
docker --version
sudo systemctl enable --now docker
sudo docker run --rm hello-world
Download the current Wings binary and create its configuration directory:
sudo mkdir -p /etc/pterodactyl
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)"
sudo chmod u+x /usr/local/bin/wings
wings version
In the Panel, go to Admin → Locations and add a location. Then open Nodes → Create New. Use the node hostname, select HTTPS, set the daemon port to 8080, SFTP to 2022, and give the node realistic memory and disk totals with safety overhead.
Open the node's Configuration tab and use the generated token command, or save the shown YAML as /etc/pterodactyl/config.yml. Test Wings interactively:
sudo wings --debug
After it connects without errors, press Ctrl+C and create /etc/systemd/system/wings.service:
[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
sudo systemctl daemon-reload
sudo systemctl enable --now wings
sudo systemctl status wings --no-pager
Allow the Wings API and SFTP ports. If the Panel is on another server, restrict 8080 to that Panel address where the network design permits it:
sudo ufw allow 8080/tcp
sudo ufw allow 2022/tcp
sudo ufw status numbered
Create Allocations and Your First Game Server
An allocation is an IP-and-port pair assigned to a game server. In Nodes → node1 → Allocation, enter the server's interface address and a deliberate port range. For a Minecraft Java test server, you might add TCP port 25565. Record the same exposure in the host firewall, while remembering that Docker-published ports require the additional firewall review above:
sudo ufw allow 25565/tcp
Go to Servers → Create New, select a user, node, allocation and egg, then assign memory, disk and CPU limits. For Minecraft, choose the appropriate Java or Bedrock egg and read its variables before deployment. Never accept an EULA automatically unless you have read and agreed to its terms.
- Wait for the install container to finish successfully.
- Start the server and watch the live console for a clean boot.
- Connect from a real external client using the public hostname and allocation port.
- Test SFTP on port 2022 with a non-administrator Panel user.
- Restart the host and verify Panel, queue worker, Docker, Wings and the game server recover correctly.
Pterodactyl Security Checklist
- Use HTTPS everywhere: Panel and Wings must use valid certificates when communicating over the internet.
- Protect administrator accounts: use unique passwords, two-factor authentication and the smallest required permissions.
- Keep database access local: MariaDB should not listen publicly on port 3306 for a single-host deployment.
- Limit allocations: open only game ports actually assigned to servers instead of a huge public range.
- Review eggs: an egg can run installation scripts and images. Import templates only from sources you trust.
- Do not hand users Docker access: membership in the Docker group is effectively root-level control.
- Separate tenants carefully: container isolation reduces risk but does not replace patching, quotas and monitoring.
- Keep headroom: do not allocate 100% of host RAM or disk; Ubuntu, Docker, Wings and the Panel need capacity too.
HYEHOST VPS, VDS and dedicated services include DDoS-protected connectivity, but mitigation does not repair insecure plugins, leaked Panel accounts or vulnerable game software. Patch the full stack and use application-level controls as well.
Performance and Scaling
Game servers often depend on a small number of fast CPU threads. Average CPU graphs can look low while one busy game thread is saturated. Watch tick time, player latency, memory pressure, disk latency and container restarts—not only host-wide utilisation.
- Cloud VPS: sensible for the Panel, test environments and smaller communities.
- VDS: dedicated cores improve consistency for latency-sensitive or modded game servers.
- Dedicated: best when several worlds, large player counts or sustained workloads justify the whole machine.
- Location: choose Wolverhampton for UK and European communities or Ashburn for US-focused Cloud VPS workloads; use the location nearest most players.
When scaling beyond one node, keep the Panel and database on their own server, give every Wings node a unique hostname and place backups outside the node. HYEHOST private networking can also separate eligible services without sending internal traffic over the public path.
Back Up and Update Pterodactyl
A Panel backup alone does not contain the worlds inside Wings volumes. Protect both control-plane and game data:
/var/www/pterodactyl/.env, especiallyAPP_KEY- A consistent MariaDB dump of the
paneldatabase /etc/pterodactyl/config.ymlon every Wings node/var/lib/pterodactyl/volumesor the configured game-data directory- Nginx, firewall and systemd configuration
sudo install -m 700 -d /srv/backups/pterodactyl
sudo mariadb-dump panel | sudo tee /srv/backups/pterodactyl/panel-$(date +%F).sql > /dev/null
sudo tar -czf /srv/backups/pterodactyl/config-$(date +%F).tar.gz \
/var/www/pterodactyl/.env /etc/pterodactyl /etc/nginx/sites-available/pterodactyl.conf
Copy encrypted backups to a HYEHOST Storage Box or a separate Storage VPS. Do not treat Panel-created backups stored on the same physical node as your only recovery copy. Schedule restore tests and document the APP_KEY recovery process.
Before updating, read the official release notes and back up first. Update the Panel and Wings independently using the official procedures, then check migrations, worker status, Wings connectivity and a real game-server launch.
Common Pterodactyl Installation Problems
| Problem | Likely cause | First check |
|---|---|---|
| 502 Bad Gateway | Wrong PHP-FPM socket or stopped service | systemctl status php8.3-fpm and Nginx error log |
| Panel jobs never finish | Queue worker or Redis unavailable | systemctl status pteroq redis-server |
| Wings node shows red | DNS, TLS, firewall or config mismatch | journalctl -u wings -n 100 |
| SFTP cannot connect | Using port 22 or port 2022 blocked | Use the node hostname and configured SFTP port |
| Game install fails | Egg script, DNS, disk or image pull error | Inspect the install logs and free disk space |
| Players cannot connect | Allocation or firewall mismatch | Compare Panel allocation, UFW and listening socket |
| Server killed unexpectedly | Memory limit or host OOM | dmesg -T | grep -i oom and node allocations |
Pterodactyl Panel FAQ
Can I install Pterodactyl Panel on Ubuntu 24.04?
Yes. Pterodactyl officially lists Ubuntu 24.04 as supported for both Panel and Wings. Use PHP 8.2 or 8.3 for the current 1.12 Panel documentation.
Can Pterodactyl run on a VPS?
Yes, provided the VPS supports Docker. KVM is a good fit; Pterodactyl warns that OpenVZ and many LXC deployments are unsuitable for Wings.
How much RAM does Pterodactyl need?
A separate Panel can start around 2 GB RAM. A combined Panel and small game node should generally start around 4 GB, while modded Minecraft or multiple games can require far more. Size for the game workload, not just Pterodactyl.
Does Pterodactyl support Minecraft?
Yes. Eggs are available for Minecraft Java and Bedrock variants as well as many other games. Server software licences and EULAs still apply.
Do Panel and Wings need separate servers?
No. Running both on one KVM server is fine for a small setup. Separate them when you need more nodes, maintenance isolation or steadier control-plane performance.
Which ports does Pterodactyl use?
The Panel normally uses TCP 80 and 443. Wings commonly uses TCP 8080 and SFTP uses TCP 2022. Each game server also needs the TCP or UDP allocation ports defined in the Panel.
Build the Panel Around the Workload
A secure Pterodactyl deployment is more than a working login screen. DNS and certificates must renew, Redis and the queue worker must survive reboots, Wings must reconnect, allocation ports must match the firewall, and both Panel data and game worlds need recoverable off-server backups.
Start with a HYEHOST KVM Cloud VPS for a compact deployment, move latency-sensitive game nodes to a dedicated-core VDS, or consolidate larger fleets on bare metal. Add a Storage Box for encrypted off-server copies and use HYE DNS for the Panel and node hostnames.

