Deploy Pterodactyl Panel
Game server management UI for Minecraft, Rust, ARK and Source engine titles
Just deployed
/app/var
Redis
Just deployed
/data
MySQL
Just deployed
/var/lib/mysql

Deploy and Host Pterodactyl Panel on Railway
Pterodactyl Panel is the open-source control plane behind a large share of the world's game server hosting. It gives administrators a web UI for creating servers, allocating CPU, RAM and disk, streaming live consoles, browsing files over SFTP, scheduling restarts and backups, and granting customers scoped sub-user access — across Minecraft, Rust, ARK, Source engine titles, FiveM, voice servers and anything else described by a community "egg".
Running it here uses three services: the panel on the official ghcr.io/pterodactyl/panel:v1.15.0 image serving port 80 behind Railway's TLS edge, MySQL as the system of record, and Redis for sessions, cache and the job queue. Only the panel is exposed publicly. This template deploys the panel — the control plane — only. Wings, the daemon that actually launches game containers, cannot run on Railway; your nodes must live elsewhere.

Getting Started with Pterodactyl Panel on Railway
Pterodactyl has no signup route and no default credentials. The template creates the first administrator with a pre-deploy command running php artisan p:user:make from the ADMIN_EMAIL, ADMIN_USERNAME and ADMIN_PASSWORD variables, so set those before deploying. That hook runs before the entrypoint has migrated the database, so on a new project the admin appears on the second deploy — setting APP_URL to your generated domain triggers that redeploy for free.
Open your Railway domain, land on /auth/login and sign in. A dashboard reading "There are no servers associated with your account" is the correct empty state until a Wings node exists. Open /admin, confirm the overview reports version 1.15.0, then check Nests: the seeder creates Minecraft, Source Engine, Voice Servers and Rust with their eggs. Creating a Location under Admin → Locations and deleting it again is a good smoke test. Before real users arrive, replace the bundled reCAPTCHA keys and point MAIL_* at working SMTP credentials.

