Pterodactyl is a free, open-source, Docker-based game server management panel. This guide walks you through a complete, production-ready installation on Ubuntu 24.04 LTS — covering PHP 8.3, MariaDB, Redis, Nginx, Let's Encrypt SSL, and the Wings daemon.
Published: 25 May 2026 · Reading time: ~15 minutes · Difficulty: Intermediate
Requirements & Server Specifications
Before you begin, make sure your dedicated server meets the minimum specifications. Running Pterodactyl on shared hosting or a low-resource VPS will result in instability under load.
- Operating System: Ubuntu 24.04 LTS
- CPU: 4+ cores recommended
- RAM: 8 GB+ recommended
- Storage: 100 GB+ NVMe SSD recommended
- PHP Version: PHP 8.3
- Domain Name: Required — you need a domain pointed to your server IP for SSL
PHP 8.1 is not supported: Pterodactyl Panel 1.11+ requires PHP 8.2 or 8.3. Do not follow guides that use PHP 8.1 — they will not work on a current installation.
What Is Pterodactyl Panel?
Pterodactyl consists of two parts: Panel (The web interface) and Wings (The daemon installed on each node that monitors game servers inside Docker containers). Because each game server runs in its own Docker container, a crashing modpack cannot affect other servers. This makes Pterodactyl an excellent fit for a bare-metal dedicated server.
Step 1 — Update the System
Always start with a fully updated system. Run all commands as root.
apt update && apt upgrade -y
apt install -y curl wget git unzip tar software-properties-common apt-transport-https ca-certificates gnupg lsb-release
Step 2 — Install Required Dependencies
Install Nginx and set up the PHP 8.3 repository via the Ondřej Surý PPA.
apt install -y nginx
LC_ALL=C.UTF-8 add-apt-repository -y ppa:ondrej/php
apt update
Step 3 — Install PHP 8.3
Install PHP 8.3 and all required extensions, then enable PHP-FPM.
apt install -y php8.3 php8.3-fpm php8.3-cli php8.3-common php8.3-mysql php8.3-mbstring php8.3-bcmath php8.3-xml php8.3-curl php8.3-zip php8.3-gd php8.3-tokenizer php8.3-intl
systemctl enable php8.3-fpm
systemctl start php8.3-fpm
Step 4 — Install MariaDB & Create the Database
Install MariaDB and secure the installation.
apt install -y mariadb-server mariadb-client
systemctl enable mariadb
systemctl start mariadb
mysql_secure_installation
Log in to MySQL (mysql -u root -p) and create the database:
CREATE DATABASE pterodactyl;
CREATE USER 'pterodactyl'@'127.0.0.1' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON pterodactyl.* TO 'pterodactyl'@'127.0.0.1';
FLUSH PRIVILEGES;
EXIT;
Step 5 — Install Redis
curl -fsSL https://packages.redis.io/gpg | gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/redis.list
apt update
apt install -y redis-server
systemctl enable redis-server
systemctl start redis-server
Step 6 — Install Composer
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
Step 7 — Download & Configure the Panel
Set up the web directory and install Laravel dependencies.
mkdir -p /var/www/pterodactyl
cd /var/www/pterodactyl
curl -Lo panel.tar.gz https://github.com/pterodactyl/panel/releases/latest/download/panel.tar.gz
tar -xzvf panel.tar.gz
chmod -R 755 storage/* bootstrap/cache/
cp .env.example .env
composer install --no-dev --optimize-autoloader
php artisan key:generate --force
Run the environment setup wizard and create your admin user:
php artisan p:environment:setup
php artisan p:environment:database
php artisan migrate --seed --force
php artisan p:user:make
chown -R www-data:www-data /var/www/pterodactyl/*
Step 8 — Configure Nginx & SSL
Create an Nginx configuration file: nano /etc/nginx/sites-available/pterodactyl.conf
server {
listen 80;
server_name panel.yourdomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name panel.yourdomain.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;
ssl_certificate /etc/letsencrypt/live/panel.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/panel.yourdomain.com/privkey.pem;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1.2 TLSv1.3;
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_read_timeout 300;
}
location ~ /\.ht {
deny all;
}
}
Enable the site and install SSL via Certbot:
ln -s /etc/nginx/sites-available/pterodactyl.conf /etc/nginx/sites-enabled/
apt install -y certbot python3-certbot-nginx
certbot certonly --nginx -d panel.yourdomain.com --email you@yourdomain.com --agree-tos -n
systemctl reload nginx
Step 9 — Set Up the Queue Worker & Cron
Create the queue worker service (nano /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
systemctl enable pteroq.service
systemctl start pteroq.service
(crontab -u www-data -l 2>/dev/null; echo "* * * * * php /var/www/pterodactyl/artisan schedule:run >> /dev/null 2>&1") | crontab -u www-data -
Step 10 — Install Docker & Wings
Install Docker and download the Wings daemon.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
systemctl enable docker
systemctl start docker
mkdir -p /etc/pterodactyl
curl -L -o /usr/local/bin/wings "https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_amd64"
chmod u+x /usr/local/bin/wings
Create the Wings service (nano /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
Step 11 — Link Wings to the Panel
Log in to your Panel. Go to Admin Panel → Nodes → Create New. Fill in the details, save, and go to the Configuration tab. Copy the auto-deploy command and run it on your server:
cd /etc/pterodactyl && wings configure --panel-url https://panel.yourdomain.com --token your_token_here --node 1
systemctl enable wings
systemctl start wings
Step 12 — Add Your First Game Server & Firewall Setup
Go to Admin Panel → Servers → Create New Server. Finally, ensure your firewall allows the necessary ports:
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 8080/tcp
ufw allow 25565/tcp
ufw allow 27015/udp
ufw allow 7777/udp
ufw enable
Ready to Host Your Game Servers?
Pterodactyl performs best on bare-metal dedicated hardware — full CPU access, NVMe storage, and no noisy neighbours competing for your game server's resources. eServers provides DDoS-protected, low-latency dedicated servers from UK data centres.
Need a more powerful hosting solution? Contact the eServers team today for 24/7 expert support.
Discover eServers Dedicated Server Locations
eServers provides reliable dedicated servers across multiple global regions. Whether you need low latency, regional compliance, or proximity to your audience, our wide geographic coverage ensures the perfect hosting environment for your project.