Client platform · RHP Properties · 10+ years in production

RHP Learn: ten years of learning operations on AWS

A client and server learning platform for RHP Properties: a learner and manager portal, an admin console and a standards-based xAPI learning record store, built on CakePHP and MySQL. I architected and built it, set up and manage its AWS infrastructure, and have kept it running in production for more than ten years.

  • Architect
  • Full-stack developer
  • AWS administrator
Fig. 1The learner dashboard: assignments, courses, reports and team in one view. Names are blurred.

At a glance

How it runs ↓
  • 10+ yrsdesigned, built, hosted and maintained for one client
  • 3 clientslearner portal, admin console and xAPI content on one server
  • xAPIlearning record store with Statements, State and Profile APIs
  • ~30report views with scheduled e-mail and Excel, CSV and PDF export
  • 4 envsdev, dev2, staging and production, released through Git CI/CD
  • 7 AWSservices: EC2, Elastic Load Balancing, VPC, RDS, S3, SES and SNS

The brief

One place to train, onboard and report, across every community

RHP Properties needed to assign, deliver and track training for community, maintenance, regional and corporate teams across the country, with onboarding that managers sign off and reports that leaders trust.

My role

I own it end to end: the architecture, the client and server code, the AWS account and infrastructure, releases, and day-to-day maintenance.

Who uses it

Learners see their assignments and courses. Managers and regional leaders sign off onboarding checklists and follow their teams. The learning team runs curricula, enrollment rules and reports from the admin console.

What I built

  • Learner and manager portal: assignments, e-learning, completed courses, onboarding checklists with time-stamped sign-offs, team drill-downs and self-service reports.
  • Admin console: curricula with due-date rules, auto-enroll learning plans driven by HR title codes, groups and roles, communities, notifications and tools.
  • xAPI learning record store: Statements, State and Profile APIs that e-learning content from several vendors reports into, secured per client application.
  • Reporting: about 30 report views (summary, individual, curriculum, overdue and activity) with scheduled e-mail, PDF certificates and Excel, CSV and PDF export.
  • Automation: scheduled jobs for reminders, certification reports, bounced e-mail and inactive-employee checks, backups and log cleanup, plus an HR data sync for title codes, locations and regions.

Architecture as code

Two views, generated from a Python script

Both diagrams are drawn by tools/rhp_architecture.py from the application's code and configuration: the CakePHP layers, the xAPI endpoints, the scheduled jobs, the e-mail bounce loop and the environments it ships through.

Choose a view

RHP Learn on AWSLearners, managers and admins reach a load balancer over HTTPS inside a VPC. EC2 web servers run the CakePHP application, RDS for MySQL stores the xAPI learning records, S3 holds course content, SES sends email and SNS returns bounce notices. Code moves from Git through a CI/CD pipeline to dev, staging and production. The AWS account, IAM access and security groups are managed as part of the service.USERS & SYSTEMSLearners &managersPortal,dashboards, teamviewsL&D adminsAdmin console(/admin)E-learningcontentxAPI courses sendlearning recordsRHP HR systemTitle codes andregionsSAML IdPOptional SSOAWS CLOUDAccount managementIAM users & rolesSecurity groupsBilling & costVPCPUBLIC SUBNETSWEB TIER · SECURITY GROUPDATA TIER · SECURITY GROUPLoad balancerElastic LoadBalancing,HTTPS, healthchecksEC2 web serversApache · PHP · CakePHP 2:client portal, adminconsole and xAPI LRS APIScheduled jobs (cron)Reminders, certificationreports, bounce andinactive checks, backupsPDF & exportsCertificates viawkhtmltopdf; Excel, CSV andPDF report exportsAmazon RDSMySQL: xAPIrecords,people,curriculaMANAGED SERVICESAmazon S3Course packages andlearning assetsAmazon SESTransactional email andscheduled reportsAmazon SNSBounce notices back to theappRELEASE FLOWGit repositoryCI/CD pipelinedev · dev2 · staging · prodHTTPSxAPIHTTPMySQLcontent & assetsSMTPbounceflag e-mailHR syncdeploy
Fig. 2Users reach a load balancer over HTTPS inside a VPC. EC2 runs the CakePHP application, RDS for MySQL holds the learning records, S3 holds course content, SES sends e-mail and SNS returns bounces. Git CI/CD promotes releases from dev to production.
Open the SVG ↗

Inside RHP Learn

Thirty screens, client and server

Four shelves, one per area of the platform. Scroll a shelf or use its arrows, and select a screen to enlarge it. Learner and staff names, e-mail addresses, IDs and IP addresses are blurred.

Admin console

Server app · 16 screens

Running it for ten years

Infrastructure, security and delivery

Building the platform was the start. Most of the value came from running it: keeping it secure, deploying safely and extending it as RHP's training needs grew.

  • AWS infrastructure

    • EC2 web servers behind Elastic Load Balancing, inside a VPC with a security group per tier.
    • Amazon RDS for MySQL as the system of record for learning records, people and curricula.
    • S3 for course packages and learning assets; SES for e-mail and SNS for bounce notices.
    • The AWS account itself: access, security groups and cost.
  • Security

    • HTTPS everywhere, with the load balancer's forwarded protocol honored by the application.
    • Role-based access control for every admin function, with menus filtered by role.
    • HTTP Basic or OAuth 1.0 for registered client applications, and a CORS allow-list for content sites.
    • Optional SAML single sign-on.
  • Delivery and maintenance

    • Git-based CI/CD that promotes changes through dev, dev2, staging and production.
    • A health endpoint for the load balancer, and scheduled jobs for reminders, reports, bounce and inactive checks, backups and log cleanup.
    • Ten years of upgrades and new modules, such as assignments and enrollment plans, without changing the platform's foundations.

Stack

What it's built with

A deliberately conventional stack, chosen to be easy to host, secure and maintain over many years.

Front end

  • HTML and JavaScript
  • jQuery and Bootstrap
  • DataTables with Excel, CSV and PDF export
  • Chart.js and Flot
  • pdf.js

Server

  • PHP and CakePHP (MVC)
  • Auth component with ACL roles
  • OAuth 1.0 server for client apps
  • CakePdf with wkhtmltopdf
  • Cron shells and a job queue

Learning standards

  • xAPI (Tin Can) learning record store
  • TinCanJS and ADL xAPIWrapper
  • Statements, State and Profile APIs
  • Optional SAML single sign-on

Data

  • MySQL on Amazon RDS
  • activity_log_* learning record model
  • HR feed: title codes, locations, regions

AWS

  • EC2 and Elastic Load Balancing
  • VPC and security groups
  • RDS, S3, SES and SNS
  • Account, IAM and cost management

Delivery

  • Git and CI/CD
  • dev → dev2 → staging → production
  • Health checks and scheduled jobs
  • Ten years in production

See the AI systems and programs I lead today, or ask me about this one.

Case study

Screen

Interactive view

Live chart

Open in new tab ↗

Loading the live chart…