Aflorzy logo

Pelican Game Server Panel + Wings in Docker - 2026 Edition

Published Mar 28, 2026

A step-by-step tutorial on how to set up the Pelican game server panel and Wings node in Docker, with Nginx Proxy Manager as a reverse proxy. This guide will walk you through the installation process and help you get your first Minecraft server up and running with Pelican.

Written by Andrew Flores

game serverdockertutorialnginx proxy managerminecraft

This is an updated version of my original Pelican in Docker tutorial from 2024, updated for 2026 with the latest versions of Pelican and Wings. The installation process is mostly the same, but there are some new features and changes to be aware of.

Over time, the official documentation for running Pelican in Docker has evolved and become simpler, and the maintainers always publish an official Docker image for each release that we can use instead of building the images ourselves.

Assumptions

In order to keep this guide relatively concise, we need to assume a few things about your setup.

  1. Debian-based Linux distro (Ubuntu) with Docker installed
  2. Familiarity with Docker and Docker Compose
  3. You own a Domain name and have your reverse proxy set up to hand out wildcard SSL certificates. We will use Nginx Proxy Manager (NPM) in this guide, but similar concepts apply to other reverse proxies. It is best if the reverse proxy is running on a different machine or VM on your network than where Pelican will be running.

Getting Started

The first part of this guide will be setting up and configuring the Pelican Panel web interface. The panel is where you will manage your game servers, and it also serves as the central hub for your Wings nodes to connect to. The panel will be running in a Docker container, and we will use Docker Compose to manage the stack. The second part of the guide will be setting up a Wings node, which is the service that actually runs your game servers. Wings will also be running in a Docker container on the same machine as the panel, but it could also be run on a different machine if you wanted to distribute your nodes across multiple servers.


  1. SSH into your debian-based linux machine on which to install Pelican
  2. Update package repositories with sudo apt update && sudo apt upgrade -y
  3. Install Docker and Docker Compose
  4. Make a pelican directory in home folder with mkdir ~/pelican && cd ~/pelican
  5. Create a Docker Compose file in the pelican directory with touch ~/pelican/docker-compose.yml and paste the following contents, replacing <YOUR_EMAIL_HERE> with your email address, <YOUR_NPM_IP_ADDRESS> (e.g. 192.168.1.100) with the IP address of your reverse proxy (no port required assuming it’s listening on ports 80 and 443 already), and <YOUR_HTTPS_PANEL_URL_HERE> with the HTTPS URL of your panel (e.g., https://pelican.local.example.com).
~/pelican/docker-compose.yml
services:
panel:
image: ghcr.io/pelican-dev/panel:latest
container_name: pelican_panel
restart: always
networks:
- default
ports:
- "80:80"
- "443:443"
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
- pelican-data:/pelican-data
- pelican-logs:/var/www/html/storage/logs
- ./Caddyfile:/etc/caddy/Caddyfile
environment:
XDG_DATA_HOME: /pelican-data
APP_URL: "<YOUR_HTTPS_PANEL_URL_HERE>"
ADMIN_EMAIL: "<YOUR_EMAIL_HERE>"
BEHIND_PROXY: "true"
TRUSTED_PROXIES: "<YOUR_NPM_IP_ADDRESS>"
volumes:
pelican-data:
pelican-logs:
networks:
default:
ipam:
config:
- subnet: 172.20.0.0/16

Then create a Caddyfile in the same directory ~/pelican/Caddyfile (no file extension) with the following contents, replacing <YOUR_NPM_IP_ADDRESS> with the IP address of your reverse proxy. The Caddyfile is used to configure the web server that serves the Pelican panel. We need to tell Caddy to trust our reverse proxy so that it can properly handle requests and forward them to the panel

~/pelican/Caddyfile
{
admin off
servers {
trusted_proxies static <YOUR_NPM_IP_ADDRESS>
}
}
:80 {
root * /var/www/html/public
encode gzip
php_fastcgi 127.0.0.1:9000 {
env PHP_VALUE "upload_max_filesize = 512M
post_max_size = 512M"
}
file_server
}

Accessing the Panel

Start the Docker Compose stack with docker compose up -d. Note: You may need to prefix your docker commands with sudo if your user is not in the docker group

View the logs with docker logs -f pelican_panel

Since we are using NPM as a reverse proxy to access our panel at a custom domain, we need to add a “Proxy Host” entry in NPM pointing at our server. As seen in the compose file, we are exposing ports 80 and 443 for HTTP and HTTPS traffic, respectively.

In NPM, add a new Proxy Host with the following settings:

NPM Proxy Host DetailsNPM Proxy Host SSL Settings

Then navigate your browser to the domain you set up in NPM with the path /installer appended and you should see the Pelican panel login page (e.g. https://pelican.local.example.com/installer).

Setup Steps

01 Server Requirements:

Everything should be filled out on this page already and you can click Next in the bottom right.

Pelican Installer Server Requirements

02 Environment:

Here you will see your App Name and App URL pre-filled. You can change the App Name if you want, but make sure the App URL is correct and matches the APP_URL in your compose file. Then click Next in the bottom right.

This is where you will set up your admin account. Fill out the email, username, and password fields and click Next in the bottom right.

Pelican Installer Environment Settings

03 Database:

We will use the default SQLite database so you can just click Next in the bottom right.

Pelican Installer Database Settings

04 Eggs:

Eggs are Pelican’s name for plugins. There are hundreds of eggs available and you can choose any on this page if you’d like, but I would recommend sticking with the defaults for now. You will be able to install more eggs later from the panel. Click Next in the bottom right when you’re ready.

Pelican Installer Eggs

05 Cache:

Choose the default Cache Driver of “Filesystem” and click Next in the bottom right.

Pelican Installer Cache Settings

06 Queue:

Choose the default Queue Driver of “Database” and click Next in the bottom right.

Pelican Installer Queue Settings

07 Session:

Finally, choose the default Session Driver of “Filesystem” and click Finish in the bottom right.

Pelican Installer Session Settings

Congratulations! You’ve successfully installed the Pelican panel in Docker. You can click through the tabs on the left and get familiar with the interface and settings. Next, we will set up a Wings node to run our first Minecraft server!

(Note: If your Health tab has an error about the Database, don’t worry - it should go away in a few minutes once the panel finishes setting up the database and runs the health checks again.)

Pelican Panel Dashboard

Setting up a Wings Node

The official Pelican Wings documentation doesn’t have instructions for running Wings in Docker, but it’s actually very simple to set up. We will modify our Docker Compose file to add a new service for Wings.

Update your docker-compose.yml file to look like this, replacing <YOUR_EMAIL_HERE> with your email address, <YOUR_NPM_IP_ADDRESS> with the IP address of your Reverse Proxy, and <YOUR_HTTPS_PANEL_URL_HERE> with the HTTPS URL of your panel (e.g., https://pelican.local.example.com).

~/pelican/docker-compose.yml
services:
panel:
image: ghcr.io/pelican-dev/panel:latest
container_name: pelican_panel
restart: always
networks:
- default
ports:
- "80:80"
- "443:443"
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
- pelican-data:/pelican-data
- pelican-logs:/var/www/html/storage/logs
- ./Caddyfile:/etc/caddy/Caddyfile
environment:
XDG_DATA_HOME: /pelican-data
APP_URL: "<YOUR_HTTPS_PANEL_URL_HERE>"
ADMIN_EMAIL: "<YOUR_EMAIL_HERE>"
BEHIND_PROXY: "true"
TRUSTED_PROXIES: "<YOUR_NPM_IP_ADDRESS>"
wings:
image: ghcr.io/pelican-dev/wings:latest
container_name: pelican_wings
restart: unless-stopped
networks:
- wings0
ports:
- "2022:2022"
- "8443:443"
- "8080:8080"
environment:
TZ: "UTC"
WINGS_UID: 998
WINGS_GID: 998
WINGS_USERNAME: pelican
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "/var/lib/docker/containers/:/var/lib/docker/containers/"
- "/etc/pelican/:/etc/pelican/"
- "/var/lib/pelican/:/var/lib/pelican/"
- "/var/log/pelican/:/var/log/pelican/"
- "/tmp/pelican/:/tmp/pelican/"
- "/etc/ssl/certs:/etc/ssl/certs:ro"
volumes:
pelican-data:
pelican-logs:
networks:
default:
ipam:
config:
- subnet: 172.20.0.0/16
wings0:
name: wings0
driver: bridge
ipam:
config:
- subnet: 172.21.0.0/16
driver_opts:
com.docker.network.bridge.name: wings0

Restart the stack with docker compose down && docker compose up -d. Both the Panel and Wings containers should start up. If you check the Panel logs with docker logs -f pelican_panel, you should not see any errors, but when you check the Wings logs with docker logs -f pelican_wings you will see the below error:

Pelican Wings Error

This is completely normal, as the Wings container is looking for its configuration file, but we haven’t set up the node in the panel yet so the config file hasn’t been generated. Let’s fix that now!


Create a Proxy Host in NPM for the Wings node with the following settings:

NPM Proxy Host Details for WingsNPM Proxy Host SSL Settings for Wings

Then navigate to the Nodes tab in the Pelican panel and click “Create Node”. Fill out the form with the following settings:

Pelican Nodes Tab Empty Pelican Nodes Tab Create

Click the Forward arrow in the bottom right, then update any Advanced Settings you’d like. Note that the “Upload Limit” cannot exceed what was set in the Caddyfile for the panel (512M in our case). It might be beneficial to set Memory, Disk, and CPU limits if your server’s resources are shared with other services. Click Create Node when you’re done.

Pelican Nodes Tab Create Advanced

The next screen will provide you with your config.yml file. Copy and paste them into a new file on your server at /etc/pelican/config.yml. This file is not in our main ~/pelican directory because the location must match the same path as inside the Wings container, which is also /etc/pelican/config.yml. This is already defined as a bind-mount in our docker-compose.yml file.

Pelican Nodes Configuration File

Restart your Docker stack again with docker compose down && docker compose up -d and check the Wings logs with docker logs -f pelican_wings. You should see that Wings has successfully connected to the panel. The most important part is the “Green Heart” shown in the Nodes tab of the panel, which indicates that the node is healthy and connected to the panel. If you don’t have the green heart, resolve that before continuing!

Wings Green Heart

Setting up our first Minecraft server

Now that we have our Wings node set up and connected to the panel, we can create our first Minecraft server! There are two small things we need to take care first: provisioning Port Allocations and importing an Egg for Minecraft servers.

For the port allocations, go to the Nodes tab in the panel, click on the “Edit” Pencil icon on the right side of your node, then scroll to the bottom of the page and find “Allocations”. Click the “Create Allocation” button in the top left of that section.

Pelican Node Empty Allocations

A window will pop up to “Create new allocation”. In the “IP Address” dropdown, choose 0.0.0.0. Then in the “Ports” field, enter a range of ports that you want to use for your Minecraft servers. For example, you could enter 25560-25569 to allocate 10 ports for Minecraft servers. Click “Submit” when you’re done.

Pelican Node Create Allocation IP

Then go to the Eggs tab in the panel and click “Import” in the top left of the section.

Pelican Empty Eggs

Find the eggs you want to enable for your panel. There are tabs for each category of egg you can add. I selected “Minecraft”, then searched for “Vanilla” and chose the “Vanilla Minecraft” egg. For modded servers, choose “Fabric” or “Forge Minecraft” instead. Click the “Submit” button when you’re done.

Pelican Vanilla Egg Pelican Egg List

Now for the fun part! Go to the “Servers” tab in the panel and click “New Server”.

Pelican Empty Servers

Give the server a Name, the Node should be auto-selected, and choose a port allocation from the dropdown (one of the ports you allocated earlier). Then click “Next” in the bottom right.

Pelican Server Create Information

Choose your Egg from the dropdown (the one you imported earlier) and click “Next” in the bottom right. No other settings on this step should need to be changed.

Pelican Server Create Egg Configuration

Set server-specific environment variables if you’d like, but for a basic Minecraft server, there is no need to change anything here. Click “Create Server” in the bottom right.

Pelican Server Create Environment Configuration

If all goes well, you’ll see the server “Installing”! Click the “Console” button in the top right to see the status.

Pelican Server Installing

If it doesn’t start automatically, click the “Start” button!

Pelican Server Start

Accept Minecraft’s EULA.

Minecraft EULA

Conclusion

Congratulations! Your Minecraft server is now up and running with Pelican in Docker! You can connect to it using your server’s IP address and the port you allocated (e.g., 192.168.1.100:25560). You can also manage the server from the Pelican panel, where you can start/stop the server, view logs, and change settings.