docker.recipes

Pterodactyl Panel + Wings

advanced

Complete game server management panel with Wings daemon for container orchestration.

Overview

Pterodactyl Panel is a modern, open-source game server management platform built with PHP and designed to simplify the deployment and administration of game servers. Originally created to manage Minecraft servers, Pterodactyl has evolved into a comprehensive solution supporting dozens of game types including Rust, CS:GO, Garry's Mod, ARK, and many others. The panel provides a clean web interface for server creation, file management, console access, and user permissions, while Wings serves as the daemon that handles the actual container orchestration and server lifecycle management. This stack combines Pterodactyl Panel with Wings daemon, creating a complete game server hosting platform where the panel handles the web interface and API while Wings manages Docker containers running the actual game servers. MariaDB stores all panel data including users, servers, and configurations, while Redis provides high-performance caching for sessions and queues. NGINX serves the panel's web interface and handles SSL termination, creating a production-ready game server management platform that can scale from single servers to multi-node deployments. This configuration is ideal for game server hosting companies, community administrators running multiple servers, and homelab enthusiasts who want professional-grade game server management. The combination provides enterprise-level features like resource limiting, automated backups, scheduled tasks, and multi-user access control, making it valuable for anyone moving beyond basic game server hosting to a managed platform approach.

Key Features

  • Multi-game server support with pre-configured eggs for Minecraft, Rust, CS:GO, ARK, and 50+ other games
  • Wings daemon integration for Docker-based game server containers with automatic resource management
  • Web-based file manager with syntax highlighting for configuration files and real-time editing
  • SFTP access on port 2022 for secure file transfers and automated deployment scripts
  • Redis-powered session management and queue processing for improved panel responsiveness
  • MariaDB backend with optimized queries for handling thousands of servers and users
  • Real-time server console access through WebSocket connections with command history
  • Comprehensive API for automation, billing system integration, and custom management tools

Common Use Cases

  • 1Game server hosting providers offering managed Minecraft, Rust, or Source engine servers
  • 2Gaming communities managing multiple dedicated servers with different games and configurations
  • 3Educational institutions providing game development environments for students
  • 4Homelab administrators centralizing game server management for friends and family
  • 5Development teams testing multiplayer games across different server configurations
  • 6Tournament organizers needing rapid deployment and teardown of competitive game servers
  • 7Modded game server communities requiring complex configuration management and file sharing

Prerequisites

  • Docker host with minimum 4GB RAM (8GB+ recommended for multiple game servers)
  • Port access for 80/443 (panel), 8080 (Wings API), 2022 (SFTP), and game server ports
  • Domain name or static IP for proper SSL certificate configuration and Wings communication
  • Basic understanding of game server configuration files and networking concepts
  • Docker socket access for Wings container management and game server orchestration
  • Environment variables configured for DB_PASSWORD and MYSQL_ROOT_PASSWORD before deployment

For development & testing. Review security settings, change default credentials, and test thoroughly before production use. See Terms

docker-compose.yml

