Ubuntu 16.04: Install Moodle

This article will describe installing Moodle which is a e-Learning platform.

1 Install Moodle

  • This article uses default SSL/TLS certicication file for https. Please change your SSL/TLS certification file.
  • If you use http instead of https, change 443 to 80 and delete SSLXXX directive in /etc/apache2/sites-available/moodle.conf.
  • Set your environment FQDN to MOODLE_FQDN.
  • MOODLE_PASSWD is password of moodle user in MySQL.
#!/bin/sh

set -e

MYSQL_VERSION=5.7
[ -z "${MYSQL_PASSWD}" ] && \
  MYSQL_PASSWD=mysql
[ -z "${MOODLE_FQDN}" ] && \
  MOODLE_FQDN=ubuntu-1604-moodle.hiroom2.com
[ -z "${MOODLE_PASSWD}" ] && \
  MOODLE_PASSWD=moodle

mysql_install()
{
  cat <<EOF | sudo debconf-set-selections
mysql-server-${MYSQL_VERSION} mysql-server/root_password password ${MYSQL_PASSWD}
mysql-server-${MYSQL_VERSION} mysql-server/root_password_again password ${MYSQL_PASSWD}
EOF
  sudo apt install -y mysql-server

  cat<<EOF | sudo mysql -uroot -p${MYSQL_PASSWD}
CREATE DATABASE moodle DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON moodle.* TO moodle@localhost
  IDENTIFIED BY '${MOODLE_PASSWD}';
exit
EOF
}

moodle_install()
{
  # The moodle needs the following php extensions.
  # curl iconv mbstring openssl tokenizer xmlrpc soap ctype zip zlib
  # gd simplexml spl pcre dom xml xmlreader intl json hash fileinfo.
  #
  # libapache2-mod-php has php-mbstring and php-xml.
  sudo apt install -y php php-mysql php-curl php-xmlrpc php-soap \
       php-gd php-intl php-json php-xml php-zip php-mbstring
  sudo apt install -y git

  sudo mkdir -p /var/lib/moodle

  cd /usr/share
  sudo git clone https://github.com/moodle/moodle
  cd moodle
  sudo git checkout v3.3.0 -b v3.3.0

  cat <<EOF | sudo tee config.php
<?php
unset(\$CFG);
global \$CFG;
\$CFG = new stdClass();

\$CFG->dbtype = 'mysql';
\$CFG->dbhost = 'localhost';
\$CFG->dbname = 'moodle';
\$CFG->dbuser = 'moodle';
\$CFG->dbpass = '${MOODLE_PASSWD}';
\$CFG->prefix = 'mdl_';

\$CFG->wwwroot = 'https://${MOODLE_FQDN}/moodle';
\$CFG->dirroot = '/usr/share/moodle';
\$CFG->dataroot = '/var/lib/moodle';
\$CFG->directorypermissions = 0750;
\$CFG->admin = 'admin';

\$CFG->pathtodu = '/usr/bin/du';
\$CFG->unzip = '/usr/bin/unzip';
\$CFG->zip = '/usr/bin/zip';

\$CFG->respectsessionsettings = true;
\$CFG->disableupdatenotifications = true;
\$CFG->enablehtmlpurifier = true;

if (file_exists("\$CFG->dirroot/lib/setup.php"))  {
  include_once("\$CFG->dirroot/lib/setup.php");
} else {
  if (\$CFG->dirroot == dirname(__FILE__)) {
    echo "<p>Could not find this file: \$CFG->dirroot/lib/setup.php</p>";
    echo "<p>Are you sure all your files have been uploaded?</p>";
  } else {
    echo "<p>Error detected in config.php</p>";
    echo "<p>Error in: \\\$CFG->dirroot = '\$CFG->dirroot';</p>";
    echo "<p>Try this: \\\$CFG->dirroot = '".dirname(__FILE__)."';</p>";
  }
  die;
}
EOF
}

apache_install()
{
  sudo apt install -y apache2 libapache2-mod-php

  sudo chown -R www-data:root /var/lib/moodle

  cat <<EOF | sudo tee /etc/apache2/sites-available/moodle.conf
<VirtualHost _default_:443>
  SSLEngine on
  SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
  SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

  Alias /moodle /usr/share/moodle

  <Directory /usr/share/moodle>
    Options FollowSymLinks MultiViews
    AllowOverride None
    Require all granted

    php_flag magic_quotes_gpc Off
    php_flag magic_quotes_runtime Off
    php_flag file_uploads On
    php_flag session.auto_start Off
    php_flag session.bug_compat_warn Off
    php_value upload_max_filesize 2M
    php_value post_max_size 2M
  </Directory>
</VirtualHost>
EOF

  sudo a2enmod ssl
  sudo a2enmod php7.0
  sudo a2ensite moodle
  sudo systemctl enable apache2
  sudo systemctl restart apache2
}

moodle_main()
{
  mysql_install
  moodle_install
  apache_install
}

moodle_main

2 Access to Moodle

Access to the following URL and setup Moodle.

https://<server>/moodle