France Université Numérique introduces an alternative Docker
approach to
install a complete and customized version of Open edX.
The idea is to handcraft a Dockerfile
, in order to make the project simpler,
more flexible and fully operable by developers.
If you're looking for a quick preview of OpenEdX Docker, you can take a look at our dedicated demo site.
It is connected back-to-back with a demo of Richie, a CMS for Open Education based on Django.
Two users are available for testing:
admin@example.com
/admin
edx@example.com
/edx
Richie's admin is available at https://demo.richie.education/admin/ and can be
accessed via the following user account: admin
/admin
.
The demonstration databases are regularly flushed.
This project builds a docker image that is ready for production.
At France Université Numérique, we are deploying Open edX Docker to OpenShift, for many customers and in multiple environments using Arnold:
edxapp
, the core Open edX
application. You can build you own image by adding specific Xblocks or Django
apps in a Dockerfile
inheriting from this one (see
https://github.com/openfun/fonzie for an example).Docker compose is only used for development purposes so that we can code locally and see our changes immediately:
gunicorn
,nginx
.Docker compose also allows us to run a complete project in development, including database services which in production are not run on Docker. See the docker-compose file for details on each service:
Concerning Redis, it is possible to run a single redis instance (the default choice)
or to run redis with sentinel to simulate a HA instance.
To use Redis sentinel you have to set the REDIS_SERVICE
environment variable
to redis-sentinel
:
$ export REDIS_SERVICE=redis-sentinel
To switch back to the single redis instance, unset this environment variable:
$ unset REDIS_SERVICE
Make sure you have a recent version of Docker and Docker Compose installed on your laptop:
$ docker -v
Docker version 26.0.0, build 2ae903e
$ docker compose version
docker compose version v2.24.5
First, you need to choose a release/flavor of OpenEdx versions we support. You
can list them and get instructions about how to select/activate a target release
using the bin/activate
script. An example output follows:
$ bin/activate
Select an available release to activate:
[1] master/0/bare (default)
[2] hawthorn/1/bare
[3] hawthorn/1/oee
Your choice: 3
# Copy/paste hawthorn/1/oee environment:
export EDX_RELEASE="hawthorn.1"
export FLAVOR="oee"
export EDX_RELEASE_REF="open-release/hawthorn.1"
export EDX_DEMO_RELEASE_REF="open-release/hawthorn.1"
# Or run the following command:
. ${HOME}/Work/openedx-docker/releases/hawthorn/1/oee/activate
# Check your environment with:
make info
Once your environment is set, start the full project by running:
$ make bootstrap
You should now be able to view the web applications:
nginx
at: http://localhost:8073nginx
at: http://localhost:8083See other available commands by running:
$ make --help
If you intend to work on edx-platform or its configuration, you'll need to compile static files in local directories that are mounted as docker volumes in the target container:
$ make dev-assets
Now you can start services development server via:
$ make dev
You should be able to view the web applications:
To work on a particular theme, we invite you to use the paver watch_assets
command; e.g.:
$ make dev-watch
Troubleshooting: if the command above raises the following error:
OSError: inotify watch limit reached
Then you will need to increase the host's fs.inotify.max_user_watches
kernel setting (for reference, see https://unix.stackexchange.com/a/13757):
# /etc/sysctl.conf (debian based)
fs.inotify.max_user_watches=524288
The aim of this project is to prepare several flavors of images, the docker
files and settings of which are living in their own directory (see
releases/
)
Release paths on the current repository are of the form:
{release name}/{release number}/{flavor}
With:
hawthorn
)1
)bare
for standard OpenEdx release and
oee
for OpenEdx Extended release).We are pushing to DockerHub
only images that are the result of a tag
respecting the following pattern:
{release}(-{flavor})-x.y.z
The release
(e.g. hawthorn.1
) typically includes the release name
(e.g. hawthorn
) and the release number
(e.g. 1
). The flavor is
optional.
Here are some valid examples:
dogwood.3-1.0.3
hawthorn.1-oee-2.0.1
This project also provides an nginx companion image that can be used
alongside the edxapp
image for faster deployments and better performance.
The classical way to handle and serve static files in a Django application is
to collect them (using the collectstatic
management command) and post-process
them using an appropriate storage back-end that uses cache-busting techniques
to avoid old versus new static files collisions (e.g.
ManifestStaticFilesStorage
).
Depending on the edx-platform
release, some files may not benefit from a
cache busting md5 hash, leading to unexpected side effects during deployment.
To prevent such behavior, for each new openedx-docker
release, we will also
release an
edxapp-nginx
image with the same Docker tag. This image is an OpenShift-ready nginx
image with embedded
edxapp
's static files. You are supposed to use this image to serve your
static files, media and reverse proxy to the version-matching edxapp
instance.
If what you're looking for is a quick 1-click installation of the complete Open edX stack, you may take a look at Tutor.
The code in this repository is licensed under the GNU AGPL-3.0 terms unless otherwise noted.
Please see LICENSE
for details.