Connect a real panel.
Play Your Way talks to the Pelican Client API. Spin a panel up, grab an API key, point the site at it, then add a Wings node to actually run game servers. Every command below is mirrored from the official Pelican docs at pelican.dev/docs and the upstream repo at github.com/pelican-dev/panel.
- Step 1
Install Docker
The panel ships as a Docker image. On Windows or macOS install Docker Desktop and make sure it's running (whale icon in the system tray).
On a Linux host the upstream one-liner is:
curl -sSL https://get.docker.com/ | CHANNEL=stable sudo sh
- Step 2
Start Pelican Panel
A ready-to-run compose file lives at
docker-compose.pelican.ymlin the project root — it mirrors the official compose.yml in the upstream repo. From a terminal in the project folder:docker compose -f docker-compose.pelican.yml up -d
Or, copy this compose file into a fresh folder and run it from there:
services: panel: image: ghcr.io/pelican-dev/panel:latest container_name: pelican restart: unless-stopped ports: - "80:80" - "443:443" environment: APP_URL: "http://localhost" APP_DEBUG: "false" APP_ENV: "production" XDG_DATA_HOME: /pelican-data MAIL_DRIVER: "log" volumes: - "pelican-data:/pelican-data" - "pelican-logs:/var/www/html/storage/logs" volumes: pelican-data: pelican-logs:If host port 80 is already in use, change the mapping to
"8080:80"AND setAPP_URL: "http://localhost:8080"so the panel knows its own external URL. Restart with the sameup -dcommand. - Step 3
Run the web installer
Open http://localhost:8080/installer (the in-repo compose maps to 8080; if you changed the host port or used the upstream
80:80mapping, adjust accordingly). Step through the on-screen installer — it sets up the database, generates the app encryption key, and prompts you to create the first admin user.⚠ Save the encryption key shown during install (Pelican's docs flag it as the value used to encrypt every stored secret). If you lose it, stored tokens become unrecoverable.
- Step 4
Create a Client API key
Logged in as the admin user you just created, in the panel UI:
- Top-right avatar → Account Settings
- Side nav → API Credentials
- Create (top right)
- Description:
Play Your Way - Allowed IPs: leave blank for local dev; lock to your site's egress IP in production
- Create
Copy the key shown — it starts with
ptlc_and Pelican only displays it once. Theptla_keys under Admin → Application API are a different scope and won't work with this site — make sure you grabbed aptlc_one. - Step 5
Add credentials to .env.local
Create a file called
.env.localin the project root (same folder aspackage.json) with:PANEL_URL=http://localhost:8080 PANEL_CLIENT_API_KEY=ptlc_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
No quotes around the values, no spaces around
=, no trailing slash onPANEL_URL. The file is gitignored — your key never ends up in the repo. Restartnpm run devafter creating the file so Next.js picks the new env vars up. - Step 6
Test the connection
Live checkCalls/api/panel/statusand verifies your key. - Step 7
Add a Wings node (to actually run game servers)
The panel is the control plane; Wings is the Linux daemon that runs the actual game-server containers. Until a Wings node is registered with the panel, "deploying" a server from the dashboard has nowhere to land.
a. Prepare the host- Linux-only — Ubuntu 22.04/24.04, Debian 11/12, Alma/Rocky 8/9, or CentOS 10. No Windows / macOS.
- KVM virtualisation supported; OpenVZ / LXC / Virtuozzo are not.
- Docker CE installed (Step 1's one-liner works here too).
b. Install WingsVerbatim from pelican.dev/docs/wings/install:
sudo mkdir -p /etc/pelican /var/run/wings sudo curl -L -o /usr/local/bin/wings \ "https://github.com/pelican-dev/wings/releases/latest/download/wings_linux_$([[ \"$(uname -m)\" == \"x86_64\" ]] && echo \"amd64\" || echo \"arm64\")" sudo chmod u+x /usr/local/bin/wings
c. Create the node in the panel- Admin Area → Nodes → Create New
- Fill FQDN (the public hostname for this host), public IP, daemon port (default
8080), SFTP port (default2022), and the memory + disk limits the host is allowed to allocate. - Save, then open the new node → Configuration tab.
- Copy the YAML block, save it on the Wings host at
/etc/pelican/config.yml. Or hit Auto Deploy Command and paste the generatedshcommand into the host's terminal — that fetches the config automatically.
d. Start Wings as a serviceQuick smoke test first — runs in the foreground with verbose logs:
sudo wings --debug
If the panel flips the node's status indicator green, Ctrl-C and install the systemd unit at
/etc/systemd/system/wings.service:[Unit] Description=Wings Daemon After=docker.service Requires=docker.service PartOf=docker.service [Service] User=root WorkingDirectory=/etc/pelican 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
sudo systemctl enable --now wings
e. Add at least one allocationIn the panel, open the node → Allocations tab → add an IP and a port range (e.g.
25565–25600for Minecraft servers). Without allocations the panel can't place servers on the node.
Once Step 6 turns green the dashboard at /dashboard becomes live for any server the API key's user account can see. The site currently uses the Client API only — read + manage existing servers. Provisioning new servers from the site requires the Application API (a ptla_ key plus an applicationFetch helper in lib/pterodactyl.js) — not wired up yet.
Before going public: lib/auth-guard.js is a stub that lets every request through. Replace its body with a real session check so the panel-fronting API routes aren't open to the internet.