{"id":16451601,"url":"https://github.com/jobcespedes/docker-compose-moodle","last_synced_at":"2025-04-09T20:08:14.402Z","repository":{"id":86633966,"uuid":"85367313","full_name":"jobcespedes/docker-compose-moodle","owner":"jobcespedes","description":"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","archived":false,"fork":false,"pushed_at":"2024-10-25T21:52:08.000Z","size":66985,"stargazers_count":54,"open_issues_count":0,"forks_count":29,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-04-09T20:08:07.872Z","etag":null,"topics":["apache2","container","development","docker","docker-compose","moodle","php-fpm","postgres","xdebug"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jobcespedes.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-03-18T01:21:12.000Z","updated_at":"2025-04-08T08:59:22.000Z","dependencies_parsed_at":null,"dependency_job_id":"4329af35-b383-4e20-b92e-1f13fea76c11","html_url":"https://github.com/jobcespedes/docker-compose-moodle","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jobcespedes%2Fdocker-compose-moodle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jobcespedes%2Fdocker-compose-moodle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jobcespedes%2Fdocker-compose-moodle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jobcespedes%2Fdocker-compose-moodle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jobcespedes","download_url":"https://codeload.github.com/jobcespedes/docker-compose-moodle/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248103872,"owners_count":21048245,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apache2","container","development","docker","docker-compose","moodle","php-fpm","postgres","xdebug"],"created_at":"2024-10-11T10:09:22.210Z","updated_at":"2025-04-09T20:08:14.379Z","avatar_url":"https://github.com/jobcespedes.png","language":"Shell","funding_links":["https://www.buymeacoffee.com/jobcespedes"],"categories":[],"sub_categories":[],"readme":"# docker-compose-moodle\n![Moodle](https://img.shields.io/badge/Moodle-4.5-blue.svg?colorB=f98012)\n![Nginx](https://img.shields.io/badge/Nginx-1.20-blue.svg?colorB=557697)\n![PHP](https://img.shields.io/badge/PHP-8-blue.svg?colorB=8892BF)\n![Postgres](https://img.shields.io/badge/Postgres-13-blue.svg?colorB=0085B0)\n[![Buy me a coffee](https://img.shields.io/badge/$-BuyMeACoffee-blue.svg)](https://www.buymeacoffee.com/jobcespedes)\n[![Software License](https://img.shields.io/badge/License-APACHE-black.svg?style=flat-square\u0026colorB=585ac2)](LICENSE)\n\n\u003eLeer en [**Español**](#español)\n\nThis 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\n\n## Quickstart:\n1. Install Docker. Check out how to install [Docker](https://docs.docker.com/install/)\n2. Install Docker Compose. Check out how to install [Docker Compose](https://docs.docker.com/compose/install/)\n3. Download this repo: `git clone https://github.com/jobcespedes/docker-compose-moodle.git \u0026\u0026 cd docker-compose-moodle`\n4. Clone Moodle repo: `git clone --branch MOODLE_401_STABLE --depth 1 https://github.com/moodle/moodle html`\n5. Run with: `docker-compose up -d`\n\n## Contents\n1. [Environment Variables](#Environment-variables)\n2. [Docker Compose Resources](#Docker-Compose-resources)\n3. [Workspace Operations](#Project-management-with-Docker-Compose)\n4. [Debugging with XDEBUG](#XDEBUG)\n5. [Moodle Cron Debugging](#Cron-debugging)\n6. [Database management with Pgadmin4](#Pgadmin4)\n7. [Backup and restore database](#Backup-and-restore-database)\n8. [Install Docker](https://docs.docker.com/install/)\n9. [Install Docker Compose](https://docs.docker.com/compose/install/)\n\n## Environment variables\nThe following table describes environment variables set in [**.env**](.env). The defaults work for a initial setup. They can be modified if needed.\n\n| Variable              | Default value      | Use                                                                      |\n| :-------------------- | :----------------- | :----------------------------------------------------------------------- |\n| **REPO_FOLDER**       | html               | Default relative path for Moodle repo                                    |\n| **DOCUMENT_ROOT**     | /var/www/html      | Mount point inside containers for volume **REPO_FOLDER**                 |\n| **MY_TZ**             | America/Costa_Rica | Containers timezone                                                      |\n| **PG_LOCALE**         | es_CR              | Containers locale                                                        |\n| **PG_PORT**           | 5432               | Postregres port to expose                                                |\n| **POSTGRES_DB**       | moodle             | Postgres DB for Moodle                                                   |\n| **POSTGRES_USER**     | user               | DB user for Moodle                                                       |\n| **POSTGRES_PASSWORD** | password           | DB password for Moodle                                                   |\n| **PHP_FPM_PORT**      | 9000               | PHP-FPM port to connect nginx and php-fpm services                  |\n| **ALIAS_DOMAIN**      | localhost          | Domain Alias                                                             |\n| **WWW_PORT**          | 80                 | Web port to be bound                                                     |\n| **MOODLE_DATA**       | /var/moodledata    | Mount point inside containers for Moodle data folder                     |\n| **WWWROOT**           | localhost          | Host part to set in Moodle file 'config.php' for config option 'wwwroot' |\n| **MOODLE_INSTALL_UNATTENDED** | true        | Moodle unattended installation                                           |\n\n## Docker Compose resources\nThe following table sums up Docker Compose resources.\n\n| Component         | Type      | Responsability          | Content                      | Config                                                                                                                                                                                                 |\n| :---------------- | :-------- | :---------------------- | :--------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **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) |\n| **cron**          | Container | Cron task for Moodle    | Debian9, Cron                | [Moodle cron task](https://docs.moodle.org/405/en/Cron) and its frequency                                                                                                                               |\n| **php-fpm**       | Container | Process manager for PHP | Debian9, PHP-FPM, XDEBUG     | PHP, its modules and Moodle dependencies                                                                                                                                                               |\n| **postgres**      | Container | DBMS                    | Centos Stream 9, Postgres            | [User and DB](https://hub.docker.com/_/postgres/)                                                                                                                                                      |\n| **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\"                                                                    |\n| **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)                                                                                         |\n| ***REPO_FOLDER*** | Volume    | Moodle code             | Moodle code                  | It is set to 'html/' by deafult (check out [**.env**](.env))                                                                                                                                           |\n\n## Project management with Docker Compose\n\u003e **Inside project folder**\n1. Run project\n``` bash\ndocker-compose up -d\n# Different project name\n# docker-compose -p my-proj up -d\n```\n2. Stop project\n``` bash\ndocker-compose stop\n# docker-compose stop php-fpm\n```\n3. Start project\n``` bash\ndocker-compose start\n# docker-compose start php-fpm\n```\n4. Remove project\n``` bash\ndocker-compose down\n# Remove volumes too\n# docker-compose --volumes\n# With different project name:\n# docker-compose -p my-proj down\n```\n5. Logs\n``` bash\ndocker-compose logs\n# docker-compose logs -f --tail=\"20\" php-fpm\n```\n\n## XDEBUG\n\u003e Use idekey `PHPTEST`\n\n#### PHPStorm\nDebug config for IDE PHPStorm:\n\n1. Add server:\n    * Settings -\u003e Languages -\u003e PHP -\u003e Servers\n    * Name: localhost\n    * Host: localhost\n    * Port: 80\n    * Debugger: Xdebug\n    * Use path mapping: checked\n    * Absolute path on the server: /var/www/html\n\n![Debug button](docs/img/phpstorm_add_server.gif)\n\n2. Add PHP remote debug\n    * Run / Debug Configurations -\u003e PHP remote debug\n    * Use server created in step #1 and set idekey `PHPTEST`\n\n![Debug button](docs/img/phpstorm_add_remote_debug.gif)\n\n3. Enable `Start listening for PHP Debug Connections` ![Debug button](docs/img/phpstorm_enable_debug.png)\n\n#### VSCode\nDebug config for IDE VSCode [here](.vscode/launch.json)\n\n### Cron debugging\nFollow previous steps, set a breakpoint and then run:\n```bash\ndocker-compose exec php-fpm php admin/cli/cron.php\n```\nThere is a scrip for [Specific cron tasks](https://docs.moodle.org/405/en/Administration_via_command_line). For example:\n```bash\ndocker-compose exec php-fpm php admin/tool/task/cli/schedule_task.php --execute='\\core\\task\\cache_cleanup_task'\n# Listing tasks\n# docker-compose exec php-fpm php admin/tool/task/cli/schedule_task.php --list\n```\n\n## Pgadmin4\nConfig pgadmin4\n1. Go to http://localhost:5050\n2. In ```File -\u003e Preferences -\u003e Binary paths``` set ```/usr/bin```\n3. Add new server:\n    * Tab ```General```\n        * Name: Any name you want\n    * Tab ```Connection```\n        * Host name/address: ```postgres```\n        * Host Username: ```user```\n        * Host Password: ```password```\n    * Save\n\n## Backup and restore database\nWhen needed, backup and restore of the database could be done in the following way.\n```bash\n# Set env vars\nPOSTGRES_USER=user\nPOSTGRES_DB=moodle\nDB_DUMP_NAME=dump-init.$(date +\"%Y%m%d%H%M%S\").dump\n\n# Backup\n# -Fc  Output a custom-format archive suitable for input into pg_restore\ndocker-compose exec postgres pg_dump -U ${POSTGRES_USER} ${POSTGRES_DB} -Fc -f /opt/db_dumps/${DB_DUMP_NAME}\n\n# Restore\n# -c  Clean (drop) database objects before recreating them.\n# -C  Create the database before restoring into it\ndocker-compose exec postgres pg_restore -U ${POSTGRES_USER} -d postgres -c -C -O --role ${POSTGRES_USER} /opt/db_dumps/${DB_DUMP_NAME}\n```\n\nA 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.\n\u003e **IMPORTANT**: Depending of  size, database initial availability could be delayed\n\n# Español\nEste 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.\n\n## Pasos rápidos para crear proyecto:\n1. Tener Docker. Ver como instalar [Docker](https://docs.docker.com/install/)\n2. Tener Docker Compose. Ver como instalar [Docker Compose](https://docs.docker.com/compose/install/)\n3. Descargar este repo y acceder a él: ```git clone https://github.com/jobcespedes/docker-compose-moodle.git \u0026\u0026 cd docker-compose-moodle```\n4. Copiar repositorio de código de Moodle: ```git clone --branch MOODLE_401_STABLE --depth 1 https://github.com/moodle/moodle html```\n5. Desplegar con: ```docker-compose up -d```\n\n## Variables de ambiente\nLa 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.\n\n| Variable              | Valor por defecto  | Utilidad                                                     |\n| :-------------------- | :----------------- | :----------------------------------------------------------- |\n| **REPO_FOLDER**       | html               | Ruta relativa para el código de Moodle                       |\n| **DOCUMENT_ROOT**     | /var/www/html      | Punto de montaje para **REPO_FOLDER** dentro de contenedores |\n| **MY_TZ**             | America/Costa_Rica | Zona horaria para los contenedores                           |\n| **PG_LOCALE**         | es_CR              | Configuración de lugar                                       |\n| **PG_PORT**           | 5432               | Puerto de base de datos postgres a publicar                  |\n| **POSTGRES_DB**       | moodle             | Nombre de la base de datos postgres de Moodle                |\n| **POSTGRES_USER**     | user               | Nombre de usuario de la base de datos postgres de Moodle     |\n| **POSTGRES_PASSWORD** | password           | Contraseña de la base de datos postgres de Moodle            |\n| **PHP_FPM_PORT**          | 9000               | Puerto para conectar nginx con php-fpm                     |\n| **ALIAS_DOMAIN**      | localhost          | Alias del Dominio                                            |\n| **WWW_PORT**          | 80                 | Puerto web a publicar                                        |\n| **MOODLE_DATA**       | /var/moodledata    | Carpeta de datos de Moodle a montar en los contenedores      |\n| **WWWROOT**           | localhost          | Para de nombre de host en la url de config.php de Moodle     |\n| **MOODLE_INSTALL_UNATTENDED** | true        | Instalación de Moodle sin intervención del usuario           |\n\n## Estructura de Docker Compose\nA continuación se incluye una tabla que resume la estructura del archivo de Docker Compose:\n\n| Componente        | Tipo       | Responsabilidad                             | Contenido                              | Configuración                                                                                                                                            |\n| :---------------- | :--------- | :------------------------------------------ | :------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- |\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) |\n| **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)                                                                    |\n| **php-fpm**       | Contenedor | Interprete y manejador de procesos para PHP | Debian9, PHP-FPM, XDEBUG               | Modulos de php y paquetes adicionales para Moodle                                                                                                        |\n| **postgres**      | Contenedor | Gestor de base de datos                     | Centos Stream, Postgres                      | [Usuario y base de datos](https://hub.docker.com/_/postgres/)                                                                                            |\n| **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\"           |\n| **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)                                 |\n| ***REPO_FOLDER*** | Volumen    | Código de aplicación                        | Código de Moodle                       | Por defecto es './html' (ver archivo .env)                                                                                                               |\n\n## Gestión del proyecto con Docker Compose\n\u003e **Dentro de la carpeta del proyecto**\n1. Correr proyecto\n``` bash\ndocker-compose up -d\n# Nombrar el proyecto diferente a la carpeta:\n# docker-compose -p mi-proy up -d\n```\n2. Detener el proyecto\n``` bash\ndocker-compose stop\n# docker-compose stop php-fpm\n```\n3. Iniciar el proyecto\n``` bash\ndocker-compose start\n# docker-compose start php-fpm\n```\n4. Eliminar proyecto\n``` bash\ndocker-compose down\n# Eliminar los volumenes también:\n# docker-compose --volumes\n# Eliminar con un nombre de proyecto especifico:\n# docker-compose -p mi-proy down\n```\n5. Logs\n``` bash\ndocker-compose logs\n# docker-compose logs -f --tail=\"20\" php-fpm\n```\n\n### XDEBUG\n\u003e Se utiliza el idekey `PHPTEST`\n\n#### PHPStorm\nConfiguración para depurar con IDE PHPStorm:\n\n1. Agregar server:\n    * Settings -\u003e Languages -\u003e PHP -\u003e Servers\n    * Name: localhost\n    * Host: localhost\n    * Port: 80\n    * Debugger: Xdebug\n    * Use path mapping: checked\n    * Absolute path on the server: /var/www/html\n\n![Debug button](docs/img/phpstorm_add_server.gif)\n\n2. Agregar PHP remote debug\n    * Run / Debug Configurations -\u003e PHP remote debug\n    * Use server created in step #1 and set idekey `PHPTEST`\n\n![Debug button](docs/img/phpstorm_add_remote_debug.gif)\n\n3. Activar botón `Start listening for PHP Debug Connections` ![Debug button](docs/img/phpstorm_enable_debug.png)\n\n### Depurar tareas de cron\nSiga los pasos anteriores, establezca una interrupción y ejecuta en el la línea de comandos:\n```bash\ndocker-compose exec php-fpm php admin/cli/cron.php\n```\nSe 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:\n```bash\ndocker-compose exec php-fpm php admin/tool/task/cli/schedule_task.php --execute='\\core\\task\\cache_cleanup_task'\n# Listar tareas\n# docker-compose exec php-fpm php admin/tool/task/cli/schedule_task.php --list\n```\n\n### Pgadmin4\nPasos para usar pgadmin4\n1. Ingresar a http://localhost:5050\n2. En ```File -\u003e Preferences -\u003e Binary paths``` establecer en ```/usr/bin```\n3. Agregar nuevo servidor:\n    * Pestaña ```General```\n        * Name: Un nombre para el servidor\n    * Pestaña ```Connection```\n        * Host name/address: ```postgres```\n        * Host Username: ```user```\n        * Host Password: ```password```\n    * Guardar\n\n## Respaldar y restaurar la base de datos\nEs posible respaldar y restaurar la base de datos de la siguiente manera.\n```bash\n# Establecer vars de entorno\nPOSTGRES_USER=user\nPOSTGRES_DB=moodle\nDB_DUMP_NAME=dump-init.$(date +\"%Y%m%d%H%M%S\").dump\n\n# Respaldar\n# -Fc  Formato personalizado para pg_restore\ndocker-compose exec postgres pg_dump -U ${POSTGRES_USER} ${POSTGRES_DB} -Fc -f /opt/db_dumps/${DB_DUMP_NAME}\n\n# Restaurar\n# -c  Limpia los objetos de la base de datos antes de recrearlos\n# -C  Crea la base de datos antes de restaurarla\ndocker-compose exec postgres pg_restore -U ${POSTGRES_USER} -d postgres -c -C -O --role ${POSTGRES_USER} /opt/db_dumps/${DB_DUMP_NAME}\n```\n\nSe 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\n\u003e **IMPORTANTE**: Dependiendo del tamaño, la ejecución de este sql podría demorar la disponibilidad inicial de la base de datos.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjobcespedes%2Fdocker-compose-moodle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjobcespedes%2Fdocker-compose-moodle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjobcespedes%2Fdocker-compose-moodle/lists"}