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!