How Forma LMS Organizes Media and Why Storage Grows
Forma LMS keeps nearly all learner-facing binary data inside a single writable tree, typically /home/USER/public_html/files/ on a cPanel account or the equivalent path under the domain's document root in DirectAdmin. Within that tree you will find course logos, lesson attachments, user avatars, certificate backgrounds, and the large SCORM and AICC packages that get unpacked when an administrator imports learning objects. Each SCORM import can expand into hundreds of small files, and because shared hosting limits both disk space and inodes (the count of individual files and folders), an LMS that onboards a dozen courses a month can exhaust an inode quota long before it runs out of gigabytes.
The platform does not aggressively deduplicate or clean this directory. When a course is deleted from the admin interface, the database records are removed but orphaned package folders and thumbnail fragments frequently remain on disk. Over a year of active use, the files/ tree accumulates a long tail of abandoned uploads that no page ever references. This is the most common reason a Forma LMS account reports "disk full" or "too many files" warnings in cPanel while the course catalog itself looks modest.
Image handling adds a second layer. Forma LMS relies on the server's GD or Imagick PHP extension to resize avatars and course thumbnails at upload time. If the active PHP version in the cPanel PHP Selector or DirectAdmin PHP extensions manager has neither extension enabled, thumbnails silently fall back to serving full-resolution originals, which bloats both storage and page weight. Before optimizing anything, confirm that GD is active: create a temporary phpinfo.php file via File Manager containing <?php phpinfo();, load it in the browser, search for the GD section, and delete the file immediately afterward. You want to see GD with JPEG, PNG, and WebP support listed. On the LiteSpeed/CloudLinux stack Hostiso runs, WebP support in GD is standard on PHP 7.4 and newer, which is what makes modern-format delivery possible without any server-level changes.
Tuning Upload Limits and Protecting the Files Directory
Forma LMS reads PHP upload constraints directly from the runtime, so large SCORM packages or video attachments that exceed the defaults fail with a truncated or zero-byte file. On the CloudLinux PHP Selector you adjust these per-domain without touching any server configuration. In cPanel open Select PHP Version → Options and raise upload_max_filesize and post_max_size together, keeping post_max_size slightly larger than the upload limit. A workable pairing for SCORM-heavy catalogs is 128M upload and 160M post. Also lift memory_limit to 256M and max_execution_time to 300 so that image resizing and package extraction finish before the request times out.
If your plan exposes a .user.ini rather than the GUI toggles, drop the following into /home/USER/public_html/.user.ini and allow a few minutes for the value to refresh (it is cached for the duration of user_ini.cache_ttl):
upload_max_filesize = 128M
post_max_size = 160M
memory_limit = 256M
max_execution_time = 300
max_input_time = 300Oversized uploads are only half the concern. The files/ tree should never execute PHP, because an attacker who slips a script past the uploader could otherwise run it. Add a protective .htaccess inside public_html/files/ to disable script handling while still allowing media to be served:
<FilesMatch "\.(php|php5|phtml|phar|cgi|pl)$">
Require all denied
</FilesMatch>
Options -ExecCGI
RemoveHandler .php .phtml
SetHandler noneTo reclaim space from abandoned material, use cPanel File Manager sorted by size, or the Disk Usage tool, to locate the heaviest subfolders under files/. Cross-reference folder names against your active course list in the Forma LMS admin panel before deleting; the lesson and SCORM folders are named with numeric object IDs that map to the catalog. Compress anything you are unsure about into a ZIP, download it as a backup, then remove the live copy. Clearing the files/temp/ and files/cache/ subfolders is always safe because Forma regenerates them on demand.
Serving WebP Thumbnails and Caching Static Assets
Because GD on your PHP version can write WebP, the practical win is converting large JPEG and PNG course artwork to WebP before uploading it through the admin dashboard. There is no server-side batch converter available at the unprivileged level, so convert locally (most image editors export WebP) and upload the smaller files. A 400 KB JPEG course banner typically drops to 90–120 KB as WebP with no visible quality loss, cutting both storage and bandwidth. Forma LMS accepts WebP in its image fields as long as the browser requesting the page supports it, which every current browser does.
Caching headers deliver the biggest perceived speed gain for repeat learners, and they are entirely controllable from .htaccess in your document root. The following block tells LiteSpeed to send far-future expiry and immutable caching for static media, so a learner revisiting a course does not re-download unchanged thumbnails:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/webp "access plus 1 year"
ExpiresByType image/avif "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
</IfModule>
<IfModule mod_headers.c>
<FilesMatch "\.(webp|avif|jpe?g|png|gif|css|js|woff2)$">
Header set Cache-Control "public, max-age=31536000, immutable"
</FilesMatch>
</IfModule>LiteSpeed also honors a cache directive block, and compressing text assets reduces transfer further. Add Brotli/gzip for the markup and stylesheets Forma emits:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css application/javascript application/json image/svg+xml
</IfModule>Do not apply compression to already-compressed media (WebP, AVIF, JPEG); it wastes CPU for no gain. The FilesMatch and AddOutputFilterByType rules above deliberately separate the two concerns.
Offloading Static Media to a CDN Without Breaking the App
A content delivery network removes repeat image and SCORM-asset requests from your origin, protecting your account's bandwidth allotment and improving load times for geographically distant learners. On shared hosting the realistic approach is a pull-zone CDN, where the CDN fetches files from your origin on first request and caches them at the edge. You do not need object storage or any push-based upload pipeline, both of which Forma LMS lacks native integration for.
The cleanest method that survives Forma updates is a DNS-based CDN such as Cloudflare, configured entirely outside the application. Point your domain's nameservers (or a proxied record) at the CDN, enable caching for static file extensions, and the Cache-Control headers you set above will instruct the edge how long to retain each asset. Because Forma writes absolute or root-relative URLs for media under /files/, no code change is required—the CDN simply caches whatever the origin serves at those paths. Create a cache rule that bypasses caching for the admin area and any authenticated session path so that gradebooks, quiz state, and the AdminCP never serve stale data; a bypass pattern covering /lms/index.php?modname=admin* and login endpoints keeps dynamic pages correct.
If you prefer a subdomain-style pull zone that rewrites only media URLs, you can host assets under a CDN hostname and use a search-and-replace on stored URLs through phpMyAdmin—but do this cautiously. Export the Forma database first from phpMyAdmin's Export tab, then run a targeted UPDATE only against the specific columns that hold media paths, never a blanket replacement across all tables. For most Forma LMS installations on a single account, the DNS-proxy CDN with the caching and compression rules above delivers the storage relief and speed improvement you want while staying fully within hosting-user boundaries, with no risk to the learning records themselves.
Review the files/ directory size monthly in cPanel Disk Usage, keep the GD extension enabled across any PHP version upgrade, and your Forma LMS media layer will stay lean as the catalog grows.