Moodle – Installation du serveur

Page de téléchargement : moodle.org – Latest release

Moodle (Modular Object-Oriented Dynamic Learning Environment) est un LMS (Learning management system) Open Source sous licence GPLv3 permettant de créer et d’administrer des formations et des espaces de collaboration en ligne. Il a été créé en 2001 par Martin Dougiamas en Australie et est développé en PHP. Sa version actuelle est la 3.7. Il s’agit probablement du LMS le plus connu et utilisé à travers le monde.

Alternatives Open Source à Moodle :

CE COURS EST DISPONIBLE EN VIDÉO
(VERSION DÉTAILLÉE ET PLUS COMPLÈTE)

Version Française

Comment installer un LMS Open Source – Part 1
Comment installer un LMS Open Source – Part 2

Version Anglaise

How to install an Open Source LMS – Part 1
How to install an Open Source LMS – Part 2

OBJECTIF

L’objectif de cet article est l’installation et la configuration d’un serveur LAMP7 (Linux Apache 2.4 MariaDB 10.3 PHP 7.3) auto-hébergé Moodle en version 3.7 sur une distribution Linux Debian Buster 10.0 64bits (LAMP 1/4).

SCHEMA LOGIQUE

PRÉREQUIS

1. Prérequis avant réalisation

  • Un serveur Debian Buster 10.0 64 bits fonctionnel (installation basique avec utilitaires usuels du système et service SSH)
  • Packages de base supplémentaires : sudo, dnsutils, git, resolvconf, terminator, tree
  • Domaine utilisé : opensharing.priv

2. Configuration réseau initiale

Serveur Moodle
FQDN mylms.opensharing.priv
Adresse IP 192.168.1.10
Réseau 192.168.1.0/24
Passerelle 192.168.1.1
dns-nameservers8.8.8.8 8.8.4.4
dns-search opensharing.priv

Contenu initial du fichier /etc/network/interfaces :

nano /etc/network/interfaces
auto lo
iface lo inet loopback

allow-hotplug enp0s3
iface enp0s3 inet static
	address 192.168.1.10
	netmask 255.255.255.0
	network 192.168.1.0
	broadcast 192.168.1.255
	gateway 192.168.1.1
	dns-search opensharing.priv
	dns-nameservers 8.8.8.8 8.8.4.4

Contenu initial du fichier /etc/hosts :

nano /etc/hosts
127.0.0.1       localhost.localdomain                   localhost
192.168.1.10    mylms.opensharing.priv                  mylms

Rmq : L’adresse 127.0.1.1 doit être retirée sur un serveur à IP fixe et remplacée par cette dernière, tel que l’exemple ci-dessus.

Contenu initial du fichier /etc/host.conf :

nano /etc/host.conf
order hosts, bind
multi on

Contenu initial du fichier /etc/resolv.conf (généré automatiquement) :

cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 8.8.8.8
nameserver 8.8.4.4
search opensharing.priv

Rmq : Le fichier /etc/resolv.conf ne doit pas être édité dès lors que le paquet resolvconf a été installé.

Pour prendre en compte les modifications des fichiers de configuration relatifs au réseau, redémarrage du service réseau et de l’interface réseau configurée en IP fixe :

systemctl restart networking
ifup enp0s3

Vérification de la bonne configuration réseau :

ping 8.8.8.8
dig opensharing.fr

RÉALISATION

1. Installation de Apache (LAMP 2/4)

apt-get update
apt-get upgrade
apt-get install apache2 apache2-doc

Installe les paquets suivants par dépendances :

apache2apache2-dataapache2-docapache2-utils
ssl-cert

2. Configuration de Apache (LAMP2/4)

Création d’une configuration minimale pour notre LMS

nano /etc/apache2/sites-available/mylms.conf
<VirtualHost *:80>

   DocumentRoot /var/www/mylms/
   ServerName mylms.opensharing.priv

   <Directory /var/www/mylms/>
        Options -Indexes +FollowSymlinks +MultiViews
        AllowOverride None
        Require all granted
   </Directory>

   ErrorLog /var/log/apache2/mylms.error.log
   CustomLog /var/log/apache2/mylms.access.log combined

</VirtualHost>

Désactivation du site par défaut :

a2dissite 000-default

Activation du site hébergeant notre LMS :

a2ensite mylms

3. Sécurisation de notre site en HTTPS (LAMP2/4)

Création d’une clé privée de 2048 bits de type RSA :

openssl genrsa -out /etc/ssl/private/mylmsperso.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
..............................................................................+++++
....................................................................+++++
e is 65537 (0x010001)

Création d’une demande de signature de certificat (CSR, Certificate Signing Request) générée avec la clé privée RSA précédemment créée :

openssl req -new -key /etc/ssl/private/mylmsperso.key -out /etc/ssl/certs/mylmsperso.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Ile-de-France
Locality Name (eg, city) []:Paris
Organization Name (eg, company) [Internet Widgits Pty Ltd]:OpenSharing
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:mylms.opensharing.priv
Email Address []:admin@opensharing.priv

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Auto-signature de la demande de certificat générant un certificat auto-signé (CRT) valable 1 an :

openssl x509 -req -days 365 -in /etc/ssl/certs/mylmsperso.csr -signkey /etc/ssl/private/mylmsperso.key -out /etc/ssl/certs/mylmsperso.crt
Signature ok
subject=C = FR, ST = Ile-de-France, L = Paris, O = OpenSharing, OU = IT, CN = mylms.opensharing.priv, emailAddress = admin@opensharing.priv
Getting Private key

Activation du module SSL :

a2enmod ssl

Modification de la configuration de notre site pour prendre en compte la sécurisation par le protocole HTTPS :

  • Redirection du port 80 (HTTP) vers le port 443 (HTTPS)
  • Directives de sécurisation (moteur SSL/TLS, certificat public, clé privée, etc.)
nano /etc/apache2/sites-available/mylms.conf
<VirtualHost *:80>
   ServerName mylms.opensharing.priv
   Redirect permanent / https://mylms.opensharing.priv/
</VirtualHost>

<VirtualHost *:443>

   DocumentRoot /var/www/mylms/
   ServerName mylms.opensharing.priv

   <Directory /var/www/mylms/>
        Options -Indexes +FollowSymlinks +MultiViews
        AllowOverride None
        Require all granted
   </Directory>

   ErrorLog /var/log/apache2/mylms.error.log
   CustomLog /var/log/apache2/mylms.access.log combined

   SSLEngine On
   SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
   SSLCertificateFile /etc/ssl/certs/mylmsperso.crt
   SSLCertificateKeyFile /etc/ssl/private/mylmsperso.key

</VirtualHost>

Redémarrage du démon Apache :

systemctl restart apache2

4. Installation de MariaDB (LAMP 3/4)

apt-get install mariadb-server mariadb-client

Installe les paquets suivants par dépendances :

galera-3gawklibaio1libcgi-fast-perl
libcgi-pm-perllibconfig-inifiles-perllibdbd-mysql-perllibdbi-perl
libfcgi-perllibhtml-template-perllibreadline5libsigsegv2
libterm-readkey-perlmariadb-clientmariadb-client-10.3mariadb-client-core-10.3
mariadb-servermariadb-server-10.3mariadb-server-core-10.3rsync
socat

Vérifier si les démons mariadb et apache sont actifs au démarrage du systèmes :

systemctl list-unit-files --type=service --state=enabled

Les services apache2.service et {mariadb, mysql, mysqld}.service doivent être dans l’état enabled.
Si ce n’est pas le cas, les activer avec la commande suivante :

systemctl enable name[.service]

5. Configuration de MariaDB (LAMP 3/4)

Par défaut, le plugin unix_socket est actif et permet l’authentification avec les comptes locaux de mêmes noms. En d’autres termes, root-DB utilise root-system pour se connecter aux bases de données.
Si vous souhaitez différencier ces comptes et donc utiliser un mot de passe différent, il vous faudra activer le plugin mysql_native_password, ou encore mieux le plugin ed25519, mais ici nous resterons sur la configuration unix_socket et nous ne définirons pas de mot de passe pour root-DB.

Sécurisation de l’accès aux bases de données.

mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] n
 ... skipping.

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Création d’une base de données et de son administrateur :

mysql -u root
> CREATE DATABASE IF NOT EXISTS mylmsdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
> CREATE USER mylmsadmin@localhost IDENTIFIED BY "mylmsadminpw";
> GRANT ALL PRIVILEGES ON mylmsdb.* TO mylmsadmin@localhost;
> FLUSH PRIVILEGES;
> SHOW DATABASES;
> QUIT;

Redémarrage du démon MariaDB :

systemctl restart mariadb

6. Installation de PHP et ses modules (LAMP 4/4)

⚠ Le module php-mcrypt est obsolète avec PHP 7.3, qui est la version par défaut sous Debian Buster.

apt-get install php php-apcu php-bcmath php-bz2 php-curl php-fpm php-gd php-geoip php-gmp php-imagick php-intl php-ldap php-mbstring php-memcached php-msgpack php-mysql php-pear php-soap php-xml php-xmlrpc php-zip libapache2-mod-php

Installe les paquets suivants par dépendances :

