cPanel Installation

Install MediaDesk on cPanel shared hosting without SSH: vendor, .env, database, installer and cron.
Version: 1.2.0
Stack: Laravel 13 · PHP 8.3 · MySQL

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 needDetails
HostingcPanel with PHP 8.3 or newer and MySQL 8 or MariaDB 10.6+
Your computerWindows, macOS or Linux, to create vendor/ and public/build/ once (Part 1)
The downloadMediaDesk-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.

  1. 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
  2. Open the project folder

    Unzip the download, then open a terminal inside Main_Files/WebSourceCode:

    cd path/to/Main_Files/WebSourceCode
  3. Run the three commands

    Run them one at a time and let each one finish. You do not need a .env file or a database on your computer.

    composer install --no-dev --optimize-autoloader
    npm ci
    npm run build
  4. Delete node_modules

    Delete the node_modules folder that npm created. It is about 180 MB and the server does not need it.

  5. Check the result

    These two files must now exist:

    FileCreated by
    vendor/autoload.phpcomposer install
    public/build/manifest.jsonnpm run build
  6. Make the upload zip

    Open WebSourceCode, select everything inside it, including .env.example and .htaccess, and compress that selection. The zip must not contain a WebSourceCode folder 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

  1. 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.

  2. 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.

  3. Raise the limits

    In MultiPHP INI Editor, choose your domain and set:

    SettingValue
    upload_max_filesize256M
    post_max_size256M
    memory_limit512M
    max_execution_time300

Part 3: Create the Database

  1. Create it

    Open MySQL Database Wizard. Create a database, for example mediadesk, and a user with a strong password.

  2. Give full rights

    Tick ALL PRIVILEGES for that user on that database.

  3. Write down the full names

    cPanel adds your account name in front, and the installer needs these full names:

    You typedThe real name
    Database mediadeskcpaneluser_mediadesk
    User 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 whenYou can set the document root, which is possible for add-on domains, subdomains and on most current cPanel versions for the main domainYou cannot change the document root of your main domain
SecurityProgram files sit outside the public folderProgram files sit in the public folder and the included .htaccess blocks them
  1. 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 .env and .htaccess.

  2. Open the folder

    Option A: create the folder mediadesk in your home folder and open it. Option B: open public_html and delete the default index.html or default.html if there is one.

  3. Upload the zip

    Click Upload and choose your zip. If the upload stops because of a size limit, upload it by FTP instead.

  4. Extract it

    Right-click the zip, choose Extract, then delete the zip. You should now see app, public, vendor, artisan, .env.example and .htaccess directly in this folder. If you see a WebSourceCode folder 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.

  1. 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).

  2. Rename it

    Right-click .env.example, choose Rename, type .env and save. The name starts with a dot and has nothing after env.

Do not skip this. Without a .env file the installer page answers with a 500 error.

What the installer writes into .env
KeyValue after installingMeaning
APP_NAMEYour site nameThe name you enter in the installer
APP_ENVproductionLive-site mode. Leave it.
APP_KEYbase64:…Security key, created for you. It protects sessions and the stored API keys.
APP_DEBUGfalseHides error details from visitors. Leave it.
APP_INSTALLtrueKeeps the installer closed
APP_URLhttps://your-domain.comYour site address
DB_HOST, DB_PORTlocalhost, 3306Database server
DB_DATABASE, DB_USERNAME, DB_PASSWORDFrom Part 3Database 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.

ScreenWhat to enter
1. RequirementsEvery line must be green. Fix anything red in Part 2, or ask your host.
2. DatabaseSite 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. AdministratorYour name, e-mail and a password of at least 8 characters. This is your Super Admin login.
4. DoneThe 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.

  1. Open Cron Jobs

    In cPanel open Cron Jobs. Under Common Settings, choose Once Per Minute (* * * * *).

  2. Enter the command

    Replace cpaneluser with 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
  3. Use the right PHP

    The command must use PHP 8.3 too. If /usr/local/bin/php is an older version on your host, use one of these paths:

    Hosting typePHP path
    Standard cPanel (EasyApache)/opt/cpanel/ea-php83/root/usr/bin/php
    CloudLinux/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

CheckExpected result
Open your domainThe public site with its styles
Open /login and sign inThe dashboard
Platform → System healthDatabase, storage and scheduler are OK. AI and push warnings are optional features.
Upload an image in the Media LibraryThe image shows
Open https://your-domain.com/.envA 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 seeFix
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 installingpublic/build/manifest.json is missing: repeat Part 1 and upload public/build.
Directory listing, 403 or a default hosting pageThe document root is wrong: check Part 5.
“Access denied” for the databaseUse the full names with the cpaneluser_ prefix, and check ALL PRIVILEGES (Part 3).
“Already contains tables” on an empty databaseThe 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 .envSet 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 halfwayThe database is no longer empty. Delete its tables in phpMyAdmin, or create a new database, then open /install again.
Scheduled articles do not publishThe cron job is not running: check the path and PHP version in Part 8.
Large uploads failCheck 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.