Ubuntu 22.04 Tutorials

How to Install Moodle on a Ubuntu 24.04 VPS with a Scripted Guide

If you’re looking to set up a Moodle environment on a Ubuntu 24.04 VPS, this guide will walk you through the process using an automated script. Moodle is an open-source learning management system that is robust, scalable, and suitable for educational and training purposes. However, installing Moodle manually can be time-consuming, especially for those unfamiliar with Linux system administration.

To simplify the process, we’ve created a script that automates the entire installation and configuration of Moodle. This script is designed to save you time and ensure that all the necessary steps are completed correctly.


Why Use a Script?

  1. Efficiency: The script automates repetitive tasks like installing packages, setting permissions, and configuring the database.
  2. Accuracy: Reduces the risk of errors during manual setup.
  3. Scalability: Ideal for deploying Moodle across multiple servers.
  4. Customization: The script allows for easy configuration of variables like domain names and passwords.

Pre-Requisites

Before running the script, ensure you meet the following requirements:

  • A Ubuntu 24.04 VPS server with root or sudo access.
  • Basic understanding of Linux commands.
  • A domain name or a static IP address (optional but recommended for HTTPS).

The Script

Below is the complete script for automating Moodle installation on Ubuntu. Save it as moodle_install.sh and run it as root or with sudo.

#!/bin/bash

set -e

# Variables
PROTOCOL="http://"
read -p "Enter the web address (e.g., mymoodle123.com or 192.168.1.1): " WEBSITE_ADDRESS

# Step 1: Update system and install prerequisites
echo "Updating system and installing prerequisites..."
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install -y apache2 php libapache2-mod-php php-mysql graphviz aspell git clamav php-pspell php-curl php-gd php-intl ghostscript php-xml php-xmlrpc php-ldap php-zip php-soap php-mbstring unzip mariadb-server mariadb-client certbot python3-certbot-apache ufw nano clamav clamav-daemon

# Step 2: Set up the LAMP stack
echo "Setting up the LAMP stack..."
sudo systemctl enable apache2
sudo systemctl enable mariadb

# Step 3: Download Moodle code
echo "Downloading Moodle code..."
cd /var/www/html
sudo git clone https://github.com/moodle/moodle.git .
sudo git checkout origin/MOODLE_405_STABLE
sudo git config pull.ff only

# Step 4: Moodle-specific requirements
echo "Configuring Moodle directories and permissions..."
sudo mkdir -p /var/www/moodledata
sudo chown -R www-data:www-data /var/www/moodledata
sudo find /var/www/moodledata -type d -exec chmod 700 {} \;
sudo find /var/www/moodledata -type f -exec chmod 600 {} \;
sudo chmod -R 777 /var/www/html
sudo sed -i 's/.*max_input_vars =.*/max_input_vars = 5000/' /etc/php/8.3/apache2/php.ini
sudo sed -i 's/.*max_input_vars =.*/max_input_vars = 5000/' /etc/php/8.3/cli/php.ini
echo "* * * * * www-data /usr/bin/php /var/www/html/admin/cli/cron.php >/dev/null 2>&1" | sudo tee -a /etc/crontab

# Step 5: Configure HTTPS
echo "Configuring HTTPS..."
sudo sed -i "/ServerName/c\    ServerName $WEBSITE_ADDRESS" /etc/apache2/sites-available/000-default.conf
sudo sed -i "/ServerAlias/c\    ServerAlias www.$WEBSITE_ADDRESS" /etc/apache2/sites-available/000-default.conf
sudo certbot --apache
sudo systemctl reload apache2
PROTOCOL="https://"

# Step 6: Create Moodle database and user
echo "Creating Moodle database and user..."
MYSQL_MOODLEUSER_PASSWORD=$(openssl rand -base64 12)
sudo mysql -e "CREATE DATABASE moodle DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
sudo mysql -e "CREATE USER 'moodleuser'@'localhost' IDENTIFIED BY '$MYSQL_MOODLEUSER_PASSWORD';"
sudo mysql -e "GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, CREATE TEMPORARY TABLES, DROP, INDEX, ALTER ON moodle.* TO 'moodleuser'@'localhost';"
echo "Moodle database created. Password: $MYSQL_MOODLEUSER_PASSWORD"

