Install Pterodactyl Panel on Any VPS (2026)
Pterodactyl Panel is the most popular open-source game server management panel. This guide walks you through a complete Docker Compose install โ the cleanest and most maintainable setup method in 2026.
1. Prepare Your VPS
Connect via SSH
Log into your VPS as root or a sudo user:
ssh root@YOUR_SERVER_IP
Update the system
apt update && apt upgrade -y
Install Docker & Docker Compose
curl -fsSL https://get.docker.com | sh
systemctl enable --now docker
docker --version should output something like Docker version 27.x2. Set Up the Docker Compose Stack
Create the project directory
mkdir -p /srv/pterodactyl && cd /srv/pterodactyl
Create docker-compose.yml
Paste this entire file โ it sets up the Panel, MariaDB, and Redis in one shot:
version: '3.8'
services:
database:
image: mariadb:10.5
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: panel
MYSQL_USER: pterodactyl
MYSQL_PASSWORD: dbpassword
volumes:
- db_data:/var/lib/mysql
cache:
image: redis:alpine
restart: always
panel:
image: ghcr.io/pterodactyl/panel:v1.11.10
restart: always
ports:
- "80:80"
- "443:443"
depends_on:
- database
- cache
environment:
APP_URL: "http://YOUR_SERVER_IP"
APP_TIMEZONE: "UTC"
APP_SERVICE_AUTHOR: "your@email.com"
DB_HOST: database
DB_PORT: 3306
DB_DATABASE: panel
DB_USERNAME: pterodactyl
DB_PASSWORD: dbpassword
CACHE_DRIVER: redis
SESSION_DRIVER: redis
QUEUE_DRIVER: redis
REDIS_HOST: cache
volumes:
- panel_var:/app/var
- panel_nginx:/etc/nginx/http.d
- panel_logs:/app/storage/logs
- panel_certs:/etc/letsencrypt
volumes:
db_data:
panel_var:
panel_nginx:
panel_logs:
panel_certs:
rootpassword and dbpassword with strong unique passwords before deploying.3. Start the Panel
docker compose up -d
Wait ~60 seconds for all containers to start and the database to initialize. Then check status:
docker compose ps
All three services (database, cache, panel) should show Up or running.
4. Create Your Admin User
docker compose exec panel php artisan p:user:make
Follow the prompts โ enter your email, username, name, and set a password. When asked "Should this user be an administrator?", type yes.
5. Access Your Panel
Open your browser and navigate to:
http://YOUR_SERVER_IP
Log in with the admin account you just created. You should see the Pterodactyl dashboard. ๐
6. Install Wings (Game Server Daemon)
Wings is the backend that runs your actual game servers. Install it on the same machine (or a separate node):
# Install Wings
mkdir -p /etc/pterodactyl
curl -L -o /usr/local/bin/wings \
"https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_amd64"
chmod +x /usr/local/bin/wings
Then in your Pterodactyl Panel:
- Go to Admin โ Nodes โ Create New
- Fill in your server IP, name, and memory/disk limits
- Click Generate Token and copy the config
- Paste the config into
/etc/pterodactyl/config.ymlon your server - Start Wings:
wings --debug(test first), then set up the systemd service
Create Wings systemd service
cat > /etc/systemd/system/wings.service << 'EOF'
[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
EOF
systemctl enable --now wings
7. Create Your First Game Server
Back in the panel:
- Go to Admin โ Servers โ Create New
- Select the node you just added
- Choose a game egg (e.g., Minecraft Paper)
- Set memory and disk limits
- Hit Create โ your server will install automatically
Common Issues
Panel shows 502 Bad Gateway
The PHP-FPM service inside the container is still starting. Wait 30 seconds and refresh. If it persists: docker compose restart panel
Wings can't connect to panel
Check your firewall โ port 8080 (Wings API) must be open. On Ubuntu: ufw allow 8080. Also verify the Panel URL in your Node config matches exactly.
Database connection refused
Make sure all three containers are running: docker compose ps. If the DB container exited, check logs: docker compose logs database
Server stuck on "Installing"
Wings may not be connected. Check: systemctl status wings and look at Wings logs: journalctl -u wings -f