Use this when migrating a live Moodle LMS from shared hosting to VPS.
Related deep-dive: The Real-World Moodle Migration Playbook.
Prerequisites
- Full backup access on source server
- Target VPS (Ubuntu + PHP 8.2 + MariaDB)
- Maintenance/cutover window
Step-by-Step
Step 1: Export source database
mysqldump -u USER -p DBNAME > moodle.sql
Step 2: Import into target database
mysql -u USER -p DBNAME < moodle.sql
Step 3: Sync moodledata and permissions
rsync -avz /old/moodledata/ /new/moodledata/
chown -R www-data:www-data /new/moodledata
chmod -R 755 /new/moodledata
Step 4: Update config.php
$CFG->wwwroot = 'https://yourdomain.com';
$CFG->dataroot = '/home/user/moodledata';
$CFG->dbname = 'dbname';
$CFG->dbuser = 'dbuser';
$CFG->dbpass = 'dbpass';
Step 5: Install required PHP extensions
apt install -y php8.2-xml php8.2-mysql php8.2-gd php8.2-curl \
php8.2-zip php8.2-mbstring php8.2-intl php8.2-soap
systemctl restart php8.2-fpm
Step 6: Run Moodle CLI maintenance
php admin/cli/upgrade.php
php admin/cli/purge_caches.php
php admin/cli/cron.php
Step 7: Cutover sync and DNS switch
mysqldump -u USER -p live_db > final.sql
mysql -u USER -p new_db < final.sql
rsync -avz /old/moodledata/ /new/moodledata/
Switch DNS only after login, courses, upload, and cron are verified.
Fast Troubleshooting
- HTTP 500: re-check
config.php, PHP extensions, and permissions. - Missing courses/media: re-sync
moodledata, then purge caches. - Theme issues: deploy theme code, rerun upgrade + purge.
For migration implementation support, see Custom Web Development or Contact ValeoFX.