
Quick answer: A reliable Pterodactyl installation is not one command. It is a small production web application made of PHP, a database, Redis, a queue worker, cron, a web server, TLS and one or more Wings nodes. The safest process is to design the topology, verify every dependency, install from the official release archive and test each service before adding game servers.
Last reviewed: 31 August 2026. This guide follows the current official Pterodactyl 1.x documentation for Ubuntu 24.04. Re-check the linked requirements before using commands on a future release.
Architecture before installation
For a small private deployment, Panel and Wings can share one KVM VPS or dedicated server. For production hosting, separating them is easier to secure and scale:
- Panel server: Nginx, PHP-FPM, MariaDB/MySQL, Redis, Pterodactyl Panel, cron and the queue worker.
- Wings node: Docker, Wings, game-server data, allocations and SFTP.
- DNS: a panel hostname such as
panel.example.comand a unique node hostname such asnode1.example.com. - Backups: encrypted off-server copies of the database,
.env,APP_KEY, Wings configuration and server data.
Do not place MariaDB, Redis or the Docker socket on a public interface. If Panel and Wings are separate, allow only the required traffic between their known addresses.
1. Confirm the host is suitable
Pterodactyl lists Ubuntu 24.04 as supported for both Panel and Wings. Wings requires Linux and Docker-capable virtualization. KVM is the predictable choice; OpenVZ and many LXC environments cannot provide the kernel features Docker needs.
Bash:
cat /etc/os-release
uname -m
systemd-detect-virt
hostname -f
ip -br address
Use a clean server where possible. Confirm that the intended hostname already resolves to the correct IP and that ports 80 and 443 are not occupied by another service.
Bash:
getent ahosts panel.example.com
sudo ss -lntup
2. Install the documented Panel dependencies
The current official requirements call for PHP 8.2 or 8.3, MySQL 5.7.22+ or MariaDB 10.2+, Redis, a web server, Composer 2 and standard archive tools. On Ubuntu 24.04, PHP 8.3 and MariaDB are available without the extra repository needed by older Ubuntu releases.
Bash:
sudo apt update
sudo apt install -y ca-certificates curl gnupg tar unzip git \
nginx mariadb-server redis-server \
php8.3 php8.3-common php8.3-cli php8.3-gd php8.3-mysql \
php8.3-mbstring php8.3-bcmath php8.3-xml php8.3-fpm \
php8.3-curl php8.3-zip
Install Composer from its official installer only after checking the current Composer instructions. The Pterodactyl documentation shows this command:
Bash:
curl -sS https://getcomposer.org/installer | sudo php -- \
--install-dir=/usr/local/bin --filename=composer
composer --version
Enable the long-running dependencies now so a reboot does not leave the Panel partially online.
Bash:
sudo systemctl enable --now mariadb redis-server php8.3-fpm nginx
sudo systemctl --no-pager --full status mariadb redis-server php8.3-fpm nginx
3. Create a least-privilege database
Generate a long random password locally and never paste it into a public support message. The database account only needs privileges on the Panel database.
SQL:
CREATE USER 'pterodactyl'@'127.0.0.1' IDENTIFIED BY 'REPLACE_WITH_A_LONG_RANDOM_PASSWORD';
CREATE DATABASE panel CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON panel.* TO 'pterodactyl'@'127.0.0.1';
FLUSH PRIVILEGES;
Using
127.0.0.1 consistently avoids surprising socket-versus-TCP behavior. A remote managed database should be restricted by private networking or an allowlist and protected with TLS.4. Download the official Panel release
Bash:
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 COMPOSER_ALLOW_SUPERUSER=1 composer install \
--no-dev --optimize-autoloader
For a first installation only, generate the encryption key:
Bash:
sudo php artisan key:generate --force
sudo grep '^APP_KEY=' .env
Back up that complete APP_KEY line outside the server immediately. Pterodactyl uses it to encrypt sensitive values. A database backup without the matching key cannot restore encrypted data.
5. Configure the application
Run the supported interactive commands from
/var/www/pterodactyl:
Bash:
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
Use the final HTTPS URL as
APP_URL. Prefer SMTP over PHP's internal mail transport. Test outbound mail before you depend on password resets or server notifications.6. Configure cron and the queue worker
Pterodactyl schedules maintenance every minute. Add this to root's crontab:
Code:
* * * * * php /var/www/pterodactyl/artisan schedule:run >> /dev/null 2>&1
Create
/etc/systemd/system/pteroq.service using the official unit:
INI:
[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
Bash:
sudo systemctl daemon-reload
sudo systemctl enable --now pteroq.service
sudo systemctl --no-pager --full status pteroq.service
A Panel that loads while
pteroq is dead is not healthy. Background actions and email can silently accumulate.7. Add Nginx and TLS
Use the current official Pterodactyl web-server configuration rather than a random abbreviated server block. It includes the front-controller route, PHP timeouts, upload limits and security headers expected by the Panel.
Choose one TLS design:
- Direct origin TLS: issue a Let's Encrypt certificate, then use the official Nginx SSL configuration.
- Cloudflare proxied DNS: still use valid origin TLS and Full (strict), not Flexible SSL.
- Cloudflare Tunnel: publish the local web service through an outbound tunnel. Read the Pterodactyl Zero Trust guide before placing Access in front of APIs.
Validate before reloading:
Bash:
sudo nginx -t
sudo systemctl reload nginx
curl -I https://panel.example.com
Finally set ownership as documented:
Bash:
sudo chown -R www-data:www-data /var/www/pterodactyl
8. Production acceptance tests
- Log in through the final HTTPS hostname and check the browser console for mixed-content or API errors.
- Confirm
systemctl is-active pteroq redis-server php8.3-fpm nginx mariadb. - Verify that cron is running and jobs leave the queue.
- Send a test email.
- Create a node and verify Panel-to-Wings connectivity before creating a customer server.
- Test Wings SFTP separately from its API/WebSocket endpoint.
- Reboot once and repeat every service check.
- Create a database backup and perform a documented restore test on staging.
Common installation mistakes
- Using an unsupported container VPS for Wings.
- Losing APP_KEY while retaining only the database dump.
- Starting Nginx with certificate paths that do not exist.
- Using Flexible SSL and then debugging redirects or insecure assets.
- Leaving the queue worker disabled.
- Opening MariaDB or Redis publicly.
- Running an unofficial one-line installer without understanding its changes.
- Assuming a successful Panel page means Wings, SFTP and game ports are configured.
Use the free planning tool
Open the Pterodactyl Installation Prompt Generator to build a prompt that makes an AI assistant ask for your topology, DNS, firewall and backup requirements before suggesting commands. The companion AI installation safety guide explains how to use it without exposing credentials.
If you need a reviewed deployment rather than a generic tutorial, open a Shyam Studio support request. For a Minecraft stack that needs custom gameplay, integrations or Folia-safe development, read how to plan a custom plugin.
Primary sources
Attachments
Last edited: