Tutorial criar docker container moodle lms

Objetivo

O objetivo deste tutorial é criar um container enxuto com a Ferramenta de Gerenciamento de Cursos Moodle. Este setup aborda a configuração de um domínio e suporte à conexão https (SSL). Este setup não utiliza o container oficial do moodle-hq, ao invés disso cria um ambiente mais enxuto e instala o Moodle do repositório oficial manualmente pelo Dockerfile.

Considerações

Alguns entusiastas do Moodle LMS (vide fórum de suporte do moodle) não recomendam utilizar o moodle em um container. O principal motivo levantando é que orquestrar o moodle em um container ocasiona um overhead de recursos do servidor, pois adiciona mais uma camada de processamento e complexidade. Esta justificativa pode parecer relevante para alguns casos onde os recursos são limitados e os cursos possuem altas demandas. Porém, se possuir uma infraestrutura de servidores corretamente dimensionadas (preferencialmente com interface web desacoplada do banco de dados), ou baixa demanda concorrente nos cursos, utilizar um container no docker é uma opção simples e eficaz.

Condições de contorno

Este tutorial foi testado tanto em ambiente x86/amd64 quando ARM64. Ou seja, você pode utilizar este setup tanto em um computador/servidor, quanto em um raspberry pi, por exemplo.

Requisitos

Alguns recursos são necessários para que você possa seguir este tutorial:

  • Software docker e docker compose instalados e configurados
  • Conexão internet para realização dos downloads necessários
  • Capacidade de editar arquivos de configuração
  • Capacidade de executar comandos no servidor: preferencialmente via conexão ssh, caso servidor remoto

Vamos fornecer passo a passo sobre quais arquivos precisam ser editados e como editar estes arquivos pela linha de comando.

Passo a passo em como criar um container docker enxuto para o gerenciador de cursos Moodle LMS

Passo 1 – Conexão no servidor

Caso tenha acesso físico ao servidor ou computador (com acesso com teclado/mouse/monitor), que vá instalar o moodle, não é necessário conexão SSH. Caso contrário, levando em consideração que seu servidor possua o IP: 192.168.1.100, será necessário realizar a conexão pelo prompt. Você também precisa saber qual seu usuário de conexão SSH e sua senha/certificado configurado. Para realizar a conexão, execute o comando:

ssh usuario@192.168.1.100

Passo 2 – Criar a pasta para o container

É interessante ter uma basta chamada “docker” para guardar os arquivos de configuração e os volumes dos seus containers criados. Pensando na pasta home do seu usuário, vamos criar então:

mkdir ~/docker
mkdir ~/docker/moodle
cd ~/docker/moodle

Passo 3 – Criar arquivos de configuração

Neste setup não vamos utilizar a diretiva HTTP_X_FORWARDED_PROTO.  Então vamos configurar a imagem do container para acessar o certificado SSL externamente e habilitar suporte SSL dentro do container também, pela porta 443.

Os arquivos que precisam ser criados são:

  • .env: este arquivo descreve valores para variáveis que vamos utilizar no arquivo de configuração do docker-compose.yml. Por exemplo: nome de usuário do banco, senha do banco de dados, domínio, etc.
  • Dockerfile: arquivo que descreve como o container do moodle deve ser criado.
  • docker-compose.yml: descreve o conjunto de containers devem ser criados e suas características.
  • default-ssl.conf: arquivo que descreve a configuração do virtualhost para ter suporte ssl (porta 443).
  • 000-default.conf: arquivo que descreve a configuração do virtualhost para acesso sem ssl (porta 80).
  • create-moodle.sh: arquivo de shell que cria todos os arquivos acima, exceto o arquivo .env.

Na prática, vamos ter que criar apenas 2 arquivos, o arquivo .env e o arquivo create-moodle.sh.

Estamos dentro da pasta ~/docker/moodle, então já podemos criar o arquivo .env com o comando:

nano .env

Agora insira as informações:

MYSQL_USER=usuario_banco_dados
MYSQL_PASSWORD=senha_banco_dados
MYSQL_DB=nome_banco_dados
DOMAIN=cursos.viniciuspaes.com

No arquivo acima, estamos utilizando um subdomínio “cursos.viniciuspaes.com” como exemplo. Este nome de domínio (subdomínio) será atribuído também ao nome do container do moodle.

Vamos criar agora o arquivo create-moodle.sh com o comando:

nano create-moodle.sh

Agora cole o conteúdo abaixo dentro do arquivo:

Com o arquivo criado, é necessário conceder permissão de descrita:

sudo chmod +x create-moodle.sh

O arquivo create-moodle.sh irá criar todos os arquivos de configuração necessários (exceto .env), ira também verificar qual UID e GID do seu usuário e inserir essa informação no arquivo .env.

Para executar o arquivo, precisa utilizar o comando:

./create-moodle.sh

Ao executar esse comando, os arquivos abaixo serão criados:

  • Dockerfile
  • docker-compose.yml
  • default-ssl.conf
  • 000-default.conf

Passo 4 – Editar arquivo de configuração

Agora precisamos editar o arquivo docker-compose.yml e verificar se as configurações estão corretas.

Neste arquivo, as portas foram mapeadas da seguinte forma:

  • Moodle: porta externa 8000 mapeada para porta interna 80
  • Moodle: porta externa 8443 mapeada para porta interna 443
  • Phpmyadmin: porta externa 8001 mapeada para porta interna 80

Então, com o IP de exemplo sendo 192.168.1.100, os serviços ficarão disponíveis:

http://192.168.1.100:8000
https://192.168.1.100:8443
http://192.168.1.100:8001

O nome do container do moodle irá receber o nome do domínio definido no arquivo .env. Caso queira um nome diferente, basta alterar. Caso não tenha um nome de domínio definido no arquivo .env, será inserido o nome localhost.

Ainda no arquivo docker-compose.yml, é necessário confirmar o caminho para seu certificado SSL, caso tenha um configurado. Você pode solicitar um certificado pelo container do Nginx Proxy Manager ou diretamente pelo letsencrypt, mas é necessário saber onde o certificado ficou salvo. No docker compose de exemplo, temos as 4 linhas:

- /home/vinicius/docker/nginxproxymanager/letsencrypt/live/npm-XX/fullchain.pem:/etc/apache2/ssl-certs/server.crt
- /home/vinicius/docker/nginxproxymanager/letsencrypt/live/npm-XX/privkey.pem:/etc/apache2/ssl-certs/server.key
# - /etc/letsencrypt/live/${DOMAIN}/fullchain.pem:/etc/apache2/ssl-certs/server.crt
# - /etc/letsencrypt/live/${DOMAIN}/privkey.pem:/etc/apache2/ssl-certs/server.key

As 2 primeiras linhas acima, são um exemplo do caminho do certificado gerado pelo Nginx Proxy Manager, revisar qual o caminho da sua instalação e realizar as modificações. Caso utilize um container do letsencrypt ou tenha o certbot instalado sem o docker, o caminho do certificado será algo semelhante as 2 últimas linhas acima. O caractere # no começo da linha serve para transforma ela em um comentário, desabilitando sua funcionalidade. Então caso utilize o padrão do container do letsencrypt, insira o caractere # nas duas primeiras linhas, para desabilitá-las e remova das 2 linhas de baixo. Ou mesmo apague as linhas que não for utilizar.

Passo 5 – Executar o docker compose e criar o container

Com as configurações descritas acima realizadas, precisamos agora executar o arquivo docker-compose.yml. Ao executar o mesmo, o container do Moodle será criado/construído, o que irá levar alguns minutos dependendo da velocidade da sua internet e poder de processamento. O container do mariadb e phpmyadmin estão “prontos” e só será realizado o download e execução. Para iniciar o funcionamento, execute então:

docker compose up -d

Como mencionado, o processo pode demorar alguns minutos (certamente vai demorar pelo menos uns 5 minutos).

Passo 6 – Conferir arquivos criados

Após a execução de todos os passos acima, os seguintes arquivos e diretórios devem estar presentes dentro da pasta:

  • .env
  • 000-default.conf
  • Dockerfile
  • create-moodle.sh
  • db_data – diretório onde os arquivos do banco de dados ficam guardados
  • default-ssl.conf
  • docker-compose.yml
  • logs – diretório onde os logs do apache ficam guardados
  • moodle_data – diretório arquivos do moodle
  • moodledata_data – diretório dos arquivos de cursos criados no moodle

Nesta etapa é interessante conferir se o container conseguiu realizar o download dos arquivos do Moodle e inserir na pasta moodle_data.

Execute o comando para verificar o conteúdo da pasta:

ls moodle_data

Se os arquivos foram copiados com sucesso, irá ter como resultado algo semelhante a:

