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 sigue MOODLE_502_STABLE — un cron semanal en CI (solo funciona porque
este workflow vive en main, la rama por defecto; GitHub Actions ignora
schedule: en cualquier otra rama) reconstruye la imagen contra el HEAD actual
de esa rama, así que los futuros parches de la serie 5.2.x (5.2.1, 5.2.2...) se
publican solos, sin tocar este repo.
| 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:ba114c2f5…
Size
471.1 MB
Last updated
5 days ago
docker pull molero/moodle