Moodle setup for Docker, build on Alpine Linux. The image is only +/- 70MB large.
Repository: https://github.com/erseco/alpine-moodle
- Built on the lightweight image https://github.com/erseco/alpine-php-webserver
- Very small Docker image size (+/-70MB)
- Uses PHP 8.3 for better performance, lower cpu usage & memory footprint
- Support for HA installations: php-redis, php-ldap (also with self-signed certs)
- Multi-arch support: 386, amd64, arm/v6, arm/v7, arm64, ppc64le, s390x
- Optimized for 100 concurrent users
- Optimized to only use resources when there's traffic (by using PHP-FPM's ondemand PM)
- Use of runit instead of supervisord to reduce memory footprint
- Configured cron to run as non-privileged user gliderlabs/docker-alpine#381 (comment)
- docker-compose sample with PostgreSQL and Redis
- Configuration via ENV variables
- Easily upgradable to new moodle versions
- The servers Nginx, PHP-FPM run under a non-privileged user (nobody) to make it more secure
- The logs of all the services are redirected to the output of the Docker container (visible with
docker logs -f <container name>
) - Follows the KISS principle (Keep It Simple, Stupid) to make it easy to understand and adjust the image to your needs
Start the Docker containers:
docker-compose up
Login on the system using the provided credentials (ENV vars)
In certain situations, you might need to run commands as root
within your Moodle container, for example, to install additional packages. You can do this using the docker-compose exec
command with the --user root
option. Here's how:
docker-compose exec --user root moodle sh
Define the ENV variables in docker-compose.yml file
Variable Name | Default | Description |
---|---|---|
LANG | en_US.UTF-8 | |
LANGUAGE | en_US:en | |
SITE_URL | http://localhost | Sets the public site url |
REVERSEPROXY | false | Enable when setting up advanced reverse proxy |
SSLPROXY | false | Disable SSL proxy to avoid site loop. Ej. Cloudfare |
REDIS_HOST | Set the host of the redis instance. Ej. redis | |
DB_TYPE | pgsql | mysqli - pgsql - mariadb |
DB_HOST | postgres | DB_HOST Ej. db container name |
DB_PORT | 5432 | Postgres=5432 - MySQL=3306 |
DB_NAME | moodle | |
DB_USER | moodle | |
DB_FETCHBUFFERSIZE | Set to 0 if using PostgresSQL poolers like PgBouncer in 'transaction' mode | |
DB_DBHANDLEOPTIONS | false | Set to true if using PostgresSQL poolers like PgBouncer which does not support sending options |
DB_HOST_REPLICA | Database hostname of the read-only replica database | |
DB_PORT_REPLICA | Database port of replica, left it empty to be same as DB_PORT | |
DB_USER_REPLICA | Database login username of replica, left it empty to be same as DB_USER | |
DB_PASS_REPLICA | Database login password of replica, left it empty to be same as DB_PASS | |
DB_PREFIX | mdl_ | Database prefix. WARNING: don't use numeric values or moodle won't start |
MY_CERTIFICATES | none | Trusted LDAP certificate or chain getting through base64 encode |
MOODLE_EMAIL | user@example.com | |
MOODLE_LANGUAGE | en | |
MOODLE_SITENAME | New-Site | |
MOODLE_USERNAME | moodleuser | |
MOODLE_PASSWORD | PLEASE_CHANGEME | |
SMTP_HOST | smtp.gmail.com | |
SMTP_PORT | 587 | |
SMTP_USER | your_email@gmail.com | |
SMTP_PASSWORD | your_password | |
SMTP_PROTOCOL | tls | |
MOODLE_MAIL_NOREPLY_ADDRESS | noreply@localhost | |
MOODLE_MAIL_PREFIX | [moodle] | |
AUTO_UPDATE_MOODLE | true | Set to false to disable performing update of Moodle (e.g. plugins) at docker start |
DEBUG | false | |
client_max_body_size | 50M | |
post_max_size | 50M | |
upload_max_filesize | 50M | |
max_input_vars | 5000 | |
PRE_CONFIGURE_COMMANDS | Commands to run before starting the configuration | |
POST_CONFIGURE_COMMANDS | Commands to run after finished the configuration |
You can define commands to be executed before and after the configuration of Moodle using the PRE_CONFIGURE_COMMANDS
and POST_CONFIGURE_COMMANDS
environment variables. These can be useful for tasks such as installing additional packages or running scripts.
Example docker-compose.yml
configuration:
version: '3'
services:
moodle:
image: erseco/alpine-moodle
environment:
SITE_URL: "http://localhost"
DB_TYPE: "pgsql"
DB_HOST: "postgres"
DB_PORT: 5432
DB_NAME: "moodle"
DB_USER: "moodle"
MOODLE_USERNAME: "admin"
MOODLE_PASSWORD: "admin"
PRE_CONFIGURE_COMMANDS: "echo 'Running pre-configure commands'"
POST_CONFIGURE_COMMANDS: "echo 'Running post-configure commands'"
You can also install Moodle plugins directly from a URL using the install_plugin.php
script. This can be useful for automating plugin installations during container setup.
Example command:
php admin/cli/install_plugin.php --url=https://github.com/mohessaid/moodle_local_plugin/archive/refs/heads/master.zip --run
This command will download and install the specified plugin into your Moodle instance.