Moodle LMS con PHP 8.3, Apache, PostgreSQL 17 y Redis - imagen mantenible y actualizable
10K+
Stack Docker completo para Moodle LMS basado en moodlehq/moodle-php-apache:8.3,
con código de Moodle descargado directamente desde GitHub en tiempo de build.
Esta rama (moodle-5.2) sigue MOODLE_502_STABLE, así que en teoría ya incluye los
futuros parches de la serie 5.2.x (5.2.1, 5.2.2...) — pero la recogida no es
automática. Cuando Moodle publique un nuevo parche, lanza el workflow a mano
desde GitHub Actions ("Docker Build and Publish" → Run workflow), o haz push
de cualquier cambio a esta rama; el build siempre usa el HEAD actual de
MOODLE_502_STABLE en ese momento.
| Servicio | Imagen | Puerto |
|---|---|---|
| Moodle (PHP 8.3 + Apache) | tesudacochino/moodle:<version> | 8080 |
| PostgreSQL 17 | postgres:17-alpine | interno |
| Redis 7 | redis:7-alpine | interno |
# Copiar y editar el archivo de configuración
cp .env.example .env
Edita .env y cambia al menos:
MOODLE_ADMIN_PASS — contraseña del adminDB_PASS — contraseña de PostgreSQLMOODLE_WWWROOT — URL de acceso (si no es localhost)make build # Build de la imagen (descarga Moodle desde GitHub, ~5 min)
make up # Levanta el stack completo
make logs # Ver el progreso de instalación
La primera vez Moodle instala la base de datos automáticamente. Accede en: http://localhost:8080
make help # Ver todos los comandos con descripción
make up # Levantar el stack
make down # Parar el stack
make restart # Reiniciar contenedores
make status # Estado de los contenedores
make logs # Logs en tiempo real
make shell # Bash en el contenedor Moodle
make shell-db # psql en PostgreSQL
make backup # Backup de BD + moodledata → ./backups/
make restore DB=backups/db_XXX.sql.gz # Restaurar backup
make purge # Purgar caches de Moodle
make info # Info del entorno
./scripts/update-moodle.sh MOODLE_502_STABLE
El script hace backup automático, actualiza la versión, rebuilda y ejecuta la migración de BD.
# 1. Backup de seguridad (¡no saltarse este paso!)
make backup
# 2. Cambiar versión en .env
# Edita .env y cambia MOODLE_VERSION=MOODLE_502_STABLE
# 3. Rebuild de la imagen (descarga la nueva versión de GitHub)
make rebuild
# 4. Aplicar upgrade de base de datos
make upgrade
| Rama Git | Versión Moodle | Soporte |
|---|---|---|
MOODLE_502_STABLE | 5.2.x | ✅ Última versión (requiere PHP >= 8.3) |
MOODLE_500_STABLE | 5.0.x | Activa |
MOODLE_405_STABLE | 4.5.x | LTS ✅ Recomendada |
MOODLE_404_STABLE | 4.4.x | Activa |
Añade plugins a plugins.txt y ejecuta:
make install-plugins
make upgrade # Para registrar los nuevos plugins en la BD
Formato de plugins.txt:
# tipo/nombre url_repositorio rama
mod/attendance https://github.com/danmarsden/moodle-mod_attendance MOODLE_502_STABLE
theme/moove https://github.com/willianmano/moodle-theme-moove MOODLE_502_STABLE
.env)| Variable | Default | Descripción |
|---|---|---|
MOODLE_VERSION | MOODLE_502_STABLE | Rama de Moodle a usar |
MOODLE_WWWROOT | http://localhost:8080 | URL pública de Moodle |
MOODLE_ADMIN_USER | admin | Usuario administrador |
MOODLE_ADMIN_PASS | Admin1234! | Contraseña admin |
MOODLE_LANG | es | Idioma por defecto |
DB_NAME | moodle | Nombre de la BD |
DB_USER | moodle | Usuario de BD |
DB_PASS | moodle | Contraseña de BD |
HTTP_PORT | 8080 | Puerto HTTP del host |
Moodle 5.2 en este stack permite configurar el correo directamente desde variables de entorno. Descomenta y ajusta en tu .env:
SMTP_HOSTS: Servidor SMTP (ej: smtp.gmail.com:587)SMTP_USER: Usuario (ej: [email protected])SMTP_PASS: Contraseña o App PasswordSMTP_SECURE: tls o sslSMTP_NOREPLY_ADDRESS: Dirección de remitente para notificacionesEl cron de Moodle está integrado en el contenedor. Se ejecuta cada minuto automáticamente. Puedes ver el log del cron con:
docker exec -it moodle tail -f /var/log/moodle-cron.log
Los backups se guardan en ./backups/ con timestamp:
db_YYYYMMDD_HHMMSS.sql.gz — Volcado de PostgreSQLmoodledata_YYYYMMDD_HHMMSS.tar.gz — Archivos de Moodlemoodlehq/moodle-php-apache está pensado para desarrollo/staging, no producción.MOODLE_SSLPROXY=true) y contraseñas fuertes.config.php se genera dinámicamente y hereda las variables del sistema.cron inyecta las variables de entorno necesarias desde /etc/environment."The Moodle root directory must not be publicly accessible" (Moodle 5.1+)
Desde Moodle 5.1, el código web-accesible vive en /public dentro del checkout —
DocumentRoot debe apuntar ahí, no a la raíz. Ya está corregido en
config/apache/moodle.conf en esta rama (moodle-5.2 en adelante). Si creas una
nueva rama de imagen para una serie ≥5.1, verifica que ese archivo siga apuntando a
/var/www/html/public — las ramas de series anteriores (4.5, 5.0) no tienen ese
directorio y deben mantener DocumentRoot /var/www/html.
El cron no envía correos
Verifica que las variables SMTP_* en el .env son correctas y reinicia el stack:
make restart
Permisos de archivos
Si editas archivos manualmente, asegúrate de que pertenecen a www-data:
docker exec -it moodle chown -R www-data:www-data /var/www/html
Content type
Image
Digest
sha256:b42c7c49d…
Size
471 MB
Last updated
7 days ago
docker pull molero/moodle