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
| PHP | 8.3 or newer |
|---|---|
| Database | SQLite (default, needs nothing from your host) or MySQL |
| Extensions | pdo_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 server | Document root at public/, with mod_rewrite. |
| Cron | One job, every minute |
| Outbound HTTPS | To 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.
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 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.
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_fopenoff 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.