Accessing Pterodactyl via http://123.456.789.0 works, but it's ugly, insecure, and unprofessional. This guide sets up a proper domain like https://panel.yourdomain.com with a free Let's Encrypt SSL certificate.
In your domain registrar's DNS settings, create an A record:
Type: A
Name: panel (or @ for root domain)
Value: YOUR_SERVER_IP
TTL: 300
Wait 5–10 minutes for DNS to propagate. Test with: ping panel.yourdomain.com
apt update
apt install -y nginx certbot python3-certbot-nginx
nano /etc/nginx/sites-available/pterodactyl
Paste this config (replace panel.yourdomain.com with your actual domain):
server {
listen 80;
server_name panel.yourdomain.com;
location / {
proxy_pass http://localhost:80;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
proxy_pass http://localhost:PORT accordingly.
ln -s /etc/nginx/sites-available/pterodactyl /etc/nginx/sites-enabled/
nginx -t # test config — should say "ok"
systemctl reload nginx
certbot --nginx -d panel.yourdomain.com
Certbot will:
https://panel.yourdomain.com with a valid SSL certificate that auto-renews every 90 days.
Update your docker-compose.yml to tell the panel about the new URL:
# In your docker-compose.yml, update:
APP_URL: "https://panel.yourdomain.com"
Then restart:
docker compose down && docker compose up -d
If you want your Wings daemon to also use HTTPS (recommended for production):
certbot certonly --standalone -d node.yourdomain.com
Then in /etc/pterodactyl/config.yml, update the SSL section to point to your certs at /etc/letsencrypt/live/node.yourdomain.com/
certbot renew --dry-run
Should output "Congratulations, all simulated renewals succeeded." If so, your cert will auto-renew forever.