Run Moodle itself on shared hosting, and use Render’s free tier only for stateless pieces such as a test frontend or a small API. Render’s free web services lose their filesystem on every restart, redeploy, or spin-down, and its free Postgres expires after 30 days, so neither can safely hold course uploads or a live LMS database. This guide explains how to split the stack, what each side requires, and where the free route breaks down.
Decide what runs where before you touch a server
“Full-stack LMS on shared hosting plus Render” can mean several different architectures, and they carry very different risks. Standard Moodle is a PHP application with its own database and a data directory for uploads. It is installed as one unit, not automatically split between two hosts. Splitting it means you have chosen a custom architecture, and you are responsible for the glue between the two halves.
As an Amazon Associate I earn from qualifying purchases.
The table below maps each component to a host and states whether it needs durable storage. Durability is the deciding factor.
| Component | Suitable host in this setup | Needs durable storage? | Notes |
|---|---|---|---|
| Moodle application code (PHP) | Shared hosting, following MoodleDocs’ cPanel installation guide | Yes, the files must persist | This is the documented path for Moodle 5.1 on cPanel. |
Moodle data directory (moodledata) |
Shared hosting, outside the public web root | Yes, uploads and session data | Render free web services cannot hold it. Back it up with your host’s tools. |
| Moodle database | Shared hosting: MySQL 8.4, MariaDB 10.11.0, or PostgreSQL 13 minimum for Moodle 5.1 | Yes | Not stated as available on Render’s free Postgres for production use. |
| Custom frontend (static build) | Render Static Site | No server state | Render documents Static Sites for content made entirely of static assets. |
| Custom backend or API | Render Web Service | Only stateless logic | Keep no uploads or user data on its local disk. |
If your project’s frontend or API is written in a language other than PHP, the Render side is your own application. The shared-hosting side remains Moodle. Keep that boundary in mind for every step below.
Requirements for the shared-hosting route
The instructions below apply to Moodle 5.1. Check the release you intend to install against the official Moodle requirements before you begin, because minimum versions change between releases.
- PHP 8.2 or newer, with the extensions the guide lists: sodium, curl, openssl, mbstring, xml, intl, json, and fileinfo.
- PHP settings:
memory_limitof at least 128M,max_input_varsof 5000 or higher, and file uploads enabled. - Database: MySQL 8.4, MariaDB 10.11.0, or PostgreSQL 13 minimum, as stated in the Moodle 5.1 guide.
- Hosting tools: a plan that includes SSL, plus access to PHP Selector, phpMyAdmin, a database wizard or manager, Terminal, and File Manager.
- Directory layout: a
moodledatadirectory outside the public web root. The guide creates~/moodledataand links the Moodle public directory intopublic_html. - Host answers: written answers on CPU and memory limits, whether scheduled tasks (cron) can run, how backups and restores work, and what student load the plan is meant for.
MoodleDocs describes shared hosting as a moderate-cost option for providing access to a small number of students on a self-managed Moodle site. The same passage warns that performance problems and student-number restrictions may appear. The guide does not give a numeric enrollment ceiling, so treat your own load test as the only reliable measure.
Rank #2
Install Moodle 5.1 on cPanel
Follow MoodleDocs’ cPanel Shared Hosting Installation guide in its own order. The steps below summarise the sequence and the cPanel location for each task.
Windows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallCrashes, No Sound, or Screen Glitches?
Random freezes, missing sound and display glitches usually trace back to one bad driver. Find and replace yours safely.Free scan · under a minute- Select the PHP version. Open PHP Selector in cPanel, choose PHP 8.2 or newer, and enable the extensions listed above. Confirm the version on the PHP Selector page before continuing.
- Adjust PHP limits. Set
memory_limitto at least 128M andmax_input_varsto 5000 or higher. If your host manages these through a separate PHP configuration screen, use that screen instead. - Create the database and user. Use the database wizard or MySQL Databases screen to create a database, a user, and a password, then grant the user all privileges on that database. Use phpMyAdmin to confirm the connection works.
- Place the code and data directory. Use File Manager or Terminal to download Moodle 5.1 and create
~/moodledataoutsidepublic_html. Set the directory permissions that the installer asks for. - Link the public directory. Follow the guide to link Moodle’s public directory into
public_html, so the site is served while the data directory stays out of reach of the web. - Run the web installer. Open your domain in a browser over HTTPS, complete the installer, and enter the database details from step 3 and the data directory path from step 4.
- Schedule cron. In cPanel, open Cron Jobs and point a job at Moodle’s
admin/cli/cron.phpusing the PHP binary path your host provides. Moodle’s own cron documentation describes the expected frequency. If your host does not allow cron jobs, do not go live until you have an alternative.
Test the result by logging in, uploading a small file, and running a course backup. If the upload succeeds but the file does not appear after a refresh, check the data directory path and permissions before anything else.
What Render’s free tier does and does not guarantee
Render’s documentation separates a Web Service, for server-side code, from a Static Site, for purely static assets. Services are created from a connected Git repository with a branch, build command, start command, and environment variables. The FAQ states that PHP applications can be deployed through a Docker image, and recommends separate services for frontend, backend, and datastore roles.
The free-tier limits below are as published in Render’s free-tier documentation when this article was written. Render changes these terms, so check the current page before you deploy.
Rank #4
| Resource | Free tier limit | What it means for an LMS |
|---|---|---|
| Web service idle timeout | Spins down after 15 consecutive minutes with no inbound traffic | The first request after idle is slow |
| Wake-up time | About one minute | Students may see a long loading screen or timeout |
| Filesystem | Ephemeral; changes are lost on redeploy, restart, or spin-down | Local uploads or local databases are not safe |
| Free Postgres storage | 1 GB | Too small and too temporary for course content |
| Free Postgres lifetime | 30 days, with no backups | Data is lost unless you move it |
| Upgrade grace period | 14 days after expiry before deletion | A short window to recover, not a backup |
| Instance hours | 750 per workspace per calendar month, shared across free web services in that workspace | Several free services draw from the same pool |
| Production use | Render says not to use free instances for production applications | Treat the free route as testing or a hobby project |
Connecting a Render frontend or API to Moodle
When a frontend on Render needs Moodle data, the browser or your Render backend talks to Moodle over HTTPS. Two design rules prevent most of the trouble.
Quick wins for a faster PC:
Scan for outdated or missing drivers - takes under a minuteDriver Scan →Repair Windows errors before they cause bigger problemsFix Now →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →- Keep Moodle credentials on the server side. Do not put a Moodle web services token in frontend JavaScript. Store it as a Render environment variable on a backend service and have the frontend call that backend.
- Use HTTPS on both ends. Moodle on shared hosting should be served over SSL, and so should every Render service. Mixed HTTP and HTTPS calls fail silently in browsers.
To connect the pieces, enable Moodle’s web services for a dedicated service account, create a token with only the functions your app needs, and test the endpoint from a terminal with curl before you wire up the frontend. If the browser calls Moodle directly, the Moodle host must answer cross-origin preflight requests for your frontend’s origin. Confirm that behaviour on your Moodle version before relying on it. A small backend proxy on Render is often simpler, because it avoids cross-origin configuration on the Moodle host altogether.
Best Value
Plan for the cold start. Your frontend should show a loading state, use a timeout of at least a minute for the first call, and retry once if the request fails. This does not fix the free tier’s idle behaviour, but it stops a sleeping backend from looking like a broken course page.
Failure modes and recovery
- Uploads disappear after a Render deploy. Local files on a free web service are not kept. Move uploads to Moodle’s data directory on the shared host, or to external storage you control, and never write them to the Render container.
- The site works, then the database expires. A free Render Postgres lasts 30 days and has no backups. Do not host the production database there. If it was used for testing, export what you need within the 14-day grace period after expiry.
- The first request times out. This is the spin-down. Increase the frontend timeout and show a loading state, as described above.
- Moodle slows down with more users. This matches the performance warning in MoodleDocs’ shared-hosting guide. Measure response times with real student traffic and ask the host about CPU and memory limits before adding courses.
- Scheduled tasks stop running. Check the cron job in cPanel and the Moodle site’s scheduled task status. Moodle features that rely on background tasks, such as some notifications and reports, will stop without it.
When this setup stops being sensible
This architecture suits a learning project, a single course cohort, or an internal pilot with a known small group. It stops being sensible once you need reliable backups you control, a guaranteed uptime target, or enrollment that the shared host’s limits cannot handle. At that point, move Moodle and its database to a plan or platform sized for the load, and keep Render for the parts that truly do not need to store state.
Before choosing any host, confirm the current plan against Moodle’s requirements for your release, including PHP version, database version, cPanel tools, SSL, cron, and backup policy. The sources cited here do not verify any named hosting provider’s current plans or prices, so do not assume a plan meets these requirements without checking it directly.
The Tool Desk
Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →The free route on both sides is a good way to learn how the parts fit together. It is a poor place to store anything you would be sorry to lose.
Quick Recap
The Bottom Line
“”
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




