Wings installation
Install the Panasaurus Wings daemon — Rust node daemon for the panel — with the automated installer or by hand.
Wings is the daemon that actually runs your servers: it talks to the Docker daemon, streams console output, serves files and SFTP, and takes backups. One Wings instance runs per physical node, and it registers with the panel as a node.
Requirements
- Ubuntu 22.04+ or Debian 12 (apt-based, systemd)
- amd64 or arm64 CPU
- Docker — the installer sets it up if missing, since Wings cannot run servers without it
- A reachable panel with a node created for this machine
Panel-side preparation
Before installing on the node, collect three values from the panel:
- A node. Create one under Admin → Nodes. Set the Connection Address to the URL the panel will use to reach this machine — scheme and port included, for example
https://node.example.com:8081. Note the numeric node ID from the URL after saving. - An application API key. Generate one under Admin → Application API. Wings uses it to pull its own configuration from the panel on first boot.
- That is it — the daemon configures everything else itself.
The connection URL must match exactly
The connection URL is embedded in the daemon's config as its JWT audience.
It has to match the panel's node address byte for byte — including the
https:// and the port. A mismatch shows up as authentication failures
between panel and daemon, not as a config error, and it is the single most
common Wings support question on the
Discord.
Option A — the automated installer
bash install.sh --wings --panel-url https://panel.example.com \
--node-url https://node.example.com:8081 \
--token YOUR_APPLICATION_API_KEY --node 1The installer:
- Detects the architecture and installs build dependencies (curl, libssl-dev, e2fsprogs, and friends)
- Downloads
wings-linux-amd64.tar.gz(orarm64) from the Wings releases - Installs the binary to
/usr/local/bin/panasaurus-wings— using the prebuilt executable from the release when present, otherwise compiling the Rust source withcargo build --locked --release(rustup is installed automatically if needed) - Prints the binary's SHA-256 so you can pin it in provisioning
- Generates
/etc/panasaurus/config.ymlwith the daemon's own--configurecommand — the API token travels through an environment variable, never a process argument - Asks the daemon to emit its own systemd unit, enables it, and starts the service
- Waits for the API to answer on port 8080 and opens ports 8080 and 2022 in your firewall
When it finishes, check the panel: the node's heart icon should turn green within a minute.
Option B — manual installation
Download a release, unpack, and install the binary:
curl -fsSLO https://github.com/panasaurus/wings/releases/latest/download/wings-linux-amd64.tar.gz
tar -xzf wings-linux-amd64.tar.gz
install -m 0755 panasaurus-wings /usr/local/bin/panasaurus-wingsCreate the configuration. The destination file must not exist yet, and the token is read from the environment:
mkdir -p /etc/panasaurus /var/lib/panasaurus
export PANASAURUS_APPLICATION_TOKEN="YOUR_APPLICATION_API_KEY"
panasaurus-wings --configure \
--panel-url https://panel.example.com \
--node-id 1 \
--token-env PANASAURUS_APPLICATION_TOKEN \
--node-url https://node.example.com:8081 \
--config /etc/panasaurus/config.yml
unset PANASAURUS_APPLICATION_TOKEN
chmod 0600 /etc/panasaurus/config.ymlGenerate and install the systemd unit the same way the installer does — the daemon writes its own unit so the exec line always matches the binary:
panasaurus-wings --systemd-unit --config /etc/panasaurus/config.yml \
> /etc/systemd/system/panasaurus-wings.service
systemctl daemon-reload
systemctl enable --now panasaurus-wingsOpenRC
The installer only automates systemd. On OpenRC, install the binary and
config exactly as above and write your own service file — the unit the
daemon generates is a good template for the command, arguments, and
depend lines.
Verifying the installation
systemctl status panasaurus-wings
journalctl -u panasaurus-wings -f
curl -k https://127.0.0.1:8080/openapi.json | head -c 200A healthy daemon answers /openapi.json with its full API document. If the panel still shows the node offline after a couple of minutes, the configuration reference and the TLS pages cover the usual suspects — jwt_audience mismatches first among them.