A versatile Pterodactyl Egg featuring Nginx, PHP 8.x, WordPress, Git, Composer, Cronjob, ionCube Loader, and Cloudflare Tunnel support.
- Features
- Installation
- Composer Modules Usage
- ionCube Loader Support
- Cloudflared Tunnel Tutorial ๐
- Git Module
- Cronjob
- Change PHP version
- PHP extensions
- Notes
- License
- ๐งน LogCleaner: Cleans
/tmp
and old logs (dry-run supported) - ๐ฑ Git Module: Auto
git pull
on restart - ๐ฆ Composer Module: Installs packages from
composer.json
or a fallback variable - ๐ ionCube Loader: Auto-detected and enabled for encrypted PHP
- ๐ Cloudflare Tunnel: Secure tunnel with token validation
- ๐ PHP-NGINX Startup: Auto-detects PHP-FPM version, runs NGINX in foreground
- ๐ฅ๏ธ Multi-arch support: AMD64 & ARM64
- ๐ฏ Selectable PHP Versions:
- โ 8.4
- โ 8.3
- โ๏ธ 8.2 (security-only)
- โ๏ธ 8.1 (security-only)
- Download the egg file (
egg-nginx.json
) - In your Pterodactyl panel, navigate to Nests in the sidebar
- Import the egg under Import Egg
- Create a new server and select the Nginx egg
- Choose the Docker image matching your desired PHP version
- Fill in all required variables, including whether WordPress is desired and the PHP version field (must be set explicitly)
This egg supports easy installation of PHP libraries using Composer.
- If a
composer.json
file exists in your server's root directory, it will be used automatically to install dependencies. - If
composer.json
is missing, the egg looks for a variable (e.g.COMPOSER_MODULES
) with a space-separated list of Composer packages to install. - If neither
composer.json
norCOMPOSER_MODULES
is set, Composer installation is skipped.
- Enter the packages in the
COMPOSER_MODULES
variable in this format:
vendor/package[:version_constraint]
Examples:
- Latest stable version:
symfony/http-foundation
- Specific version or range:
monolog/monolog:^2.0 doctrine/orm:~2.10 nesbot/carbon:^2.50
- Multiple packages separated by spaces:
symfony/http-foundation:^6.0 monolog/monolog guzzlehttp/guzzle
- Make sure package names and versions exist on Packagist.
- Incorrect inputs can cause installation errors visible in the server console.
- Installing many or complex packages can increase startup time.
- Composer must be pre-installed in the container environment (this egg includes it).
- ionCube Loader is detected and enabled automatically if encrypted PHP files are present.
- No manual configuration needed; simply upload your ionCube-protected scripts and run.
With Cloudflared, you can create a secure tunnel to your server, making it accessible over the internet without complicated port forwarding!
Cloudflared | Create a remotely-managed tunnel
- A Cloudflare account
- ๐น Step 1: Log in to Zero Trust โ and go to Networks > Tunnel
- ๐น Step 2: Select Create a tunnel.
- ๐น Step 3: Choose Cloudflared for the connector type and select Next.
- ๐น Step 4: Enter a name for your tunnel.
- ๐น Step 5: Select Save tunnel.
- ๐น Step 6: Save the token. (The token is very long)
- ๐น Step 7: Activate Cloudflared
- ๐น Step 8: Add your token.
- ๐น Step 9: Add public hostname
- ๐น Step 10: Depending on the type, select http and URL always โlocalhostโ + the web server port
- ๐น Step 11: Restart your webserver.
- Specify your Git repository URL in the
GIT_ADDRESS
variable - Enable Git by setting the
GIT_STATUS
variable to1
ortrue
- On server creation, your repo will be cloned into the
www
folder - On each restart,
git pull
runs to update the files
This egg includes a container-native cron engine for automated task scheduling without requiring system cron.
- Enable cron by setting the
CRON_STATUS
variable to1
ortrue
- Create or edit
/home/container/crontab
with your scheduled tasks - The cron engine runs automatically in the background and executes jobs at the specified times
- All execution logs are saved to
/home/container/logs/cron.log
# Run every minute
* * * * * echo "$(date): Task executed" >> /home/container/logs/task.log
# Daily backup at 2 AM
0 2 * * * tar -czf /home/container/backups/backup-$(date +%Y%m%d).tar.gz /home/container/www
# Clean old logs weekly (Sundays at midnight)
0 0 * * 0 find /home/container/logs -name "*.log" -mtime +7 -delete
# Laravel Scheduler (if using Laravel)
* * * * * cd /home/container/www && /usr/bin/php artisan schedule:run >> /home/container/logs/scheduler.log 2>&1
- Uses custom cron engine - no system cron dependency required
- Supports command substitution like
$(date)
and environment variables - Always use absolute paths in cron commands
- The cron engine starts automatically with the container
Changing the PHP version is currently still somewhat cumbersome. A revised version will be available in the future.
- Step 1: In your Pterodactyl panel, go to the "Startup" tab on your web server. Change the variable "PHP VERSION" to the desired version.
- Step 2: Finally, you need to customise the Docker image. Select the appropriate Docker image to match the version.
PHP extensions of PHP version 8.3:
Core, date, libxml, openssl, pcre, zlib, filter, hash, json, random, Reflection, SPL, session, standard, sodium, cgi-fcgi, mysqlnd, PDO, psr, xml, bcmath, calendar, ctype, curl, dom, mbstring, FFI, fileinfo, ftp, gd, gettext, gmp, iconv, igbinary, imagick, imap, intl, ldap, exif, memcache, mongodb, msgpack, mysqli, odbc, pcov, pdo_mysql, PDO_ODBC, pdo_pgsql, pdo_sqlite, pgsql, Phar, posix, ps, pspell, readline, shmop, SimpleXML, soap, sockets, sqlite3, sysvmsg, sysvsem, sysvshm, tokenizer, xmlreader, xmlwriter, xsl, zip, mailparse, memcached, inotify, maxminddb, protobuf, Zend OPcache
- Public web root directory:
www
- To enable HTTPS, modify
/home/container/nginx/conf.d/default.conf
accordingly - PHP extensions vary slightly per version; full list available in docs
- Changing PHP versions requires matching Docker image selection and restart
Forked and adapted from: https://gitlab.com/tenten8401/pterodactyl-nginx