RemarkableCloud

Apps / Docker Images

Moodle in Docker.
Your LMS, done right.

Moodle is the open source learning management system behind hundreds of millions of learners: courses, quizzes, grades, assignments and activities, self-hosted so the institution owns the data. The RemarkableCloud image is a from-source build on a digest-pinned PHP 8.

docker pull ghcr.io/remarkablecloud/moodle

Current build

5.2.2-r1

Updated Sep 12, 2026

Base

Moodle 5 from source, PHP 8.4, digest-pinned

What's inside

Headless CLI install, plugins persist on a volume, PostgreSQL 17 pairing

Upstream license

Moodle: GPL-3.0-or-later.

Free to pull and run anywhere. Digest-pinned, updated deliberately; each build is recorded in the changelog.

The image

What our image adds.

Moodle is the open source learning management system behind hundreds of millions of learners: courses, quizzes, grades, assignments and activities, self-hosted so the institution owns the data. The RemarkableCloud image is a from-source build on a digest-pinned PHP 8.

Headless CLI install

The browser install wizard never runs, so the operator is never made admin through a public page; the generated credentials land in the container log once.

Moodle code on a volume

Plugins and themes installed through the UI persist across container recreation and upgrades, which is where most containerized Moodle setups quietly lose work.

PostgreSQL 17 pairing

Moodle's best-supported open database, shipped and wired in the stack.

Current PHP

PHP 8.4 with the extensions Moodle 5 expects, rebuilt on our cadence.

Proxy-aware wwwroot

MOODLE_WWWROOT drives every generated URL; TLS terminates at your proxy.

Rather skip the compose file? Deploy Moodle with one click on your own VPS: TLS, domain and database already wired.

Deploy Moodle in one click

The guide

Run it in production.

Architecture at a glance

Two containers: moodle (Apache + PHP, port 80 internal) and db (Postgres 17). Three volumes: the database, the Moodle code (plugins, themes), and moodledata (course files, uploads, caches). All three are the system.

Docker Compose walkthrough

Set DB_PASSWORD and SITE_URL, bring the stack up, and wait: first boot installs Moodle from the CLI, which takes a few minutes, then prints the admin credentials to the log. Log in, set the site name, and build your first course. Moodle background tasks run via its cron entrypoint inside the container.

Environment variable reference

VariablePurpose
DB_HOST / DB_PORT / DB_USER / DB_PASSPostgreSQL connection
MOODLE_WWWROOTPublic https URL; Moodle hard-depends on it being right
Admin (generated)Created by the CLI install on first boot

Hardening notes

The wwwroot must match the public URL exactly or logins and redirects misbehave; that is Moodle, not the container. Keep moodledata off the web path (the stack already does), keep the DB internal, and add plugins from the official directory only; plugins are PHP running as the site.

Backups

Database, moodle-code volume, and moodledata together are a complete site. moodledata grows with course content; watch disk and back it as files alongside scheduled pg_dump runs.

Upgrades

Pull the new tag and recreate; the entrypoint runs Moodle’s upgrade when the code version advances. Moodle majors deserve a staging pass if you run many third-party plugins.

Updates

Recent builds.

5.2.2-r1

Sep 12, 2026

Or skip the ops

Host Moodle on your own private VPS.

One click installs this exact image on a VPS that is yours alone, domain and TLS wizard included. The same server runs as many apps as fit, with no per-app charge.

FAQ

Questions we get.

Do UI-installed plugins survive upgrades?

Yes, that is the point of the code volume. Incompatible plugins still need updating for new Moodle majors, same as any Moodle.

How many students can it handle?

RAM and PHP workers are the levers. A small-cohort site is comfortable at 2 GB; scale up with concurrent quiz-takers, which are the spike that matters.

MySQL instead of Postgres?

This stack standardizes on PostgreSQL 17, Moodle's best open pairing. Migrating between engines mid-life is painful; pick at the start.

Where are the admin credentials?

In the container log after the first-boot install completes; store them, then change the password in the profile.

Your server runs. You sleep.

Fully managed hosting from people who have been doing this since 2001.