docker-compose.yml
1services:
2 panel:
3 image: ghcr.io/pterodactyl/panel:latest
4 environment:
5 - APP_URL=http://localhost
6 - APP_TIMEZONE=UTC
7 - APP_SERVICE_AUTHOR=admin@example.com
8 - DB_HOST=mariadb
9 - DB_PORT=3306
10 - DB_DATABASE=panel
11 - DB_USERNAME=pterodactyl
12 - DB_PASSWORD=${DB_PASSWORD}
13 - CACHE_DRIVER=redis
14 - SESSION_DRIVER=redis
15 - QUEUE_DRIVER=redis
16 - REDIS_HOST=redis
17 volumes:
18 - panel-var:/app/var
19 - panel-nginx:/etc/nginx/http.d
20 - panel-logs:/app/storage/logs
21 ports:
22 - "80:80"
23 - "443:443"
24 depends_on:
25 - mariadb
26 - redis
27 networks:
28 - pterodactyl-network
29 restart: unless-stopped
30
31 mariadb:
32 image: mariadb:10.11
33 environment:
34 - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
35 - MYSQL_DATABASE=panel
36 - MYSQL_USER=pterodactyl
37 - MYSQL_PASSWORD=${DB_PASSWORD}
38 volumes:
39 - mariadb-data:/var/lib/mysql
40 networks:
41 - pterodactyl-network
42 restart: unless-stopped
43
44 redis:
45 image: redis:alpine
46 volumes:
47 - redis-data:/data
48 networks:
49 - pterodactyl-network
50 restart: unless-stopped
51
52 wings:
53 image: ghcr.io/pterodactyl/wings:latest
54 environment:
55 - TZ=UTC
56 volumes:
57 - /var/run/docker.sock:/var/run/docker.sock
58 - /var/lib/docker/containers:/var/lib/docker/containers
59 - wings-config:/etc/pterodactyl
60 - wings-data:/var/lib/pterodactyl
61 - /tmp/pterodactyl:/tmp/pterodactyl
62 ports:
63 - "8080:8080"
64 - "2022:2022"
65 networks:
66 - pterodactyl-network
67 restart: unless-stopped
68
69volumes:
70 panel-var:
71 panel-nginx:
72 panel-logs:
73 mariadb-data:
74 redis-data:
75 wings-config:
76 wings-data:
77
78networks:
79 pterodactyl-network:
80 driver: bridge

.env Template

.env
1# Pterodactyl Panel
2DB_PASSWORD=secure_db_password
3MYSQL_ROOT_PASSWORD=secure_root_password
4
5# Panel URL
6APP_URL=http://localhost

Usage Notes

  1. 1Panel at http://localhost
  2. 2Wings daemon at port 8080
  3. 3Create admin user: docker exec -it panel php artisan p:user:make
  4. 4Configure Wings in panel admin
  5. 5SFTP at port 2022

Individual Services(4 services)

Copy individual services to mix and match with your existing compose files.

panel
panel:
  image: ghcr.io/pterodactyl/panel:latest
  environment:
    - APP_URL=http://localhost
    - APP_TIMEZONE=UTC
    - APP_SERVICE_AUTHOR=admin@example.com
    - DB_HOST=mariadb
    - DB_PORT=3306
    - DB_DATABASE=panel
    - DB_USERNAME=pterodactyl
    - DB_PASSWORD=${DB_PASSWORD}
    - CACHE_DRIVER=redis
    - SESSION_DRIVER=redis
    - QUEUE_DRIVER=redis
    - REDIS_HOST=redis
  volumes:
    - panel-var:/app/var
    - panel-nginx:/etc/nginx/http.d
    - panel-logs:/app/storage/logs
  ports:
    - "80:80"
    - "443:443"
  depends_on:
    - mariadb
    - redis
  networks:
    - pterodactyl-network
  restart: unless-stopped
mariadb
mariadb:
  image: mariadb:10.11
  environment:
    - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
    - MYSQL_DATABASE=panel
    - MYSQL_USER=pterodactyl
    - MYSQL_PASSWORD=${DB_PASSWORD}
  volumes:
    - mariadb-data:/var/lib/mysql
  networks:
    - pterodactyl-network
  restart: unless-stopped
redis
redis:
  image: redis:alpine
  volumes:
    - redis-data:/data
  networks:
    - pterodactyl-network
  restart: unless-stopped
wings
wings:
  image: ghcr.io/pterodactyl/wings:latest
  environment:
    - TZ=UTC
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    - /var/lib/docker/containers:/var/lib/docker/containers
    - wings-config:/etc/pterodactyl
    - wings-data:/var/lib/pterodactyl
    - /tmp/pterodactyl:/tmp/pterodactyl
  ports:
    - "8080:8080"
    - "2022:2022"
  networks:
    - pterodactyl-network
  restart: unless-stopped

Quick Start

