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
Apache License 2.0
52 stars 28 forks source link
apache2 container development docker docker-compose moodle php-fpm postgres xdebug

docker-compose-moodle

Moodle Nginx PHP Postgres Buy me a coffee Software License

Leer en 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
  2. Install Docker Compose. Check out how to install Docker Compose
  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
  2. Docker Compose Resources
  3. Workspace Operations
  4. Debugging with XDEBUG
  5. Moodle Cron Debugging
  6. Database management with Pgadmin4
  7. Backup and restore database
  8. Install Docker
  9. Install Docker Compose

Environment variables

The following table describes environment variables set in .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 server for Moodle
cron Container Cron task for Moodle Debian9, Cron Moodle cron task 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
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
REPO_FOLDER Volume Moodle code Moodle code It is set to 'html/' by deafult (check out .env)

Project management with Docker Compose

Inside project folder

  1. Run project
    docker-compose up -d
    # Different project name
    # docker-compose -p my-proj up -d
  2. Stop project
    docker-compose stop
    # docker-compose stop php-fpm
  3. Start project
    docker-compose start
    # docker-compose start php-fpm
  4. Remove project
    docker-compose down
    # Remove volumes too
    # docker-compose --volumes
    # With different project name:
    # docker-compose -p my-proj down
  5. Logs
    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

  1. Add PHP remote debug
    • Run / Debug Configurations -> PHP remote debug
    • Use server created in step #1 and set idekey PHPTEST

Debug button

  1. Enable Start listening for PHP Debug Connections Debug button

VSCode

Debug config for IDE VSCode here

Cron debugging

Follow previous steps, set a breakpoint and then run:

docker-compose exec php-fpm php admin/cli/cron.php

There is a scrip for Specific cron tasks. For example:

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.

# 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
  2. Tener Docker Compose. Ver como instalar Docker Compose
  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 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 para Moodle
cron Contenedor Tarea de cron de Moodle Debian9, Cron Frecuencia de ejecución de tarea cron de Moodle
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
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
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
    docker-compose up -d
    # Nombrar el proyecto diferente a la carpeta:
    # docker-compose -p mi-proy up -d
  2. Detener el proyecto
    docker-compose stop
    # docker-compose stop php-fpm
  3. Iniciar el proyecto
    docker-compose start
    # docker-compose start php-fpm
  4. Eliminar proyecto
    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
    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

  1. Agregar PHP remote debug
    • Run / Debug Configurations -> PHP remote debug
    • Use server created in step #1 and set idekey PHPTEST

Debug button

  1. Activar botón Start listening for PHP Debug Connections Debug button

Depurar tareas de cron

Siga los pasos anteriores, establezca una interrupción y ejecuta en el la línea de comandos:

docker-compose exec php-fpm php admin/cli/cron.php

Se pueden ejecutar también tareas específicas de cronPor ejemplo:

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.

# 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.