Dragon Island
Professional MuOnline Season 6 CMS with plugin architecture
- WordPress-style hook and plugin system
- Lucky Wheel plugin with canvas animation and weighted random selection
- Stripe payments integration for in-game currency
- Dual MSSQL driver support (pdo_dblib + pdo_sqlsrv) for cross-platform compatibility
- File-based caching layer with lazy loading and optimized queries
- Repository pattern across 15+ domain repositories
Overview
Dragon Island is a production-ready CMS powering dragon-island.com, a private MuOnline Season 6 server. It's the project I've been pouring most of my time into recently, growing it from a simple account panel into a full content management system with payments, marketplace, ranking, vote system and a plugin architecture.
Problem
The MuOnline community runs on aging PHP CMS solutions glued onto legacy MSSQL databases. Most are unmaintainable, insecure or impossible to extend without rewriting core files. Server owners need a modern foundation that respects the original game schema while letting them add custom features without forking.
Solution
I built a clean MVC layer on top of PDO, abstracted database access into typed Repositories (Account, Character, Coin, Market, Stripe, Warehouse, Vote, Streamer, MonsterKillers, GallerySubmission, CustomItemBank...), and shipped a WordPress-style HookSystem that lets plugins register filters and actions without modifying core.
The plugin manager auto-discovers plugins on bootstrap, validates manifests and hooks them into the request lifecycle. The Lucky Wheel plugin is the proof, drops into the menu, hooks into the AJAX router, renders a canvas wheel with weighted random selection across WCoinC / WCoinP / GoblinPoints prizes.
Tech rationale
- PHP 8 + PDO: battle-tested for game servers, native MSSQL drivers
- Dual driver setup (
pdo_dblib+pdo_sqlsrv), Linux containers can talk to Windows-only MSSQL via FreeTDS - File-based caching: no Redis dependency, fast enough for the read-heavy workload
- Stripe: for legal, region-aware payments instead of dodgy crypto gateways
- Docker: reproducible builds, easy migration between hosts
Lessons learned
- The Hook system was worth the upfront complexity, every new feature lands as a plugin now
- File caching with explicit invalidation beats Redis for this scale, less moving parts
- MSSQL schema constraints (PK names, collations) shape your data layer more than you think going in