Advanced 15 min

Install Pterodactyl Panel & Wings

Complete procedure: required, installation Panel/Wings, node, phpMyAdmin, MySQL and first game servers.

#Pterodactyl#Wings#Panel games#Docker#MySQL

Ready to start your service? Check offers and order online.

View offers and order

Objective

Install Pterodactyl Panel and Wings on a Linux VPS (Debian / Ubuntu), then configure a node, phpMyAdmin and MySQL in a clean and secure manner.

The Panel is the web interface. Wings is the daemon that launches Docker containers from game servers.

Panel Architecture, Wings and Servers
Panel → Wings → game server containers
Overview of the Pterodactyl Panel (official captures)
Interface Panel - official captures pterodactyl.io
Estimated time about 15 to 25 minutes with a domain already pointed to the VPS. The installer does the bulk of the work.

Prerequisite

  • VPS Anthony IT Solutions (Debian 11/12 or Ubuntu 22.04/24.04)
  • Access root to SSH (first SSH connection)
  • Recommended minimum: 2 vCPU / 4 GB RAM / 40GB disk
  • A domain (e.g. panel.votredomaine.fr) in registration A to the IP of the VPS
  • Ports: 22, 80/443, 8080 (Wings), 2022 (SFTP), + game ports

1. Preparing the system

Log in as a root, update and restart:

apt update apt full-upgrade -y apt install -y bash curl wget sudo unzip nano ca-certificates gnupg reboot

Reconnect after reboot and check the OS:

cat /etc/os-release hostnamectl
Firewall If UFW is active, leave SSH/HTTP/HTTPS open: Configure UFW.

2. Install Panel and Wings

Launch the interactive installer:

bash <(curl -s https://pterodactyl-installer.se)
  1. Installation option

    First install Panel, then Wings on the same machine (ideal for a single VPS).

  2. FQDN domain

    Ex. panel.votredomaine.fr - the DNS A must already point to the VPS.

  3. E-mail & SSL

    Enter a valid e-mail and accept Lets Encrypt.

  4. Database

    Note the MySQL password / Panel user displayed by the script.

  5. Admin account

    Create admin Panel (e-mail, username, strong password).

Check the services:

systemctl status nginx systemctl status mariadb systemctl status wings systemctl status docker

Open https://panel.votredomaine.fr and log in with the created admin account.

3. Configure Node

  1. Rental

    Admin → Rentals → New (ex. France / FR-01).

  2. Node

    Admin → Nodes → Create :

    • Name : node-01
    • FQDN : same domain or node.votredomaine.fr
    • Memory / Disk: leave a margin for the system
    • Daemon Port : 8080
    • SFTP Port : 2022

  3. Allowances

    Add public IP + a port range (e.g. 25565-25600, 30120).

  4. Config Wings

    Open the node → tab Configuration → copy the displayed YAML.

Admin Nodes : list of nodes Pterodactyl
Admin → Nodes: Create the node (Create New button). Green heart = online node
Detail of a Pterodactyl Node (About)
Node sheet: tabs About / Settings / Configuration / Allocation / Servers

Paste the config on the VPS:

sudo nano /etc/pterodactyl/config.yml

Then restart Wings:

systemctl restart wings systemctl status wings
config.yml Contains the token Wings Never share it. Restart wings after each change.

4. Open ports (UFW)

ufw allow 22/tcp ufw allow 80/tcp ufw allow 443/tcp ufw allow 8080/tcp ufw allow 2022/tcp ufw allow 25565:25600/tcp ufw allow 30120/tcp ufw allow 30120/udp ufw enable ufw status

5. Install phpMyAdmin (optional)

cd /var/www/pterodactyl/public mkdir -p phpmyadmin && cd phpmyadmin wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip unzip phpMyAdmin-5.2.1-all-languages.zip mv phpMyAdmin-5.2.1-all-languages/* . rm -rf phpMyAdmin-5.2.1-all-languages phpMyAdmin-5.2.1-all-languages.zip cp config.sample.inc.php config.inc.php nano config.inc.php

Define a blowfish_secret random (32+ characters):

$cfg['blowfish_secret'] = 'REMPLACEZ_PAR_UNE_CHAINE_ALEATOIRE_32+';

Access: https://panel.votredomaine.fr/phpmyadmin

Security Protect phpMyAdmin (Basic Auth, IP whitelist or Fail2ban). Don't expose a MySQL account that is too privileged.

6. Configure MySQL / MariaDB

Recommended local listening:

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
bind-address = 127.0.0.1
systemctl restart mariadb

Create users (strong passwords):

mysql -u root -p
CREATE DATABASE phpmyadmin DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'phpmyadmin'@'localhost' IDENTIFIED BY 'MOT_DE_PASSE_FORT'; GRANT ALL PRIVILEGES ON phpmyadmin.* TO 'phpmyadmin'@'localhost'; CREATE USER 'games'@'localhost' IDENTIFIED BY 'AUTRE_MOT_DE_PASSE_FORT'; GRANT ALL PRIVILEGES ON *.* TO 'games'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES; EXIT;
Avoid admin@'%' An account open to the entire network is dangerous if port 3306 is exposed. Prefer localhost.

7. Create the first game server

  1. Eggs

    Admin → Nests: choose l'egg (Paper, FiveM, etc.).

  2. User

    Admin → Users: client account (or admin to test).

  3. Server

    Admin → Servers → Create : node, allocation, RAM/CPU/disc, egg, then Start.

  4. MySQL base

    Create a dedicated database with the user games and inform it in the server variables.

Admin Servers: Minecraft server file
Admin → Servers: details of a server created (resources, node, owner)

8. Verifications

  • HTTPS Panel OK
  • Node Connected
  • systemctl is-active wings docker nginx mariadb → active
  • Test server starts correctly
journalctl -u wings -n 50 --no-pager docker ps df -h free -h

Troubleshooting

  • Offline node : token / config.yml / port 8080 / systemctl restart wings
  • SSL failed: DNS A incorrect or port 80 closed
  • Installation blocked : Docker, full disk, invalid egg
  • MySQL refused : user/host/password or bind-address

Related guides