Pterodactyl Panel: Installing Game Servers the Easy Way
Background
I kept hearing about Pterodactyl but never actually tried it.
So I spun up a fresh Debian 13 VM and followed the official docs from scratch.
No shortcuts. No prior setup. Just the guide.
What Is Pterodactyl?
An open-source game server management panel.
Every game server runs in an isolated Docker container. The architecture splits into two parts:
- Panel — the web UI and API
- Wings — the daemon that runs and manages the containers on the node
Panel and Wings don’t need to be on the same machine. That separation matters when you want to scale.
Installation
Dependencies first — PHP 8.3, MariaDB, Redis, NGINX:
apt -y install php8.3 php8.3-{common,cli,gd,mysql,mbstring,bcmath,xml,fpm,curl,zip} \
mariadb-server nginx tar unzip git redis-server
curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
Then download and extract the panel:
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/
After that, the CLI takes over:
cp .env.example .env
COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader
php artisan key:generate --force
php artisan p:environment:setup
php artisan p:environment:database
php artisan migrate --seed --force
php artisan p:user:make
One thing worth noting: back up your APP_KEY from .env immediately.
If you lose it, all encrypted data is gone. Even with a full database backup.
Queue Worker
Pterodactyl needs a background queue for scheduling and emails. A crontab entry and a systemd unit handle that:
# crontab -e
* * * * * php /var/www/pterodactyl/artisan schedule:run >> /dev/null 2>&1
# /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
Wings
Wings is a single Go binary. Easiest part of the whole setup:
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
Generate a config.yml from the panel UI under Node settings, drop it into /etc/pterodactyl/, done.
Wings connects back to the panel automatically.
Deploying a Game Server
This is where it gets interesting.
Pterodactyl ships with Eggs — pre-configured templates for games. The community maintains hundreds of them at eggs.pterodactyl.io.
Deploying Valheim:
- Create a server, pick the Valheim egg
- Set RAM, CPU, and disk limits
- Hit install
Wings pulls the image, runs the install script, Steam downloads the server files.
A few minutes later the server is up.
No manual port mapping. No Compose file. No SSH into the node.
What Stood Out
Eggs make adding games trivial. Import a JSON, done. The community covers almost everything.
Resource limits are enforced at the container level. A runaway server can’t take down the whole node.
The API covers everything. Server creation, power controls, file management, backups — all exposed via REST.
Wings is lightweight. Go binary, minimal overhead, systemd managed.
What to Watch Out For
Not for OpenVZ or LXC hosts. Pterodactyl needs real Docker support. A lot of cheap VPS providers won’t work.
Telemetry is on by default since 1.11. Opt out in the additional configuration if that’s a concern.
Conclusion
I expected more friction.
The docs are clear, the architecture is clean, and the time from zero to a running game server was shorter than I expected.
If you’ve been curious about Pterodactyl: just follow the official docs top to bottom.
It works.