terminal
1# 1. Create the compose file
2cat > docker-compose.yml << 'EOF'
3services:
4 panel:
5 image: ghcr.io/pterodactyl/panel:latest
6 environment:
7 - APP_URL=http://localhost
8 - APP_TIMEZONE=UTC
9 - APP_SERVICE_AUTHOR=admin@example.com
10 - DB_HOST=mariadb
11 - DB_PORT=3306
12 - DB_DATABASE=panel
13 - DB_USERNAME=pterodactyl
14 - DB_PASSWORD=${DB_PASSWORD}
15 - CACHE_DRIVER=redis
16 - SESSION_DRIVER=redis
17 - QUEUE_DRIVER=redis
18 - REDIS_HOST=redis
19 volumes:
20 - panel-var:/app/var
21 - panel-nginx:/etc/nginx/http.d
22 - panel-logs:/app/storage/logs
23 ports:
24 - "80:80"
25 - "443:443"
26 depends_on:
27 - mariadb
28 - redis
29 networks:
30 - pterodactyl-network
31 restart: unless-stopped
32
33 mariadb:
34 image: mariadb:10.11
35 environment:
36 - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
37 - MYSQL_DATABASE=panel
38 - MYSQL_USER=pterodactyl
39 - MYSQL_PASSWORD=${DB_PASSWORD}
40 volumes:
41 - mariadb-data:/var/lib/mysql
42 networks:
43 - pterodactyl-network
44 restart: unless-stopped
45
46 redis:
47 image: redis:alpine
48 volumes:
49 - redis-data:/data
50 networks:
51 - pterodactyl-network
52 restart: unless-stopped
53
54 wings:
55 image: ghcr.io/pterodactyl/wings:latest
56 environment:
57 - TZ=UTC
58 volumes:
59 - /var/run/docker.sock:/var/run/docker.sock
60 - /var/lib/docker/containers:/var/lib/docker/containers
61 - wings-config:/etc/pterodactyl
62 - wings-data:/var/lib/pterodactyl
63 - /tmp/pterodactyl:/tmp/pterodactyl
64 ports:
65 - "8080:8080"
66 - "2022:2022"
67 networks:
68 - pterodactyl-network
69 restart: unless-stopped
70
71volumes:
72 panel-var:
73 panel-nginx:
74 panel-logs:
75 mariadb-data:
76 redis-data:
77 wings-config:
78 wings-data:
79
80networks:
81 pterodactyl-network:
82 driver: bridge
83EOF
84
85# 2. Create the .env file
86cat > .env << 'EOF'
87# Pterodactyl Panel
88DB_PASSWORD=secure_db_password
89MYSQL_ROOT_PASSWORD=secure_root_password
90
91# Panel URL
92APP_URL=http://localhost
93EOF
94
95# 3. Start the services
96docker compose up -d
97
98# 4. View logs
99docker compose logs -f

One-Liner

Run this command to download and set up the recipe in one step:

terminal
1curl -fsSL https://docker.recipes/api/recipes/pterodactyl-panel-complete/run | bash

Troubleshooting

  • Wings shows 'failed to connect to panel' error: Verify APP_URL matches your domain and Wings can reach panel on port 80/443
  • Game servers fail to start with permission errors: Ensure Wings container has proper Docker socket access and /tmp/pterodactyl directory permissions
  • Panel shows 500 errors after startup: Check MariaDB connection and run 'docker exec -it panel php artisan migrate' to initialize database schema
  • SFTP connections refused on port 2022: Verify Wings container is running and port 2022 is not blocked by host firewall
  • Session timeouts and slow panel performance: Check Redis container health and ensure CACHE_DRIVER and SESSION_DRIVER are set to redis
  • Wings API unreachable from panel: Confirm Wings daemon is configured in panel admin with correct API endpoint and authentication token

Community Notes

Loading...
Loading notes...

Download Recipe Kit

Get all files in a ready-to-deploy package

Includes docker-compose.yml, .env template, README, and license

Ad Space