Initial backup snapshot
https://allinonelms.com/blog/moodle-5-3
says we have one year time before moving from 4.5 to 5.3, so we can wait for Dec, Moodle 5.3.1, if plugins break. But we went ahead, and plugins broke.
Our Ubuntu install also needed to be upgraded from 24.04 to 26.04, since MySQL 8.4 is required by Moodle 5.3.
The idea is to use sudo do-release-upgrade
(if no upgrade is available, it will tell us)
after taking a backup snapshot.
Duck.ai gave the detailed steps for
- create a snapshot of the original OS disk,
- generate a new managed disk from that snapshot,
- then deploy a new virtual machine using the new managed disk.
I did only 1. and 2., did not need to do 3. It just took a few seconds to create snapshot and generate a new managed disk from the snapshot, for our 45 GB OS disk. Just to be safe, I stopped the services, then stopped the VM, then took the snapshot.
sudo service apache2 stop
sudo service postgresql stop
sudo service mysql stop
Gemini, on prompting, listed the disadvantages of upgrading vs creating a new VM from scratch, like the need to choose old vs new config files, the need to have downtime, etc. (private link to conversation is here for my reference, https://aistudio.google.com/prompts/1X_RhD-CQTQS1DdVHShfBhK67VxMp6uYk )
Since the CMS PHP code would also be migrated to PHP 8.5 with this upgrade, tested for breaks using Antigravity - just fed in the code, and asked for what to patch. Only the deprecated FILTER_SANITIZE_STRING in login-action.php and a suggested composer update for dependencies
sudo -u www-data composer update --no-dev --optimize-autoloader
(If done with sudo, would need
sudo chown -R www-data:www-data /var/www/html/vendor
sudo chown www-data:www-data /var/www/html/composer.lock
)
To have a temporary 'Site under Maintenance' message, a cloudflare redirect to a page hosted on github pages, Rules > Overview > Redirect rules - struggled a bit to find the location of the redirect rules page, private link to conversation is at https://aistudio.google.com/prompts/1iFwSbjXsmI1TsYEIIlQcxvDM0VfolK2I
Errors during the do-release-upgrade
While doing the do-release-upgrade after saving the snapshot, these were the problems observed.
rclone warning - not from ubuntu repos.
will need to reinstall, maybe.
login.defs - chose to upgrade
Postgres said,
Success. Please check that the upgraded cluster works. If it does,
you can remove the old cluster with
pg_dropcluster 16 main
certbot not upgraded, dependency problems.
Package apache2 is not configured yet. Will defer actions by package libapache2-mod-php8.5.
Processing triggers for dbus (1.16.2-2ubuntu4) ...
Errors were encountered while processing:
apache2
python3-certbot-apache
needrestart is being skipped since dpkg has failed
packages have been installed but needrestart is suspended
etc.
dpkg: error processing package python3-certbot-apache (--configure):
dependency problems - leaving unconfigured
Errors were encountered while processing:
apache2
python3-certbot-apache
Upgrade complete
The upgrade has completed but there were errors during the upgrade
process.
To continue please press [ENTER]
=== Command detached from window (Sun Oct 11 04:49:30 2026) ===
Gemini, in this conversation, https://aistudio.google.com/prompts/1ySB2bg3r8w23ODeVyiyw-hyOXi-u8gmI said that we can safely reboot, the issue is with apache (and since apache is required for certbot, that fails too). Apache would be loading the old PHP versions, we have to disable PHP 8.3 and enable PHP 8.5. But
sudo a2dismod php8.3
ERROR: /etc/apache2/mods-enabled/php8.3.load is not a symbolic link, not deleting
ERROR: /etc/apache2/mods-enabled/php8.3.conf is not a symbolic link, not deleting
Module php8.3 disabled.
So somewhere the mods-enabled got turned into real files. Had to find all real files (and not links) with
sudo find /etc/apache2/*-enabled/ -type f
and delete all of them.
sudo bash -c '
# Fix conf-enabled
for file in /etc/apache2/conf-enabled/*; do
if [ -f "$file" ] && [ ! -L "$file" ]; then
name=$(basename "$file")
if [ -f "/etc/apache2/conf-available/$name" ]; then
rm -f "$file"
else
mv "$file" "/etc/apache2/conf-available/$name"
fi
ln -s "../conf-available/$name" "$file"
fi
done
# Fix mods-enabled
for file in /etc/apache2/mods-enabled/*; do
if [ -f "$file" ] && [ ! -L "$file" ]; then
name=$(basename "$file")
if [ -f "/etc/apache2/mods-available/$name" ]; then
rm -f "$file"
else
mv "$file" "/etc/apache2/mods-available/$name"
fi
ln -s "../mods-available/$name" "$file"
fi
done
'
Now
sudo apache2ctl configtest
was OK, and restarting apache followed by dpkg
sudo systemctl restart apache2
sudo dpkg --configure -a
fixed certbot also. Then, since postgres 18 was running fine,
sudo pg_dropcluster 16 main
sudo apt purge "postgresql-16*"
sudo apt autoremove
Clear browser host cache for testing, git upgrade
Flush DNS and test - Edge browser on Linux, method suggested by ChatGPT
https://chatgpt.com/c/6acb1b41-4d04-83e8-a31f-f6958c4a2bbb
has many more testing and dns tips.
and choose Flush socket pools.
Then the actual Moodle upgrade using git,
https://chatgpt.com/c/6acb1c57-0e94-83e8-aa2a-31ae3e8f9ef0
git branch -r
to list the remote branches, and then, following
or
git branch --track MOODLE_503_STABLE origin/MOODLE_503_STABLE
git checkout MOODLE_503_STABLE
sudo chown -R azureuser:www-data .
sudo chmod -R 775 .
sudo -u www-data /usr/bin/php admin/cli/upgrade.php
At this point, after the upgrade completed, we needed to install all the PHP modules needed by Moodle 5.3.
Post-install fixes
Took the help of chatgpt to
generate the commands needed to install all the required PHP modules,
sudo apt update
sudo apt install \
php8.5-cli \
php8.5-common \
php8.5-curl \
php8.5-gd \
php8.5-intl \
php8.5-mbstring \
php8.5-mysql \
php8.5-xml \
php8.5-zip
/usr/bin/php --ini # to find the ini file path
Loaded Configuration File: /etc/php/8.5/cli/php.ini
Edit both the cli as well as the apache php.ini files to bump
max_input_vars = 5000
upload_max_filesize = 100M
post_max_size = 110M
memory_limit = 256M
max_execution_time = 300
max_input_time = 300
Needed to change the sites' document root in the sites-available of apache to append /public to the existing DocumentRoot value. Copied the "missing from disk" plugins to the public directory by asking chatgpt to write the commands as below,
cd /var/www/theMoodlegit
for plugin in \
mod/quiz/accessrule/proctoring \
admin/tool/tcpdffonts \
availability/condition/othercompleted \
availability/condition/stash \
course/format/onetopic \
course/format/remuiformat \
course/format/tiles
do
destination="public/$plugin"
if [ -d "$plugin" ] && [ ! -e "$destination" ]; then
sudo mv "$plugin" "$destination"
echo "Moved $plugin"
else
echo "SKIPPED $plugin — check source and destination"
fi
done
Had to install composer and run it, since Moodle 5.1 onwards use composer for dependencies. Without doing this, some plugins were complaining of Mustache errors, file not found etc. https://claude.ai/chat/427274e2-d874-4b60-b744-2989d51b6b72
sudo apt install composer
cd /var/www/theMoodlegit
composer install --no-dev --classmap-authoritative # (for each instance.)
Router not configured message still shows up, we need to follow
the guide to set it up, would be mandatory for future versions of Moodle.
Lots of warnings like
PHP Deprecated: Function xml_parser_free() is deprecated since 8.5, as it has no effect since PHP 8.0 in /var/www/theMoodlegit/public/lib/classes/xml_parser.php on line 190
ChatGPT recommends ignoring it till the Moodle team removes it, since Moodle 5.3 officially does not support PHP 8.5.
The installation and fixes so far took from 9 am to 2 pm with an hour's lunch break. The next day, the following were also fixed.
Theme edits and unsupported plugins
Fix for duplicate logo appearing, by adding these lines to the Raw SCSS of Moove theme,
/* Dark mode is disabled, so hide the duplicate dark logo */
nav.navbar .navbar-brand img.logo.dark { display: none !important; }
Site Administration > Appearance > Themes > (gear icon of Moove theme) > Advanced tab > Raw SCSS textbox
(This duplication was a side-effect of us removing the Connectime branding logo advertisement of the Moove theme in SCSS.)
Later, users found problems with courses using formattype onetopic (which has not been updated to support Moodle 5.3) - https://claude.ai/chat/5c5a6dd0-e0b9-4bfb-a41f-4b8062fabef6 - changed to topics instead in the database to fix,
UPDATE mdl_course SET format = 'topics' WHERE format = 'onetopic';
(after first trying it for a single course and testing.)
Similar fix for some other courses which were using formattype tiles - in that case, only the edit mode was affected, so the teacher admins could themselves change the course formattype to Multitopic (which is topics in the db) in the Course Settings in the UI.