Skip to content
KP
All projects
CMS·2024Live

Dragon Island

Professional MuOnline Season 6 CMS with plugin architecture

PHP 8MSSQLPDOjQueryStripeDockerFreeTDS
highlights
  • 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