Skip to content

Install Pterodactyl Panel

This guide documents a standard production-oriented installation flow for the Pterodactyl Panel on Ubuntu Linux. The sequence is structured for infrastructure teams that want predictable deployment behavior and clear rollback points.

Use a clean server with root or sudo access and a valid DNS record pointing to your panel domain. For stable hosting operations, use an UltraVM VPS sized for your expected panel load.

Terminal window
sudo apt update && sudo apt -y upgrade
sudo apt -y install software-properties-common curl apt-transport-https ca-certificates gnupg

Install web, PHP, database, cache, and utility dependencies:

Terminal window
sudo add-apt-repository -y ppa:ondrej/php
sudo apt update
sudo apt -y install nginx mariadb-server redis-server \
php8.3 php8.3-cli php8.3-gd php8.3-mysql php8.3-pdo php8.3-mbstring \
php8.3-tokenizer php8.3-bcmath php8.3-xml php8.3-fpm php8.3-curl php8.3-zip \
unzip git
Terminal window
cd /tmp
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
composer --version

Secure MariaDB and create credentials for the panel:

Terminal window
sudo mysql_secure_installation
sudo mysql -u root -p

Inside the MariaDB shell:

CREATE DATABASE panel;
CREATE USER 'pterodactyl'@'127.0.0.1' IDENTIFIED BY 'CHANGE_THIS_STRONG_PASSWORD';
GRANT ALL PRIVILEGES ON panel.* TO 'pterodactyl'@'127.0.0.1';
FLUSH PRIVILEGES;
EXIT;
Terminal window
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

Step 6: Install PHP Dependencies and Configure App

Section titled “Step 6: Install PHP Dependencies and Configure App”
Terminal window
sudo composer install --no-dev --optimize-autoloader
sudo php artisan key:generate --force

Run the panel environment setup:

Terminal window
sudo php artisan p:environment:setup
sudo php artisan p:environment:database
sudo php artisan migrate --seed --force
sudo php artisan p:user:make
Terminal window
sudo chown -R www-data:www-data /var/www/pterodactyl/*

Create cron entry:

Terminal window
(crontab -l 2>/dev/null; echo "* * * * * php /var/www/pterodactyl/artisan schedule:run >> /dev/null 2>&1") | crontab -

Create systemd service /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

Enable and start it:

Terminal window
sudo systemctl daemon-reload
sudo systemctl enable --now pteroq.service

Create /etc/nginx/sites-available/pterodactyl.conf:

server {
listen 80;
server_name panel.example.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;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php8.3-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;
include /etc/nginx/fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}

Enable site and reload:

Terminal window
sudo ln -s /etc/nginx/sites-available/pterodactyl.conf /etc/nginx/sites-enabled/pterodactyl.conf
sudo nginx -t
sudo systemctl reload nginx

Use Let�s Encrypt for production:

Terminal window
sudo apt -y install certbot python3-certbot-nginx
sudo certbot --nginx -d panel.example.com

Confirm services and logs:

Terminal window
systemctl status nginx php8.3-fpm mariadb redis-server pteroq

If you are deploying nodes next, continue with Install Pterodactyl Wings.