IDSpeaker LMS — Moodle Learning Platform
A branded Moodle 4.5 learning platform for IDSpeaker: an existing Moodle deployment restored with Docker, rebranded end to end, rewritten around speaker-focused courses, and served from an on-prem server through Cloudflare Tunnel.
Tech Stack :
Docker

IDSpeaker LMS — Moodle Learning Platform
Overview
IDSpeaker LMS is the learning platform for IDSpeaker, Indonesia's professional speaker platform. It gives learners a branded place to take courses on public speaking, storytelling, presentations, personal branding and MC/moderation, with lesson pages, quizzes and discussion forums.
Instead of building an LMS from scratch, I took a complete Moodle deployment from an earlier corporate project (custom theme, plugins, database and uploaded files), restored it on an on-prem server, and turned it into a product that looks and reads as IDSpeaker from the login page to the footer.
The Problem
The starting point was a single backup archive: Moodle source with a custom theme, a database dump, and the moodledata folder, all branded and filled with content for a different organization. The goal was to run it on IDSpeaker's own domain, on an existing on-prem server with no public IP and no open ports, without any trace of the previous brand.
What I Built
- Restore & containerization — Moodle 4.5 on PHP 8.1 (Apache) and MariaDB 10.11 with Docker Compose. Source, database and uploaded files restored into named volumes, with the web container bound to localhost only.
- Zero-exposure hosting — the site is published through a Cloudflare Tunnel from the on-prem server, so HTTPS terminates at Cloudflare and no inbound port is opened. The domain's DNS was moved to Cloudflare to make this possible.
- End-to-end rebrand — logo, favicon, login background, brand color (#AA0000) and the hardcoded copy in the custom Boost Union child theme, plus site name, navigation links and footer.
- Speaker-focused catalog — demo courses rewritten into IDSpeaker topics: lesson pages, quiz questions, categories and course metadata.
- Honest homepage — testimonials, leaderboard, instructor spotlight, live sessions and learning paths are wrapped in flags and only appear once real data exists, instead of showing placeholder social proof.
- Operations — Moodle cron on a one-minute schedule with a lock against overlapping runs, and database + theme backups taken before each major change.
Notable Engineering Challenges
- Rebranding a theme that hardcodes its brand — colors, copy and fallback text were spread across SCSS, Mustache templates, PHP layout defaults and theme settings. I scripted idempotent replacements and verified the result by scanning both the rendered pages and a full database dump for leftover brand terms.
- Changing data through Moodle's own APIs — logos, course covers, categories and courses were updated through Moodle's file storage and course APIs rather than raw SQL, so caches, events and file references stay consistent.
- Working around a slow tunnel — pushing the 265 MB backup over the SSH tunnel stalled, so the server pulled the archive directly from cloud storage and it was verified by SHA-256 before the restore.
Tech Stack
- Application: Moodle 4.5, PHP 8.1, Boost Union child theme (SCSS, Mustache)
- Database: MariaDB 10.11
- Infrastructure: Docker Compose, Cloudflare Tunnel, Ubuntu 24.04 on-prem server
Outcome
IDSpeaker now has its own LMS at lms.idspeaker.com: branded, served over HTTPS without exposing the server, and ready for real courses and learners.