CONTRIBUTING.md  blocks           course         help.php       my                   report
COPYING.txt      blog             customfield    help_ajax.php  notes                reportbuilder
Gruntfile.js     brokenfile.php   dataformat     index.php      npm-shrinkwrap.json  repository
INSTALL.txt      cache            draftfile.php  install        package.json         rss
README.md        calendar         editmode.php   install.php    payment              search
TRADEMARK.txt    cohort           enrol          iplookup       phpcs.xml.dist       security.txt
UPGRADING.md     comment          error          lang           phpunit.xml.dist     sms
admin            communication    favourites     lib            pix                  tag
ai               competency       file.php       local          plagiarism           theme
analytics        completion       files          login          pluginfile.php       tokenpluginfile.php
auth             composer.json    filter         media          portfolio            user
availability     composer.lock    githash.php    message        privacy              userpix
backup           config-dist.php  grade          mnet           question             version.php
badges           config.php       group          mod            r.php                webservice
behat.yml.dist   contentbank      h5p            moodlenet      rating

ATENÇÃO! Só realize esta etapa caso o diretório moodle_data estiver vazio, então realize o download manualmente:

cd moodle_data
wget https://download.moodle.org/download.php/direct/stable405/moodle-latest-405.tgz
tar -zxvf moodle-latest-405.tgz --strip-components=1
rm -R moodle-latest-405.tgz
cd ..
chmod 0755 moodle_data -R

Passo 7 – Configurar domínio

Caso tenha um domínio registrado, crie as entradas DNS do tipo A e CNAME para seu servidor.

Caso utilize o Nginx Proxy Manager, as informações necessárias são:

Domains Names: cursos.viniciuspaes.com
Scheme: https
Foward Hostname IP: cursos.viniciuspaes.com
Foward Port: 443

Na aba SSL solicite um certificado SSL e adicione o caminho do certificado corretamente no docker-compose.yml, caso ainda não tenha feito (como destacado no fim do passo 4). Como o Nginx Proxy Manager está na mesma rede do container do Moodle, utilizamos em “Foward Port” a porta interna (443) e no “Foward Hostname IP” utilizamos o nome do container (cursos.viniciuspaes.com), que por coincidência é o nome do domínio (subdomínio) utilizado para o website. Se não estiver utilizando o container na mesma rede do Nginx Proxy Manager, a configuração acima fica diferente. Sendo necessário configurar a porta externa (8443) e utilizar o IP do servidor no campo de Foward Hostname IP (192.168.1.100).

Passo 8 – Acessar moodle pela interface web e iniciar a instalação

Neste passo é interessante acessar o servidor pelo nome do domínio, ao invés do IP + porta. Caso tenha algum erro ao acessar pelo nome de domínio, revise os passos anteriores.

Para acessar a instalação do moodle, basta acessar o site pelo nome do domínio, neste exemplo:

https://cursos.viniciuspaes.com

Caso abra corretamente o site do moodle, você será encaminhado por alguns passos para configurar o idioma da instalação e credenciais do banco de dados.

A última etapa antes da instalação é um checklist de todas as dependências necessárias para o funcionamento do moodle. Neste tutorial, o Dockerfile está preparado para fornecer todas as dependências necessárias para a versão 4.05 do Moodle. Caso instale uma versão mais atual, é possível que apareça alguma necessidade nova.

ATENÇÃO! É comum que apareça a necessidade “UNICODE” na instalação, na página de checklist. Essa referência é diante o banco de dados e costuma ser super simples de arrumar. Caso apareça, basta executar os comandos abaixo:

cd ~/docker/moodle
cd moodle_data
nano config.php

Dentro do arquivo config.php, encontre a linha que começa com “‘dbcollation’ =>”, tenha certeza que ela fique da forma:

'dbcollation' => 'utf8mb4_unicode_ci',

Dê um refresh na página de instalação do Moodle e estará pronto para instalar.

Conclusão

A instalação do Moodle LMS não é algo trivial diante as dependências necessárias, porém este tutorial tenta minimizar todos estes esforços com um código em shell script para automatizar várias etapas. É interessante lembrar que há um container oficial do moodlq-hq, com um arquivo docker-compose para a configuração do moodle. Mas sinceramente, não gostei da documentação apresentada, tampouco da stack de containers que utilizam. Este tutorial visa simplificar ao máximo os passos, mantendo uma instalação enxuta e eficiente. Um upgrade interessante para este tutorial, seria habilitar a diretiva HTTP_X_FORWARDED_PROTO e minimizar o link de certificados SSL para dentro do container.

Qualquer dúvida ou sugestão, basta informas nos comentários!