Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jobcespedes/docker-compose-moodle
This project quickly builds a local workspace for Moodle (Apache2, PHP-FPM with XDEBUG y Postgres) using containers for each of its main components. The local workspace is built and managed by Docker Compose
https://github.com/jobcespedes/docker-compose-moodle
apache2 container development docker docker-compose moodle php-fpm postgres xdebug
Last synced: 1 day ago
JSON representation
This project quickly builds a local workspace for Moodle (Apache2, PHP-FPM with XDEBUG y Postgres) using containers for each of its main components. The local workspace is built and managed by Docker Compose
- Host: GitHub
- URL: https://github.com/jobcespedes/docker-compose-moodle
- Owner: jobcespedes
- License: apache-2.0
- Created: 2017-03-18T01:21:12.000Z (almost 8 years ago)
- Default Branch: main
- Last Pushed: 2024-10-12T07:39:47.000Z (4 months ago)
- Last Synced: 2024-10-12T10:09:23.288Z (4 months ago)
- Topics: apache2, container, development, docker, docker-compose, moodle, php-fpm, postgres, xdebug
- Language: Dockerfile
- Homepage:
- Size: 63.9 MB
- Stars: 49
- Watchers: 7
- Forks: 28
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# docker-compose-moodle
![Moodle](https://img.shields.io/badge/Moodle-4.5-blue.svg?colorB=f98012)
![Nginx](https://img.shields.io/badge/Nginx-1.20-blue.svg?colorB=557697)
![PHP](https://img.shields.io/badge/PHP-8-blue.svg?colorB=8892BF)
![Postgres](https://img.shields.io/badge/Postgres-13-blue.svg?colorB=0085B0)
[![Buy me a coffee](https://img.shields.io/badge/$-BuyMeACoffee-blue.svg)](https://www.buymeacoffee.com/jobcespedes)
[![Software License](https://img.shields.io/badge/License-APACHE-black.svg?style=flat-square&colorB=585ac2)](LICENSE)>Leer en [**Español**](#español)
This project quickly builds a local workspace for Moodle (Nginx, PHP-FPM with XDEBUG y Postgres) using containers for each of its main components. The local workspace is built and managed by Docker Compose
## Quickstart:
1. Install Docker. Check out how to install [Docker](https://docs.docker.com/install/)
2. Install Docker Compose. Check out how to install [Docker Compose](https://docs.docker.com/compose/install/)
3. Download this repo: `git clone https://github.com/jobcespedes/docker-compose-moodle.git && cd docker-compose-moodle`
4. Clone Moodle repo: `git clone --branch MOODLE_401_STABLE --depth 1 https://github.com/moodle/moodle html`
5. Run with: `docker-compose up -d`## Contents
1. [Environment Variables](#Environment-variables)
2. [Docker Compose Resources](#Docker-Compose-resources)
3. [Workspace Operations](#Project-management-with-Docker-Compose)
4. [Debugging with XDEBUG](#XDEBUG)
5. [Moodle Cron Debugging](#Cron-debugging)
6. [Database management with Pgadmin4](#Pgadmin4)
7. [Backup and restore database](#Backup-and-restore-database)
8. [Install Docker](https://docs.docker.com/install/)
9. [Install Docker Compose](https://docs.docker.com/compose/install/)## Environment variables
The following table describes environment variables set in [**.env**](.env). The defaults work for a initial setup. They can be modified if needed.| Variable | Default value | Use |
| :-------------------- | :----------------- | :----------------------------------------------------------------------- |
| **REPO_FOLDER** | html | Default relative path for Moodle repo |
| **DOCUMENT_ROOT** | /var/www/html | Mount point inside containers for volume **REPO_FOLDER** |
| **MY_TZ** | America/Costa_Rica | Containers timezone |
| **PG_LOCALE** | es_CR | Containers locale |
| **PG_PORT** | 5432 | Postregres port to expose |
| **POSTGRES_DB** | moodle | Postgres DB for Moodle |
| **POSTGRES_USER** | user | DB user for Moodle |
| **POSTGRES_PASSWORD** | password | DB password for Moodle |
| **PHP_FPM_PORT** | 9000 | PHP-FPM port to connect nginx and php-fpm services |
| **ALIAS_DOMAIN** | localhost | Domain Alias |
| **WWW_PORT** | 80 | Web port to be bound |
| **MOODLE_DATA** | /var/moodledata | Mount point inside containers for Moodle data folder |
| **WWWROOT** | localhost | Host part to set in Moodle file 'config.php' for config option 'wwwroot' |
| **MOODLE_INSTALL_UNATTENDED** | true | Moodle unattended installation |## Docker Compose resources
The following table sums up Docker Compose resources.| Component | Type | Responsability | Content | Config |
| :---------------- | :-------- | :---------------------- | :--------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **nginx** | Container | Web server | Centos Stream 9, Nginx | [Nginx](https://quay.io/repository/krestomatio/nginx?tab=info) server for [Moodle](https://docs.moodle.org/405/en/Nginx) |
| **cron** | Container | Cron task for Moodle | Debian9, Cron | [Moodle cron task](https://docs.moodle.org/405/en/Cron) and its frequency |
| **php-fpm** | Container | Process manager for PHP | Debian9, PHP-FPM, XDEBUG | PHP, its modules and Moodle dependencies |
| **postgres** | Container | DBMS | Centos Stream 9, Postgres | [User and DB](https://hub.docker.com/_/postgres/) |
| **db_dumps** | Volume | Restore db when built | Dump files for DB to restore | To restore an initial database if you start the container with a data directory that is empty. File name should be "dump-init.dump" |
| **moodledata** | Volume | Moodle data store | Data generated by moodle | [Moodle data dir ](https://docs.moodle.org/405/en/Installing_Moodle#Create_the_.28moodledata.29_data_directory) |
| ***REPO_FOLDER*** | Volume | Moodle code | Moodle code | It is set to 'html/' by deafult (check out [**.env**](.env)) |## Project management with Docker Compose
> **Inside project folder**
1. Run project
``` bash
docker-compose up -d
# Different project name
# docker-compose -p my-proj up -d
```
2. Stop project
``` bash
docker-compose stop
# docker-compose stop php-fpm
```
3. Start project
``` bash
docker-compose start
# docker-compose start php-fpm
```
4. Remove project
``` bash
docker-compose down
# Remove volumes too
# docker-compose --volumes
# With different project name:
# docker-compose -p my-proj down
```
5. Logs
``` bash
docker-compose logs
# docker-compose logs -f --tail="20" php-fpm
```## XDEBUG
> Use idekey `PHPTEST`#### PHPStorm
Debug config for IDE PHPStorm:1. Add server:
* Settings -> Languages -> PHP -> Servers
* Name: localhost
* Host: localhost
* Port: 80
* Debugger: Xdebug
* Use path mapping: checked
* Absolute path on the server: /var/www/html![Debug button](docs/img/phpstorm_add_server.gif)
2. Add PHP remote debug
* Run / Debug Configurations -> PHP remote debug
* Use server created in step #1 and set idekey `PHPTEST`![Debug button](docs/img/phpstorm_add_remote_debug.gif)
3. Enable `Start listening for PHP Debug Connections` ![Debug button](docs/img/phpstorm_enable_debug.png)
#### VSCode
Debug config for IDE VSCode [here](.vscode/launch.json)### Cron debugging
Follow previous steps, set a breakpoint and then run:
```bash
docker-compose exec php-fpm php admin/cli/cron.php
```
There is a scrip for [Specific cron tasks](https://docs.moodle.org/405/en/Administration_via_command_line). For example:
```bash
docker-compose exec php-fpm php admin/tool/task/cli/schedule_task.php --execute='\core\task\cache_cleanup_task'
# Listing tasks
# docker-compose exec php-fpm php admin/tool/task/cli/schedule_task.php --list
```## Pgadmin4
Config pgadmin4
1. Go to http://localhost:5050
2. In ```File -> Preferences -> Binary paths``` set ```/usr/bin```
3. Add new server:
* Tab ```General```
* Name: Any name you want
* Tab ```Connection```
* Host name/address: ```postgres```
* Host Username: ```user```
* Host Password: ```password```
* Save## Backup and restore database
When needed, backup and restore of the database could be done in the following way.
```bash
# Set env vars
POSTGRES_USER=user
POSTGRES_DB=moodle
DB_DUMP_NAME=dump-init.$(date +"%Y%m%d%H%M%S").dump# Backup
# -Fc Output a custom-format archive suitable for input into pg_restore
docker-compose exec postgres pg_dump -U ${POSTGRES_USER} ${POSTGRES_DB} -Fc -f /opt/db_dumps/${DB_DUMP_NAME}# Restore
# -c Clean (drop) database objects before recreating them.
# -C Create the database before restoring into it
docker-compose exec postgres pg_restore -U ${POSTGRES_USER} -d postgres -c -C -O --role ${POSTGRES_USER} /opt/db_dumps/${DB_DUMP_NAME}
```A database can be automatically restored when postgres service starts. By placing a dump file inside 'db_dumps' folder and naming it "dump-init.dump", postgres container will try to restore that file as an initial database if data directory is empty.
> **IMPORTANT**: Depending of size, database initial availability could be delayed# Español
Este es un repositorio para crear rápidamente un entorno de trabajo con Moodle (Nginx, PHP-FPM con XDEBUG y Postgres) usando contenedores para cada uno sus principales componentes. El entorno de trabajo se crea y gestiona con Docker Compose.## Pasos rápidos para crear proyecto:
1. Tener Docker. Ver como instalar [Docker](https://docs.docker.com/install/)
2. Tener Docker Compose. Ver como instalar [Docker Compose](https://docs.docker.com/compose/install/)
3. Descargar este repo y acceder a él: ```git clone https://github.com/jobcespedes/docker-compose-moodle.git && cd docker-compose-moodle```
4. Copiar repositorio de código de Moodle: ```git clone --branch MOODLE_401_STABLE --depth 1 https://github.com/moodle/moodle html```
5. Desplegar con: ```docker-compose up -d```## Variables de ambiente
La siguiente tabla contiene las variables utilizadas en el archivo [**.env**](.env) para Docker Compose. Los valores por defecto funcionan para una configuración inicial. Cámbielos de ser necesario.| Variable | Valor por defecto | Utilidad |
| :-------------------- | :----------------- | :----------------------------------------------------------- |
| **REPO_FOLDER** | html | Ruta relativa para el código de Moodle |
| **DOCUMENT_ROOT** | /var/www/html | Punto de montaje para **REPO_FOLDER** dentro de contenedores |
| **MY_TZ** | America/Costa_Rica | Zona horaria para los contenedores |
| **PG_LOCALE** | es_CR | Configuración de lugar |
| **PG_PORT** | 5432 | Puerto de base de datos postgres a publicar |
| **POSTGRES_DB** | moodle | Nombre de la base de datos postgres de Moodle |
| **POSTGRES_USER** | user | Nombre de usuario de la base de datos postgres de Moodle |
| **POSTGRES_PASSWORD** | password | Contraseña de la base de datos postgres de Moodle |
| **PHP_FPM_PORT** | 9000 | Puerto para conectar nginx con php-fpm |
| **ALIAS_DOMAIN** | localhost | Alias del Dominio |
| **WWW_PORT** | 80 | Puerto web a publicar |
| **MOODLE_DATA** | /var/moodledata | Carpeta de datos de Moodle a montar en los contenedores |
| **WWWROOT** | localhost | Para de nombre de host en la url de config.php de Moodle |
| **MOODLE_INSTALL_UNATTENDED** | true | Instalación de Moodle sin intervención del usuario |## Estructura de Docker Compose
A continuación se incluye una tabla que resume la estructura del archivo de Docker Compose:| Componente | Tipo | Responsabilidad | Contenido | Configuración |
| :---------------- | :--------- | :------------------------------------------ | :------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **nginx** | Contenedor | Servidor web | Centos Stream, Nginx | Servidor [Nginx](https://quay.io/repository/krestomatio/nginx?tab=info) para [Moodle](https://docs.moodle.org/405/es/Nginx) |
| **cron** | Contenedor | Tarea de cron de Moodle | Debian9, Cron | Frecuencia de ejecución de tarea [cron de Moodle](https://docs.moodle.org/405/es/Cron) |
| **php-fpm** | Contenedor | Interprete y manejador de procesos para PHP | Debian9, PHP-FPM, XDEBUG | Modulos de php y paquetes adicionales para Moodle |
| **postgres** | Contenedor | Gestor de base de datos | Centos Stream, Postgres | [Usuario y base de datos](https://hub.docker.com/_/postgres/) |
| **db_dumps** | Volumen | Restaurar una base de datos inicial | Archivos de respaldo de base de datos. | Para restaurar al iniciar si se comienza con directorio de datos vacío. El nombre del archivo de respaldo a utilizar debe ser "dump-init.dump" |
| **moodledata** | Volumen | Almacén de datos de Moodle | Archivos generados por Moodle | [Moodle data dir ](https://docs.moodle.org/all/es/Gu%C3%ADa_r%C3%A1pida_de_Instalaci%C3%B3n#Crea_el_directorio_de_datos) |
| ***REPO_FOLDER*** | Volumen | Código de aplicación | Código de Moodle | Por defecto es './html' (ver archivo .env) |## Gestión del proyecto con Docker Compose
> **Dentro de la carpeta del proyecto**
1. Correr proyecto
``` bash
docker-compose up -d
# Nombrar el proyecto diferente a la carpeta:
# docker-compose -p mi-proy up -d
```
2. Detener el proyecto
``` bash
docker-compose stop
# docker-compose stop php-fpm
```
3. Iniciar el proyecto
``` bash
docker-compose start
# docker-compose start php-fpm
```
4. Eliminar proyecto
``` bash
docker-compose down
# Eliminar los volumenes también:
# docker-compose --volumes
# Eliminar con un nombre de proyecto especifico:
# docker-compose -p mi-proy down
```
5. Logs
``` bash
docker-compose logs
# docker-compose logs -f --tail="20" php-fpm
```### XDEBUG
> Se utiliza el idekey `PHPTEST`#### PHPStorm
Configuración para depurar con IDE PHPStorm:1. Agregar server:
* Settings -> Languages -> PHP -> Servers
* Name: localhost
* Host: localhost
* Port: 80
* Debugger: Xdebug
* Use path mapping: checked
* Absolute path on the server: /var/www/html![Debug button](docs/img/phpstorm_add_server.gif)
2. Agregar PHP remote debug
* Run / Debug Configurations -> PHP remote debug
* Use server created in step #1 and set idekey `PHPTEST`![Debug button](docs/img/phpstorm_add_remote_debug.gif)
3. Activar botón `Start listening for PHP Debug Connections` ![Debug button](docs/img/phpstorm_enable_debug.png)
### Depurar tareas de cron
Siga los pasos anteriores, establezca una interrupción y ejecuta en el la línea de comandos:
```bash
docker-compose exec php-fpm php admin/cli/cron.php
```
Se pueden ejecutar también [tareas específicas de cron](https://docs.moodle.org/all/es/Administraci%C3%B3n_por_l%C3%ADnea_de_comando#Trabajos_agendados)Por ejemplo:
```bash
docker-compose exec php-fpm php admin/tool/task/cli/schedule_task.php --execute='\core\task\cache_cleanup_task'
# Listar tareas
# docker-compose exec php-fpm php admin/tool/task/cli/schedule_task.php --list
```### Pgadmin4
Pasos para usar pgadmin4
1. Ingresar a http://localhost:5050
2. En ```File -> Preferences -> Binary paths``` establecer en ```/usr/bin```
3. Agregar nuevo servidor:
* Pestaña ```General```
* Name: Un nombre para el servidor
* Pestaña ```Connection```
* Host name/address: ```postgres```
* Host Username: ```user```
* Host Password: ```password```
* Guardar## Respaldar y restaurar la base de datos
Es posible respaldar y restaurar la base de datos de la siguiente manera.
```bash
# Establecer vars de entorno
POSTGRES_USER=user
POSTGRES_DB=moodle
DB_DUMP_NAME=dump-init.$(date +"%Y%m%d%H%M%S").dump# Respaldar
# -Fc Formato personalizado para pg_restore
docker-compose exec postgres pg_dump -U ${POSTGRES_USER} ${POSTGRES_DB} -Fc -f /opt/db_dumps/${DB_DUMP_NAME}# Restaurar
# -c Limpia los objetos de la base de datos antes de recrearlos
# -C Crea la base de datos antes de restaurarla
docker-compose exec postgres pg_restore -U ${POSTGRES_USER} -d postgres -c -C -O --role ${POSTGRES_USER} /opt/db_dumps/${DB_DUMP_NAME}
```Se puede restaurar una base de datos, usando pg_dump (formato personalizado de Posgres), a la caperta 'db_dumps' y nombrando el archivo como dump-init.dump
> **IMPORTANTE**: Dependiendo del tamaño, la ejecución de este sql podría demorar la disponibilidad inicial de la base de datos.