INFRASTRUCTURE

WINGS SETUP

Wings is the lightweight Go daemon that runs on every node server. It communicates with the panel over a secure WebSocket connection and manages Docker containers for each game server.

Architecture overview

The panel itself does not run game servers — it only coordinates. Wings runs on separate node machines (can be the same VPS or different ones) and receives instructions from the panel API. Each node requires its own Wings installation.

ℹ️
Current node https://node.xwolf.space:8080 — Wings v1.12.1 on Debian 13

Node requirements

RequirementDetails
OSLinux (Debian/Ubuntu recommended, kernel ≥ 5.4)
DockerLatest stable (24+)
CPU1+ vCPU (more = more servers)
RAMDepends on hosted game servers
Open portTCP 8080 (Wings HTTPS API)
Root accessRequired — Wings runs as root

1 — Install Docker

bash
curl -fsSL https://get.docker.com | bash
systemctl enable --now docker
⚠️
Disable AppArmor for Docker if on Ubuntu. Some game server images fail with AppArmor restrictions. systemctl disable --now apparmor

2 — Create Wings directory

bash
mkdir -p /etc/pterodactyl
mkdir -p /var/lib/pterodactyl/{volumes,backups,logs}

3 — Download Wings binary

bash
curl -L -o /usr/local/bin/wings \
  "https://github.com/pterodactyl/wings/releases/download/v1.12.1/wings_linux_amd64"
chmod +x /usr/local/bin/wings

4 — Create the node in the panel

  1. Log into the wolfXcore admin area at /admin/nodes.
  2. Click Create New.
  3. Fill in: name, FQDN (node.xwolf.space), port (8080), memory & disk allocations.
  4. Set Communication over SSL to Yes if Wings is behind SSL.
  5. Save. Then navigate to the Configuration tab of the new node.
  6. Click Generate Token — copy the YAML config block.

5 — Write the Wings config

Paste the generated YAML into /etc/pterodactyl/config.yml.

A typical config looks like:

/etc/pterodactyl/config.yml
debug: false
uuid: NODE-UUID-HERE
token_id: TOKEN-ID-HERE
token: TOKEN-SECRET-HERE
api:
  host: 0.0.0.0
  port: 8080
  ssl:
    enabled: true
    cert: /etc/letsencrypt/live/node.xwolf.space/fullchain.pem
    key:  /etc/letsencrypt/live/node.xwolf.space/privkey.pem
  upload_limit: 100
system:
  data: /var/lib/pterodactyl/volumes
  sftp:
    bind_port: 2022
remote: 'https://panel.xwolf.space'
remote_configuration: 'https://panel.xwolf.space'

6 — SSL certificate for the node

bash
apt install -y certbot
certbot certonly --standalone -d node.xwolf.space \
  --agree-tos -m admin@xwolf.space --no-eff-email

Add a cron to auto-renew:

bash
echo "0 3 * * * root certbot renew --quiet \
  --deploy-hook 'systemctl restart wings'" \
  >> /etc/cron.d/certbot-renew

7 — Systemd service

/etc/systemd/system/wings.service
[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
bash
systemctl enable --now wings
systemctl status wings

8 — Port allocations

Allocations are the IP + port combinations that Wings can assign to game servers. Without them the panel refuses to create servers ("allocation id is required"). Add them once per node; they are shared across all servers on that node.

Go to Admin → Nodes → xwolf-node-1 → Allocations and enter the node IP with a port or range, then click Submit. Alternatively, insert them directly via SQL (fastest for bulk setup):

sql
-- Run inside the wolfxcore database
INSERT INTO allocations (node_id, ip, ip_alias, port, created_at, updated_at)
VALUES
  (1, '161.97.100.158', 'node.xwolf.space', 25565, NOW(), NOW()),
  (1, '161.97.100.158', 'node.xwolf.space', 25566, NOW(), NOW());
-- Or use a range — see installation guide for the full loop query

xwolf-node-1 — current allocation ranges

Port rangeCountUse
7777 – 781034ARK: Survival Evolved, general game servers
9987 – 100226TeamSpeak 3 / voice servers
25565 – 2560036Minecraft (Vanilla, Paper, Spigot, BungeeCord)
27015 – 2705036Rust, CS2, other Steam games
30000 – 3004950Node.js bots, Discord bots, APIs, general purpose
ℹ️
Auto-selection — the panel automatically picks the first free port when you create a server. You only need to change it manually if you want a specific port number. Once a port is assigned to a server it is removed from the available pool until that server is deleted.

9 — Firewall rules

bash
ufw allow 8080/tcp   # Wings API
ufw allow 2022/tcp   # SFTP
ufw allow 443/tcp    # HTTPS (if panel on same node)
ufw allow 80/tcp     # HTTP (cert renewal)
ufw enable

Verifying the connection

After Wings starts, check it connected successfully:

  1. In the panel admin area, go to Nodes.
  2. The node should show a green heartbeat dot.
  3. If red — check journalctl -u wings -f for errors.
  4. Verify the panel's URL is reachable from the node machine.
Tip Run wings --debug temporarily to see verbose output during troubleshooting. Stop it with Ctrl+C, then restart the service.

Updating Wings

bash
systemctl stop wings
curl -L -o /usr/local/bin/wings \
  "https://github.com/pterodactyl/wings/releases/download/vX.Y.Z/wings_linux_amd64"
chmod +x /usr/local/bin/wings
systemctl start wings