Fully automated, high-availability multi-server blueprint: Load Balancers, redundant web server nodes, shared database replication pools, Redis caching, and Amazon S3 backups integration.
sudo apt update && sudo apt upgrade -y
sudo apt install apache2 mariadb-server mariadb-client -y
sudo apt install php8.1 php8.1-cli php8.1-common php8.1-mysql php8.1-xml php8.1-curl php8.1-gd php8.1-intl php8.1-mbstring php8.1-zip php8.1-soap php8.1-bcmath libapache2-mod-php8.1 -y
sudo apt install git nano cron sendmail certbot python3-certbot-apache -y
sudo a2enmod rewrite ssl
sudo systemctl restart apache2
CREATE DATABASE moodle_demo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'moodleDemo2026'@'localhost' IDENTIFIED BY '2026PassDemo!!';
GRANT ALL PRIVILEGES ON moodle_demo.* TO 'moodleDemo2026'@'localhost';
FLUSH PRIVILEGES;
EXIT;
sudo nano /etc/php/8.1/apache2/php.ini
# Set values:
upload_max_filesize = 1080M
post_max_size = 1080M
max_execution_time = 3600
memory_limit = 512M
max_input_vars = 5000
max_input_time = 300
sudo systemctl restart apache2
cd /var/www
sudo git clone -b MOODLE_500_STABLE git://git.moodle.org/moodle.git moodl_ulo2026Demo
sudo chown -R www-data:www-data /var/www/moodl_ulo2026Demo
sudo chmod -R 755 /var/www/moodl_ulo2026Demo
sudo fdisk /dev/sdb # n, p, enter, w
sudo mkfs.ext4 /dev/sdb1
sudo mkdir -p /var/moodledata
sudo mount /dev/sdb1 /var/moodledata
# get UUID: sudo blkid /dev/sdb1
echo "UUID=YOUR-UUID /var/moodledata ext4 defaults,noatime 0 2" | sudo tee -a /etc/fstab
sudo chown -R www-data:www-data /var/moodledata
sudo chmod -R 770 /var/moodledata
cd /var/www/moodl_ulo2026Demo
sudo cp config-dist.php config.php
sudo nano config.php
# Insert config:
$CFG->dbtype = 'mariadb';
$CFG->dbhost = 'localhost';
$CFG->dbname = 'moodle_demo';
$CFG->dbuser = 'moodleDemo2026';
$CFG->dbpass = '2026PassDemo!!';
$CFG->prefix = 'mdl_';
$CFG->wwwroot = 'https://classroom.demodemo.com';
$CFG->dataroot = '/var/moodledata';
$CFG->directorypermissions = 02775;
$CFG->disablelogintoken = true;
sudo nano /etc/apache2/sites-available/moodle.conf
# Paste vhost config
sudo a2ensite moodle.conf
sudo systemctl reload apache2
sudo certbot --apache -d classroom.demodemo.com
sudo certbot renew --dry-run
sudo crontab -u www-data -e
# Insert line:
* * * * * /usr/bin/php /var/www/moodl_ulo2026Demo/admin/cli/cron.php > /dev/null
sudo systemctl enable cron
sudo -u www-data php /var/www/moodl_ulo2026Demo/admin/cli/cron.php
sudo chown -R www-data:www-data /var/moodledata /var/www/moodl_ulo2026Demo
sudo systemctl restart apache2 mariadb
# Test database
php /var/www/moodl_ulo2026Demo/admin/cli/check_database_schema.php
$CFG->dbname='moodle_demo';
$CFG->dbuser='moodleDemo2026';
$CFG->dbpass='2026PassDemo!!';
$CFG->wwwroot='https://classroom.demodemo.com';
$CFG->dataroot='/var/moodledata';
<VirtualHost *:443>
ServerName classroom.demodemo.com
DocumentRoot /var/www/moodl_ulo2026Demo
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/classroom.demodemo.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/classroom.demodemo.com/privkey.pem
</VirtualHost>
innodb_buffer_pool_size=2GOPcache Memory:
opcache.enable=1; opcache.memory_consumption=256
sudo -u www-data php admin/cli/reset_password.php
rm -rf /var/moodledata/cache/*