Advanced

Nginx Reverse Proxy + SSL for Pterodactyl Panel (2026)

⏱️ 18 min read 🔒 SSL/HTTPS 📅 Updated May 2026

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.

Prerequisites: Pterodactyl Panel running (see install guide), a domain name pointed to your server IP (A record), and root VPS access.

Step 1 — Point Your Domain

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

Step 2 — Install Nginx & Certbot

apt update
apt install -y nginx certbot python3-certbot-nginx

Step 3 — Create Nginx Config

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;
    }
}
Note: If your Pterodactyl Panel is running on a port other than 80 inside Docker, update proxy_pass http://localhost:PORT accordingly.

Step 4 — Enable the Site

ln -s /etc/nginx/sites-available/pterodactyl /etc/nginx/sites-enabled/
nginx -t    # test config — should say "ok"
systemctl reload nginx

Step 5 — Get Your SSL Certificate

certbot --nginx -d panel.yourdomain.com

Certbot will:

  1. Ask for your email (for renewal reminders)
  2. Agree to Let's Encrypt ToS
  3. Automatically modify your Nginx config to add SSL
  4. Set up auto-renewal via a systemd timer
✅ Done! Your panel is now accessible at https://panel.yourdomain.com with a valid SSL certificate that auto-renews every 90 days.

Step 6 — Update APP_URL in Pterodactyl

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

Step 7 — Wings SSL (For Node Connections)

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/

Verify Auto-Renewal

certbot renew --dry-run

Should output "Congratulations, all simulated renewals succeeded." If so, your cert will auto-renew forever.

Next Steps