cPanel Installation
Install MediaDesk on cPanel shared hosting without SSH: vendor, .env, database, installer and cron.
Item: MediaDesk — Multilingual AI-Powered Newsroom ERP
Before You Start
This guide installs MediaDesk on shared hosting with cPanel. You do not need SSH: you prepare the files on your computer, upload one zip, then finish in the browser.
| You need | Details |
|---|---|
| Hosting | cPanel with PHP 8.3 or newer and MySQL 8 or MariaDB 10.6+ |
| Your computer | Windows, macOS or Linux, to create vendor/ and public/build/ once (Part 1) |
| The download | MediaDesk-Main_Files.zip. You only need the WebSourceCode folder inside it. |
Shared hosting suits small and medium sites. Hosts often lack headless Chrome and ffmpeg, so e-paper PDFs, photo cards and video tools may not work, and large newsletters run slowly. For those, use the VPS Installation guide.
Part 1: Create vendor and build on Your Computer
The download has no vendor/ folder (PHP packages) and no public/build/ folder (website styles and scripts). MediaDesk cannot start without them. You create both once, on your computer.
Install the tools
Install PHP 8.3 or newer (on Windows the easiest way is Laragon or XAMPP), Composer 2 and Node.js 20 or newer. Then open a terminal and check them:
php -v composer --version node -v
Open the project folder
Unzip the download, then open a terminal inside
Main_Files/WebSourceCode:cd path/to/Main_Files/WebSourceCode
Run the three commands
Run them one at a time and let each one finish. You do not need a
.envfile or a database on your computer.composer install --no-dev --optimize-autoloader npm ci npm run build
Delete node_modules
Delete the
node_modulesfolder thatnpmcreated. It is about 180 MB and the server does not need it.Check the result
These two files must now exist:
File Created by vendor/autoload.phpcomposer installpublic/build/manifest.jsonnpm run buildMake the upload zip
Open
WebSourceCode, select everything inside it, including.env.exampleand.htaccess, and compress that selection. The zip must not contain aWebSourceCodefolder at its top level. Expect about 85 MB.
If Composer complains about a missing PHP extension on your computer, add --ignore-platform-reqs to the command. The check still happens later on the server, where the extensions really matter.
Do not run php artisan optimize or config:cache on your computer: they store your computer’s folder paths, and the site then fails on the server.
Your cPanel has Terminal with Composer? You can upload without vendor/ and run composer install --no-dev --optimize-autoloader in the project folder there. You still need npm run build on your computer unless the host also provides Node.js 20+.
Part 2: Set PHP
Choose PHP 8.3
In cPanel open MultiPHP Manager, tick your domain and apply PHP 8.3 or newer. Some hosts show Select PHP Version instead.
Turn on the extensions
In Select PHP Version → Extensions, make sure these are on:
curl,fileinfo,exif,mbstring,intl,pdo_mysql,openssl,xml,ctype,tokenizer,gd. If your cPanel has no such screen, the installer shows what is missing and your host can enable it.Raise the limits
In MultiPHP INI Editor, choose your domain and set:
Setting Value upload_max_filesize256Mpost_max_size256Mmemory_limit512Mmax_execution_time300
Part 3: Create the Database
Create it
Open MySQL Database Wizard. Create a database, for example
mediadesk, and a user with a strong password.Give full rights
Tick ALL PRIVILEGES for that user on that database.
Write down the full names
cPanel adds your account name in front, and the installer needs these full names:
You typed The real name Database mediadeskcpaneluser_mediadeskUser mdadmincpaneluser_mdadmin
Create a new user for this database and do not add it to any other. The installer counts every table the user can see, so a user with other databases is refused with “already contains tables”.
Part 4: Upload and Extract
Choose where the files go. Use Option A if your cPanel lets you change the document root.
| Option A (recommended) | Option B | |
|---|---|---|
| Folder | /home/cpaneluser/mediadesk | /home/cpaneluser/public_html |
| Use it when | You can set the document root, which is possible for add-on domains, subdomains and on most current cPanel versions for the main domain | You cannot change the document root of your main domain |
| Security | Program files sit outside the public folder | Program files sit in the public folder and the included .htaccess blocks them |
Show hidden files
Open File Manager and click Settings at the top right. Tick Show Hidden Files (dotfiles) and save. You need this to see
.envand.htaccess.Open the folder
Option A: create the folder
mediadeskin your home folder and open it. Option B: openpublic_htmland delete the defaultindex.htmlordefault.htmlif there is one.Upload the zip
Click Upload and choose your zip. If the upload stops because of a size limit, upload it by FTP instead.
Extract it
Right-click the zip, choose Extract, then delete the zip. You should now see
app,public,vendor,artisan,.env.exampleand.htaccessdirectly in this folder. If you see aWebSourceCodefolder instead, move its contents up one level.
Leave file permissions as they are after extracting: folders 755 and files 644. On cPanel, PHP normally runs as your own account, so this is enough. Never set 777.
Part 5: Point the Domain
Option A: open Domains, click Manage next to your domain (on older cPanel, use Addon Domains or Subdomains) and set the document root to:
mediadesk/public
Option B: nothing to do. The domain already opens public_html, and the included .htaccess sends visitors to the public folder.
Install on a domain or a subdomain. Do not install in a subfolder such as example.com/news.
Then turn on HTTPS: open SSL/TLS Status and click Run AutoSSL. Wait until your domain has a certificate before you continue.
Part 6: Create the .env File
.env is the settings file of your site. It holds the site address, database password and security key. You only rename one file here: the installer writes the correct values in Part 7.
Find the example file
In File Manager, open your MediaDesk folder and find
.env.example. If you cannot see it, turn on hidden files (Part 4, first step).Rename it
Right-click
.env.example, choose Rename, type.envand save. The name starts with a dot and has nothing afterenv.
Do not skip this. Without a .env file the installer page answers with a 500 error.
What the installer writes into .env
| Key | Value after installing | Meaning |
|---|---|---|
APP_NAME | Your site name | The name you enter in the installer |
APP_ENV | production | Live-site mode. Leave it. |
APP_KEY | base64:… | Security key, created for you. It protects sessions and the stored API keys. |
APP_DEBUG | false | Hides error details from visitors. Leave it. |
APP_INSTALL | true | Keeps the installer closed |
APP_URL | https://your-domain.com | Your site address |
DB_HOST, DB_PORT | localhost, 3306 | Database server |
DB_DATABASE, DB_USERNAME, DB_PASSWORD | From Part 3 | Database login |
Editing .env later
Right-click .env, choose Edit, change the line, then Save Changes. The change applies straight away. Usually you only need this if your database password changes. Mail, payment and API keys are set in the admin panel under Settings → Integrations.
Keep a private copy of .env after installing, and never share it. If you lose APP_KEY, the API keys saved in the admin panel can no longer be read and all users are signed out.
Part 7: Run the Installer
Open https://your-domain.com. It redirects to the installer.
| Screen | What to enter |
|---|---|
| 1. Requirements | Every line must be green. Fix anything red in Part 2, or ask your host. |
| 2. Database | Site name, site URL https://your-domain.com, host localhost (replace the pre-filled 127.0.0.1), port 3306, then the full database name, full username and password from Part 3 |
| 3. Administrator | Your name, e-mail and a password of at least 8 characters. This is your Super Admin login. |
| 4. Done | The installer creates the tables and base data, then closes itself for good. This can take a minute. Sign in at /login. |
You do not need to run migrate, db:seed or storage:link: the installer does all of this. If the host blocks symbolic links, images are still served correctly.
Part 8: Add the Cron Job
Scheduled articles, renewals, reminders, digests and social posts all depend on this one job.
Open Cron Jobs
In cPanel open Cron Jobs. Under Common Settings, choose Once Per Minute (* * * * *).
Enter the command
Replace
cpaneluserwith your account name. Option A:cd /home/cpaneluser/mediadesk && /usr/local/bin/php artisan schedule:run >> /dev/null 2>&1
Option B:
cd /home/cpaneluser/public_html && /usr/local/bin/php artisan schedule:run >> /dev/null 2>&1
Use the right PHP
The command must use PHP 8.3 too. If
/usr/local/bin/phpis an older version on your host, use one of these paths:Hosting type PHP path Standard cPanel (EasyApache) /opt/cpanel/ea-php83/root/usr/bin/phpCloudLinux /opt/alt/php83/usr/bin/php
After a few minutes, open Platform → System health in the admin panel. The scheduler heartbeat should be OK. If it is not, ask your host to confirm the PHP path and that the PHP function proc_open is enabled, because the scheduler needs it.
You do not need a queue worker on shared hosting. The default QUEUE_CONNECTION=sync sends newsletters and push alerts during the request itself. This is fine for small lists; large campaigns need a VPS with a worker.
Part 9: Check Everything
| Check | Expected result |
|---|---|
| Open your domain | The public site with its styles |
Open /login and sign in | The dashboard |
| Platform → System health | Database, storage and scheduler are OK. AI and push warnings are optional features. |
| Upload an image in the Media Library | The image shows |
Open https://your-domain.com/.env | A 403 or 404 page. If you can read the file, stop and contact your host. |
Next: After Installing for your site identity, time zone, mail and payment settings. Later versions install from System → System update, with no terminal needed (details).
If Something Goes Wrong
| What you see | Fix |
|---|---|
| 500 error on the installer | .env is missing: do Part 6. Also check that vendor/autoload.php exists. |
| 500 error or a Vite manifest error after installing | public/build/manifest.json is missing: repeat Part 1 and upload public/build. |
| Directory listing, 403 or a default hosting page | The document root is wrong: check Part 5. |
| “Access denied” for the database | Use the full names with the cpaneluser_ prefix, and check ALL PRIVILEGES (Part 3). |
| “Already contains tables” on an empty database | The database user also has access to another database. Create a new user for this database only. |
An installer step is red for a folder or .env | Set folders storage and bootstrap/cache to 755, and .env to 644, with File Manager → Permissions. If it stays red, ask your host whether PHP runs as your account. |
| The installer stopped halfway | The database is no longer empty. Delete its tables in phpMyAdmin, or create a new database, then open /install again. |
| Scheduled articles do not publish | The cron job is not running: check the path and PHP version in Part 8. |
| Large uploads fail | Check the limits in Part 2. |
The log is at storage/logs/laravel.log; open it from File Manager. More answers are in the Troubleshooting FAQ.