ghostscriptgsfontsimagemagick-6-commonlibapache2-mod-php
libapache2-mod-php7.3libheif1liblqr-1-0libmagickcore-6.q16-6
libmagickwand-6.q16-6libmemcached11libmemcachedutil2libxmlrpc-epi0
libzip4phpphp-apcuphp-apcu-bc
php-bcmathphp-bz2php-commonphp-curl
php-fpmphp-gdphp-geoipphp-gmp
php-igbinaryphp-imagickphp-intlphp-ldap
php-mbstringphp-memcachedphp-msgpackphp-mysql
php-pearphp-soapphp-xmlphp-xmlrpc
php-zipphp7.3php7.3-bcmathphp7.3-bz2
php7.3-cliphp7.3-commonphp7.3-curlphp7.3-fpm
php7.3-gdphp7.3-gmpphp7.3-intlphp7.3-json
php7.3-ldapphp7.3-mbstringphp7.3-mysqlphp7.3-opcache
php7.3-readlinephp7.3-soapphp7.3-xmlphp7.3-xmlrpc
php7.3-zipttf-dejavu-core

7. Configuration de PHP (LAMP 4/4)

Configuration de OPcache pour l’optimisation des performances par la mise en cache des scripts PHP compilés :

nano /etc/php/7.3/mods-available/opcache.ini
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=16229
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1

Configuration de PHP spécifique à Moodle :

nano -c /etc/php/7.3/apache2/php.ini
ligne  406
ligne  836
ligne  960
ligne 1794
memory_limit = 96M
file_uploads = On
date.timezone = 'Europe/Paris'
opcache.enable = 1

8. Installation de Moodle (phase ligne de commandes)

Téléchargement et extraction de l’archive Moodle :

wget https://download.moodle.org/download.php/direct/stable37/moodle-latest-37.tgz
tar zxvf moodle-latest-37.tgz
mv moodle/ /var/www/mylms/
rm moodle-latest-37.tgz

Création d’un répertoire pour héberger les données de Moodle, se situant hors site Web. Ce répertoire sera placé dans le répertoire personnel d’un utilisateur (moodle) que nous créons pour l’occasion.
Toutefois, les données appartiendront à l’utilisateur www-data :

adduser --system moodle
mkdir /home/moodle/moodledata
chown -R www-data:www-data /home/moodle/moodledata/
chmod 0777 /home/moodle/moodledata/

Création d’un fichier de configuration pour la connexion entre le site Web et la base de données mylmsdb :

nano /var/www/mylms/config.php
<?php  // Moodle configuration file

unset($CFG);
global $CFG;
$CFG = new stdClass();

$CFG->dbtype    = 'mariadb';
$CFG->dblibrary = 'native';
$CFG->dbhost    = 'localhost';
$CFG->dbname    = 'mylmsdb';
$CFG->dbuser    = 'mylmsadmin';
$CFG->dbpass    = 'mylmsadminpw';
$CFG->prefix    = 'mdl_';
$CFG->dboptions = array (
  'dbpersist' => 0,
  'dbport' => '',
  'dbsocket' => '',
  'dbcollation' => 'utf8mb4_unicode_ci',
);

$CFG->wwwroot   = 'https://mylms.opensharing.priv';
$CFG->dataroot  = '/home/moodle/moodledata';
$CFG->admin     = 'admin';

$CFG->directorypermissions = 0777;

require_once(__DIR__ . '/lib/setup.php');

// There is no php closing tag in this file,
// it is intentional because it prevents trailing whitespace problems!

Modification du fichier de configuration globale de MariaDB :

nano /etc/mysql/my.cnf
[client]
default-character-set = utf8mb4

[mysqld]
innodb_file_format = Barracuda
innodb_file_per_table = ON
innodb_large_prefix = ON

character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

[mysql]
default-character-set = utf8mb4

Modification des permissions sur le site :

chown -R root:www-data /var/www/mylms/
chmod -R 0755 /var/www/mylms/

Redémarrage des services Apache et MariaDB :

systemctl restart mariadb
systemctl restart apache2

9. Installation de Moodle (phase web)

Pour l’installation par le navigateur, il faut se connecter à l’URL suivante :

https://mylms.opensharing.priv/install.php

Accepter l’exception de sécurité liée au certificat auto-signé de notre serveur Apache.

L’installation par le Web se lance et on commence par accepter le contrat de licence :

On vérifie ensuite que les prérequis PHP sont remplis :

On vérifie que tous les modules de Moodle ont été correctement installés (et il y en a énormément) :


On crée ensuite un administrateur pour la plateforme en prenant soin de respecter les règles de sécurité minimales requises pour le mot de passe défini :

On donne ensuite un nom à notre portail :

Notre site est maintenant installé et prêt à l’emploi :

POUR ALLER PLUS LOIN

1. Effectuer une sauvegarde manuelle complète

mkdir -p /home/sysadmin/backup/3.7/
cd /home/sysadmin/backup/3.7/
tar -czvf backup-moodle-20190709.tar.gz -C /var/www/ mylms/
mysqldump --user=mylmsadmin --password=mylmsadminpw --databases mylmsdb > moodle-20190709.sql

2. Effectuer une restauration manuelle complète

cd /home/sysadmin/backup/3.7/
tar -xzvf backup-moodle-20190709.tar.gz -C /var/www/
mysql --user=mylmsadmin --password=mylmsadminpw mylmsdb < moodle-20190709.sql
Fermer le menu