Skip to content

Pterodactyl Wings

LXC: minecraft wings (CT 401) - Pterodactyl node daemon. Manages Minecraft server containers.

Instance

Setting Value
Daemon port 8080
SFTP port 2022
Config dir /etc/pterodactyl/ (symlink → /data/pterodactyl/)
Volumes $DATA_ROOT/minecraft/volumes/ (bind-mounted)
Tailscale IP <wings-ts-ip>
Not managed by Komodo (Wings starts Minecraft containers; Komodo would conflict)

Panel Setup

Node settings in the Pterodactyl Panel:

Setting Value
FQDN <wings-ts-ip> (Tailscale IP)
SSL Off
Daemon port 8080
SFTP port 2022

Use the Tailscale IP as FQDN - makes the node reachable to friends on the Tailscale network without port-forwarding.

Wings Configuration

After setting up the node in the Panel:

wings configure --panel-url https://game-panel.home.example.com --token <node-token> --node <node-id>

This writes /etc/pterodactyl/config.yml.

CORS

In config.yml, add allowed origins:

allowed_origins:
  - https://game-panel.home.example.com
  - http://192.168.50.40
  - http://<panel-ts-ip>

Without the panel's origin in allowed_origins, the console websocket is blocked by the browser.

Systemd Startup Fix

Wings must wait for Tailscale before starting (it binds to the Tailscale IP):

[Unit]
After=network.target tailscaled.service

[Service]
ExecStartPre=/bin/sleep 10

Without the delay, Wings starts before Tailscale assigns the IP and crashes.

Public Access Options

Option Notes
Friends with Tailscale Share tag:minecraft via Tailscale invite - zero port-forward required
Port-forward router Expose ports 8080 + 2022 + game ports - works but requires ISP with open ports
Cloudflare Tunnel TCP proxying; high latency for game traffic - not recommended

Key Takeaways

  • CT 401 onboot = no - start manually; Minecraft servers are on-demand
  • Wings FQDN must be the Tailscale IP so friends can connect without a public IP
  • CORS allowed_origins must include the Panel URL or browser console breaks
  • The systemd sleep delay is required - Wings crashes if Tailscale isn't up yet