# Step 7: Command-line Moodle installation
echo "Installing Moodle via CLI..."
MOODLE_ADMIN_PASSWORD=$(openssl rand -base64 12)
sudo -u www-data /usr/bin/php /var/www/html/admin/cli/install.php \
  --non-interactive --lang=en --wwwroot="$PROTOCOL$WEBSITE_ADDRESS" \
  --dataroot=/var/www/moodledata --dbtype=mariadb --dbhost=localhost \
  --dbname=moodle --dbuser=moodleuser --dbpass="$MYSQL_MOODLEUSER_PASSWORD" \
  --fullname="Moodle Site" --shortname="Moodle" \
  --adminuser=admin --summary="" --adminpass="$MOODLE_ADMIN_PASSWORD" \
  --adminemail=admin@$WEBSITE_ADDRESS --agree-license

echo "Moodle installation completed."
echo "Admin credentials: Username: admin, Password: $MOODLE_ADMIN_PASSWORD"

# Step 8: Set up MySQL backups
echo "Setting up MySQL backups..."
BACKUP_USER_PASSWORD=$(openssl rand -base64 12)
sudo mysql -e "CREATE USER 'backupuser'@'localhost' IDENTIFIED BY '${BACKUP_USER_PASSWORD}';"
sudo mysql -e "GRANT LOCK TABLES, SELECT ON moodle.* TO 'backupuser'@'localhost'; FLUSH PRIVILEGES;"
cat <<EOF | sudo tee /root/.my.cnf

user=backupuser
password=${BACKUP_USER_PASSWORD}
EOF
sudo chmod 600 /root/.my.cnf
sudo mkdir -p /var/backups/moodle && sudo chmod 700 /var/backups/moodle && sudo chown root:root /var/backups/moodle
(crontab -l 2>/dev/null; echo "0 2 * * * mysqldump --defaults-file=/root/.my.cnf moodle > /var/backups/moodle/moodle_backup_\$(date +\%F).sql") | crontab -
(crontab -l 2>/dev/null; echo "0 3 * * * find /var/backups/moodle -name \"moodle_backup_*.sql\" -type f -mtime +7 -delete") | crontab -

# Step 9: Security configuration
echo "Applying security configurations..."
sudo find /var/www/html -type d -exec chmod 755 {} \;
sudo find /var/www/html -type f -exec chmod 644 {} \;
sudo mariadb-secure-installation
sudo ufw allow 22/tcp
sudo ufw allow 'Apache Full'
sudo ufw --force enable
sudo ufw default deny incoming
sudo ufw default allow outgoing

echo "Installation and security configuration complete."
echo "Visit your Moodle site at $PROTOCOL$WEBSITE_ADDRESS."

How to Use the Script

  1. Save the Script: Copy the script into a file named moodle_install.sh.
  2. Make it Executable: Run the command chmod +x moodle_install.sh.
  3. Run the Script: Execute the script using sudo ./moodle_install.sh.
  4. Follow Prompts: Provide the required inputs, such as your web address.

What the Script Does

  • Installs and configures the LAMP stack (Linux, Apache, MySQL, PHP).
  • Downloads and sets up Moodle using Git.
  • Creates necessary directories with secure permissions.
  • Configures HTTPS using Certbot for SSL certificates.
  • Automates Moodle’s CLI-based installation.
  • Sets up MySQL database backups and security configurations.

Conclusion

This script automates the complex process of installing Moodle on a Ubuntu VPS, saving time and reducing errors. After running the script, you’ll have a fully functional Moodle instance ready for use. Customize the script further if you have specific needs, such as additional plugins or modules. Happy teaching!


Discover more from Patrick Domingues

Subscribe to get the latest posts sent to your email.

author avatar
Patrick Domingues

Leave a Comment

Stay Informed

Receive instant notifications when new content is released.