About Hosting Pterodactyl Panel
Pterodactyl runs many game servers for many people without giving any of them shell access. Every server is an isolated Docker container with hard CPU, memory and disk limits, its own SFTP account, and sub-user permissions an owner hands out narrowly. Teams self-host it to keep customer data on their own infrastructure, avoid per-server fees, and script provisioning through the REST API.
Key features:
- Per-server isolation in Docker containers with enforced resource limits
- Live console, power controls and real-time CPU, memory, disk and network graphs
- Eggs: reusable service definitions covering hundreds of games and applications
- File manager, SFTP, scheduled tasks, database provisioning and backups
- Sub-user permissions, two-factor authentication and full audit logging
- Application and Client REST APIs for automation and billing integrations
The panel container runs four processes under supervisord — nginx on port 80, PHP-FPM, a queue worker, and cron running Laravel's scheduler — so no separate worker service is needed. Keep replicas at 1: that scheduler has no leader election, so a second replica duplicates every scheduled task. A volume at /app/var persists the generated .env holding APP_KEY and HASHIDS_SALT, written on first boot and read from that file afterwards — changing them later has no effect and would orphan encrypted data.
Panel Only — Why Wings Nodes Cannot Run on Railway
Wings supervises one Docker container per game server, and needs privileged access to a Docker socket, a wide arbitrary TCP and UDP port range, plus SFTP on port 2022. Railway offers no privileged Docker host and no inbound UDP, so Wings cannot be deployed here — a platform limitation, not a configuration gap. Run this panel on Railway as your always-on, TLS-terminated control plane, and host Wings on a VPS, dedicated box or homelab machine. Add it under Admin → Nodes and copy the generated configuration to the node; the panel manages it over HTTPS from then on.
Why Deploy Pterodactyl Panel on Railway
- MySQL and Redis provisioned and privately networked, no manual install
- Automatic HTTPS and a public domain, so nodes reach the panel securely
- One-click redeploys and rollbacks on the pinned official image
- Persistent volume for the panel's generated encryption keys
- Logs, metrics and health checks without a separate monitoring stack
Common Use Cases
- Game hosting businesses — sell servers and provision them through the Application API from WHMCS, Paymenter or a custom storefront.
- Community and clan servers — let trusted members restart or reconfigure a server without handing out SSH keys.
- Multi-game homelabs — run Valheim, Terraria, Satisfactory and a voice server from one interface.
- Agencies and MSPs — keep the panel on Railway and attach customer-owned nodes in other regions.
Dependencies for Pterodactyl Panel
- Panel —
ghcr.io/pterodactyl/panel:v1.15.0from github.com/pterodactyl/panel. Serves the web UI and API, and runs the queue worker and scheduler in-container. - MySQL — stores users, servers, nodes, allocations, eggs and activity logs. The app will not boot without it.
- Redis — session store, cache and queue backend, wired through
SESSION_DRIVER,CACHE_STOREandQUEUE_CONNECTION.
Deployment Dependencies
- Source repository:
- Official documentation:
- Wings daemon, hosted separately:
Hardware Requirements for Self-Hosting Pterodactyl Panel
These cover the panel only. Wings nodes need their own capacity plus the memory allocated to each game server.
| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 1 GB | 2–4 GB |
| Storage | 1 GB volume | 5 GB volume + MySQL growth |
| Runtime | PHP 8.2+, MySQL 8 / MariaDB 10.3+, Redis | Provided by the pinned image and Railway services |
Self-Hosting Pterodactyl Panel with Docker
The panel service in YAML, alongside a mariadb:11 database and a redis:alpine cache:
panel:
image: ghcr.io/pterodactyl/panel:v1.15.0
ports: ["80:80"]
volumes: ["./var:/app/var"]
environment:
APP_URL: "https://panel.example.com"
APP_KEY: "32-random-alphanumeric-characters"
HASHIDS_SALT: "20-random-characters"
DB_HOST: database
DB_DATABASE: panel
DB_USERNAME: pterodactyl
DB_PASSWORD: changeme
REDIS_HOST: cache
CACHE_STORE: redis
SESSION_DRIVER: redis
QUEUE_CONNECTION: redis
There is no registration page, so create the first administrator from the CLI:
docker compose exec panel php artisan p:user:make \
--email="admin@example.com" --username="admin" \
--name-first="Panel" --name-last="Admin" \
--password="ChangeMe123" --admin=1
Troubleshooting Self-Hosted Pterodactyl Panel
Login returns 500 and the health check fails on a brand-new database → Laravel loads its squashed schema dump by shelling out to the bundled MariaDB client, which verifies TLS and rejects a managed database's self-signed certificate, leaving an empty schema. Load database/schema/mysql-schema.sql once over the MySQL wire protocol — for example through a temporary TCP proxy — setting FOREIGN_KEY_CHECKS=0 and UNIQUE_CHECKS=0 explicitly, then redeploy. The dump inserts its own migration rows, so the panel completes the remaining migrations normally.
Assets load over http://, or sessions drop → TRUSTED_PROXIES must include Railway's edge ranges 100.64.0.0/10,fd00::/8.
"Exceeding reCAPTCHA Enterprise free quota" on the login page → Pterodactyl ships default reCAPTCHA keys shared by every install. Register your own or set RECAPTCHA_ENABLED=false.
Redis errors mentioning a missing extension → do not set REDIS_CLIENT=phpredis; the official image does not bundle the redis PHP extension. Leave the default predis client.
FAQ
What is Pterodactyl Panel?
A free, open-source, game-agnostic control panel for game servers. It runs each server in an isolated Docker container and gives administrators and end users a web console, file manager, SFTP access, schedules, backups and a REST API.
What does this template deploy?
The panel plus its MySQL database and Redis instance. It does not deploy Wings, so no game server runs on Railway — the panel manages nodes you host elsewhere.
Can I run Minecraft or Rust servers on Railway with this template?
No. Game servers are launched by Wings, which needs privileged Docker access and inbound UDP that Railway does not offer. Install Wings on a VPS or your own hardware and attach it as a node.
Why do MySQL and Redis ship with this Pterodactyl template?
MySQL is Pterodactyl's system of record and the app will not start without it. Redis holds sessions, cache and the job queue so logins and background tasks survive restarts.
How do I create the first admin user in self-hosted Pterodactyl?
There is no signup page. Run php artisan p:user:make --admin=1. This template wires that into a pre-deploy step driven by the ADMIN_* variables, so the account is created for you.
Template Content
