Pterodactyl: Self-Host Any Game Server With a Web Panel
If you run game servers at home, you've probably done the dance: SSH in, wrestle with startup scripts, try to remember which screen session is which, and repeat every time a friend asks why the Minecraft server is down. Pterodactyl Panel solves this by wrapping all of that in a clean web UI with user management, resource limits, and per-server consoles.
Photo by Logan Voss on Unsplash
This guide walks through installing Pterodactyl on a homelab machine running Ubuntu 22.04, setting up the Wings daemon on a game server node, and deploying your first server.
What Pterodactyl Actually Is
Pterodactyl has two components:
- Panel — the web UI and API, typically installed on a separate lightweight VM or alongside other web services
- Wings — the daemon that runs on each game server node, manages Docker containers, and talks to the Panel
Each game server runs in its own Docker container. The Panel ships with "eggs" — configuration templates — for Minecraft (Java and Bedrock), Valheim, CS2, Terraria, Rust, Factorio, and dozens more. Custom eggs exist in the community for anything not in the default set.
Prerequisites
You'll need:
- A machine for the Panel (2GB RAM, 2 vCPU is enough — an LXC or small VM works)
- A machine for Wings/game servers (size depends on games — Valheim needs ~4GB RAM per instance)
- A domain or local DNS entry for the Panel
- MariaDB 10.11+ and Redis 7+ on the Panel host
- Docker on the Wings host
If you're running both Panel and Wings on the same machine (fine for home use), make sure it has at least 6GB RAM.
Installing the Panel
1. Install dependencies
apt install -y php8.3 php8.3-{cli,gd,mysql,pdo,mbstring,tokenizer,bcmath,xml,fpm,curl,zip} \
mariadb-server redis-server nginx tar unzip git curl
2. Create the database
mysql -u root -p
CREATE USER 'pterodactyl'@'127.0.0.1' IDENTIFIED BY 'your_password';
CREATE DATABASE panel;
GRANT ALL PRIVILEGES ON panel.* TO 'pterodactyl'@'127.0.0.1' WITH GRANT OPTION;
FLUSH PRIVILEGES;
3. Download 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/
4. Configure and install
cp .env.example .env
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
The p:environment:setup command walks you through your domain, timezone, and email settings interactively.
5. Set up cron and queue worker
# crontab -e
* * * * * php /var/www/pterodactyl/artisan schedule:run >> /dev/null 2>&1
Create a systemd service for the queue worker (saves to /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
[Install]
WantedBy=multi-user.target
systemctl enable --now pteroq
6. Configure Nginx
Point Nginx at /var/www/pterodactyl/public. The official docs provide a complete Nginx config — use that verbatim and update the server_name to your domain.
Like what you're reading? Subscribe to HomeLab Starter — free weekly guides in your inbox.
Installing Wings
On your game server node:
# Install Docker
curl -sSL https://get.docker.com | sh
systemctl enable --now docker
# Install Wings
mkdir -p /etc/pterodactyl
curl -Lo /usr/local/bin/wings \
https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_amd64
chmod +x /usr/local/bin/wings
Back in the Panel, go to Admin > Nodes > Create New. Fill in your Wings host's public IP (or local IP if Panel and Wings are on the same network), leave the daemon port at 8080, and save. Then click Configuration on the node and copy the config block.
Paste it into /etc/pterodactyl/config.yml on the Wings host, then start Wings:
wings --debug # first run to verify it connects
Create the Wings systemd unit at /etc/systemd/system/wings.service and enable it:
systemctl enable --now wings
When the node shows as connected in the Panel, Wings is working.
Creating Your First Server
- Admin > Locations — create a location (e.g., "homelab")
- Assign your node to that location
- Go to Servers > Create New
- Pick an egg (e.g., Minecraft Java — Paper)
- Set RAM, CPU, and disk limits
- Set the game-specific variables (Minecraft version, etc.)
- Click Create
The server will install automatically. You can open a real-time console from the Panel, start/stop/restart with one click, and see live CPU/RAM graphs per server.
User Management
Pterodactyl supports sub-users. You can give a friend access to only their server — they get a Panel login with a console, file manager, and the ability to restart but not reconfigure the machine. No more sharing SSH credentials.
Admin accounts can set per-server resource allocations, which matters when multiple people are running servers on the same node.
Useful Tips
Custom eggs: The community maintains a large collection of unofficial eggs at github.com/parkervcp/eggs. Factorio, Project Zomboid, and Satisfactory all have working eggs there.
Backups: Pterodactyl has a built-in backup system. Configure a local or S3 backup destination in Admin > Backups. Set a schedule per server and you get compressed, timestamped backups without scripting anything manually.
Reverse proxy for SFTP: Wings exposes an SFTP server on port 2022 by default. If you want to access game server files from the Panel's built-in file manager, make sure that port is accessible from where you browse.
Resource limits that actually work: Because each server runs in a Docker container, CPU throttling and memory limits are enforced at the kernel level — not just advisory. This matters if you're running three servers and don't want one runaway process to starve the others.
Wrapping Up
Pterodactyl is overkill if you run one Minecraft server for yourself, but it's the right tool once you have multiple games, multiple users, or want reliable automated restarts and backups. The setup takes an hour or two, but you get a professional management interface that scales to as many servers as your hardware supports.
The Panel UI is clean enough that non-technical friends can manage their own servers without a tutorial, which is reason enough to bother with it.
