Where it runs cPanel, DirectAdmin, Plesk 30 August 2026

A status page on cPanel, DirectAdmin or Plesk — no VPS

Almost every self-hosted status page assumes you have a server to put it on. If what you have is a cPanel, DirectAdmin or Plesk account — the kind a hosting reseller already pays for — that assumption is the whole problem. Pharos is a PHP 8.3 application with SQLite by default and one cron line for a scheduler. It installs from the browser without SSH, or with one command if you have it, and runs its own checks from the hosting you already have.

Why most status pages want a VPS

Most of them are a long-running process: a Node.js service, a Go binary, a container that has to stay up. They want a port, a process manager and root, and none of that exists on a panel account. The older PHP options that did run there stopped being maintained, and never checked anything anyway. So the people with the most customer-facing sites on panel hosting — resellers, small agencies, one-person hosts — are the ones least likely to have a status page at all.

Pharos has no daemon and no queue worker. Everything time-based — checks, incident updates, subscriber mail, the hourly update check — hangs off one scheduled command that your panel’s cron runs every minute.

What Pharos needs

PHP8.3 or newer
DatabaseSQLite (default, needs nothing from your host) or MySQL
Extensionspdo_sqlite (plus pdo_mysql for MySQL), mbstring, openssl, sodium, zip, curl, fileinfo, tokenizer, xml, ctype, json — the installers check every one before writing anything. HTTP checks need allow_url_fopen on.
Web serverDocument root at public/, with mod_rewrite.
CronOne job, every minute
Outbound HTTPSTo reach the targets it checks and to fetch signed releases

Both installers verify the Ed25519-signed manifest and the SHA-256 of the archive before unpacking, and both put the application in ~/pharos-app, next to the web root rather than inside it, so .env is never reachable from the web.

Without SSH: the web installer

Download pharos-install.php and upload it into the document root of the domain you want the status page on — File Manager, public_html or the subdomain’s folder. Open it in the browser. The first screen checks PHP 8.3, the extensions, that the folders are writable and that the release server answers. Nothing is written yet.

The web installer's first screen: PHP version, required extensions, app and web folder, outbound HTTPS and existing-install check, each marked OK.
Screen 1 — nothing written yet. Every requirement on one list; fix what is red, press Continue.

Download fetches the release, checks the signed manifest and the checksum, unpacks the application into ~/pharos-app and copies public/ into the document root with an index.php that points at the app. No document-root change is needed. Configure asks for the site address and the database, writes .env with a fresh key and runs the migrations. The last screen is the cron line, with the PHP binary that matches the version the installer found.

The cron screen: one crontab line with a Copy button, and where to add it in cPanel, DirectAdmin and Plesk.
Screen 4 — the one cron line. Add it under Cron Jobs (cPanel, DirectAdmin) or Scheduled Tasks (Plesk). Finish deletes the installer and opens the setup form.

The installer keeps whatever your panel already put in .htaccess and adds its own rules underneath. A half-finished install resumes where it stopped.

With SSH: one command

curl -fsSL https://pharos.solutionmax.net/get | sh -s -- --php --url https://status.example.com

Same release, same checks. The script verifies the manifest and the archive, unpacks into ~/pharos-app, writes .env, migrates, and adds the cron line to your crontab with the PHP binary pinned to the version it found. Where it cannot write the crontab — DirectAdmin’s jailed shell, for one — it prints the line for you to add in the panel.

A terminal running the get script: OS detected, manifest signature valid, archive downloaded and verified, PHP checked, unpacked, .env written and migrated, cron line added, then the document-root instructions per panel.
The SSH route, start to finish. The last lines are the document-root step for your panel.

Unlike the web installer, the script does not touch your web folder. Point the document root at ~/pharos-app/public yourself:

  • cPanel: Domains → Manage → Document Root, or for a subdomain over SSH uapi SubDomain changedocroot domain=status.example.com docroot=pharos-app/public.
  • DirectAdmin: Domain Setup if your host lets you set a document root; most do not for user accounts, so replace the web folder with a link instead: mv public_html public_html.orig && ln -s ~/pharos-app/public public_html.
  • Plesk: Hosting Settings → Document root → pharos-app/public.

Never set the document root to ~/pharos-app itself; that exposes .env. Either way it ends at the setup form: name the page, create your administrator.

The one cron line

* * * * * cd /home/you/pharos-app && php artisan schedule:run >/dev/null 2>&1

This is the entire scheduler. In a panel’s cron form the five stars go in the time fields, the rest in the command field. If your host’s default php is not 8.3, use the full path to the 8.3 binary: cPanel exposes it as /opt/cpanel/ea-php83/root/usr/bin/php or /opt/alt/php83/usr/bin/php, Plesk as /opt/plesk/php/8.3/bin/php, and DirectAdmin as /usr/local/php83/bin/php. Pharos shows a warning in the admin until it sees the first run; php artisan pharos:check --force proves the runner works.

What a PHP host can and cannot do

  • No daemon, so the clock is cron. Checks run when the scheduler fires, once a minute. With the default retry count of two, an HTTP or TCP target is red about two minutes after it starts failing; three healthy checks in a row close the incident. That is deliberate — one dropped packet should not publish an outage.
  • SQLite is the default, and it is enough. Uptime is stored as daily roll-ups, one row per component per day, so a 90-day bar costs 90 rows rather than every raw result.
  • Outbound HTTP has to be on. If every HTTP check says No response, the host almost certainly has allow_url_fopen off or blocks outbound connections.
  • Subscriber mail goes through your own SMTP. Settings → Mail, with a test button. Sending runs from the same cron line, so posting an update never waits on a mail server.
  • Updates work without SSH. The Updates screen downloads the signed release, verifies it, snapshots the current version and replaces its own files; roll back from the same screen. If the directory is not writable, update over SSH instead.
  • It checks from where it runs. There are no external probe locations yet. A status page hosted on the infrastructure it watches goes down with it, so put it on a different account or host than the services it checks.

Where a VPS or Docker is the better choice

If you already run Docker, use it: docker compose up -d gives you two containers from one image, the app and the scheduler, and updates are a pull. If you need checks every few seconds rather than every minute, a panel cron cannot give you that. If you want ping, DNS or container checks, put a monitor such as Uptime Kuma on a VPS and feed Pharos its results. And if your host’s PHP is stuck below 8.3, the answer is a different host or a container, not a workaround.

Questions people ask

Do I need root or a VPS?

No. Pharos is a standard PHP 8.3 application with SQLite by default. It needs a document root, a writable folder outside it and one cron job that runs every minute, all of which a normal cPanel, DirectAdmin or Plesk account provides.

My host's default PHP is older than 8.3. Can I still install?

Yes, if the host offers a PHP 8.3 binary at all. The web installer finds the right binary and writes it into the cron line; over SSH, use the full path to it, as shown under The one cron line.

Does it need MySQL?

No. SQLite is the default and needs nothing from your host beyond a writable directory. MySQL is supported if you prefer it.

Can the status page monitor the server it runs on?

It can, but a page hosted on the infrastructure it watches goes down with it. Put it on a different account or host than the things it checks.

Try it on a subdomain first. The install guide covers cPanel, DirectAdmin, Plesk, compatible PHP 8.3 hosting and Docker; every release, its signed zip and a pinned copy of the web installer are on the releases page. The core is free and stays free.

Install Pharos   Releases & downloads