Skip to content
Play Your Way logoPlay Your Way
section.setup

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.

  1. 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
  2. Step 2

    Start Pelican Panel

    A ready-to-run compose file lives at docker-compose.pelican.yml in 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 set APP_URL: "http://localhost:8080" so the panel knows its own external URL. Restart with the sameup -d command.

  3. 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:80 mapping, 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.

  4. 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. The ptla_ keys under Admin → Application API are a different scope and won't work with this site — make sure you grabbed a ptlc_ one.

  5. Step 5

    Add credentials to .env.local

    Create a file called .env.local in the project root (same folder as package.json) with:

    PANEL_URL=http://localhost:8080
    PANEL_CLIENT_API_KEY=ptlc_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

    No quotes around the values, no spaces around =, no trailing slash on PANEL_URL. The file is gitignored — your key never ends up in the repo. Restart npm run dev after creating the file so Next.js picks the new env vars up.

  6. Step 6

    Test the connection

    Live check
    Calls /api/panel/status and verifies your key.
  7. 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 Wings

    Verbatim 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 (default 2022), 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 generated sh command into the host's terminal — that fetches the config automatically.
    d. Start Wings as a service

    Quick 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 allocation

    In the panel, open the node → Allocations tab → add an IP and a port range (e.g. 25565–25600 for Minecraft servers). Without allocations the panel can't place servers on the node.

What's next

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.