Server requirements
What a Zodiac Tech CRM server needs — PHP 8.4, MySQL, Composer, extensions, disk, cron — and how the installer verifies each one.
Zodiac Tech CRM runs on ordinary shared hosting. There is no Docker and no Nginx requirement — the supported target is cPanel (or Plesk/DirectAdmin) on Apache/LiteSpeed with PHP 8.4 and MySQL. This page lists exactly what the installer checks before it will proceed.
Who this is for
- Super-admin / hosting admin — preparing a server before upload.
- Support — triaging "installation fails at step 1" tickets.
Prerequisites: cPanel (or equivalent) access with the ability to create databases, set a PHP version, and add cron jobs.
Required server software
| Requirement | Minimum | Notes |
|---|---|---|
| PHP | 8.4 | The installer refuses anything below 8.4.1 (the bundled vendor/ platform check requires PHP_VERSION_ID >= 80401); composer.json requires php: ^8.4 |
| MySQL | MySQL 8.x or MariaDB (utf8mb4-capable) | The installer validates the connection using the utf8mb4 charset; all tables are created utf8mb4 |
| Web server | Apache (or LiteSpeed) with .htaccess support |
mod_rewrite required; the shipped .htaccess handles routing, headers and the Authorization header |
| Composer | Composer 2 (only if you can run it) | If cPanel has no Terminal, upload a pre-built vendor/ folder instead — see cPanel deployment walkthrough |
| Cron | One entry, every minute | Drives the scheduler and the queue drain. Without it, reminders, syncs, billing lifecycle and email sending stop |
Required PHP extensions
The installer (public/install.php) hard-blocks until all of these are present:
pdo, pdo_mysql, mbstring, openssl, tokenizer, xml, ctype,
json, bcmath, fileinfo, curl, zip, gd
Why the notable ones:
pdo_mysql— database access (the only supported driver is MySQL).zip—ZipArchiveis used for backups (leadhub:backup), updates and module installs.gd— image handling (logos, avatars, thumbnails).curl— Meta Graph API, payment providers, IMAP-adjacent HTTP calls.bcmath— precise money math for billing.
Most cPanel hosts enable all of these by default on PHP 8.4. Anything missing is visible under Select PHP Version → Extensions in cPanel.
Disk space
Plan for at least ~500 MB to start:
| Consumes space | Approximate |
|---|---|
Application + vendor/ |
A few hundred MB |
| MySQL database | Grows with leads/messages — small at first |
storage/app/public |
Uploads, recordings (30-day retention), exports |
storage/app/backups |
Each backup zip ≈ DB dump + uploaded files |
Recordings are the growth driver Call recordings are purged after 30 days (leadhub:purge-recordings, nightly), and the nightly backup is off until you enable it — so a growing disk is usually recordings or a backup pile-up. See Backups & restore.
Permissions
Three directories must be writable by PHP:
storage/and everything under it (app/public,framework/cache,framework/sessions,framework/views,logs)bootstrap/cache/public/— tenant branding writes per-tenant CSS topublic/tenant/<id>/
On cPanel, 775 (directories) is normally sufficient; some hosts need 755 with the file owner matching the PHP user. The installer's welcome screen re-checks writability and tells you exactly which folder fails.
Not required (despite what other stacks assume)
- No Docker, no Kubernetes, no Nginx — this product ships as a plain PHP app.
- No Redis — sessions, cache and queue default to
database/file, which work on shared hosting. Redis is optional on VPS hosts. - No Node.js at runtime — front-end assets are pre-built and shipped in
public/. - No SSH strictly required — the browser installer and the
/cron.phprunner exist for hosts without Terminal access.
Optional but recommended
- SMTP account (hosting provider or transactional service) — without it, invitations, digests and automation e-mails cannot send; see Email & SMTP.
- HTTPS certificate — required for Meta OAuth, WhatsApp webhooks and reliable mobile push; see Domain, subdomain & SSL.
- mysqldump available to PHP — backups use it when reachable and fall back to a pure-PHP dump when
exec()is disabled; either way works.
How the installer proves it
Upload everything, then open https://your-domain.com/install.php. Step 1 shows a checklist:
- PHP version (
>= 8.4.1) - Each required extension (pass/fail)
- Writable directories (pass/fail, per folder)
- Database connectivity (
utf8mb4handshake)
Only when every row is green does the installer enable the Continue button.
Installed already? Once storage/installed.lock exists, /install.php is no longer the entry point — the app boots normally. Keep the lock file; deleting it makes Laravel bounce every request back to the installer.
Common mistakes
- Selecting PHP 8.2/8.3 in cPanel MultiPHP and wondering why the installer refuses.
- Running
composer installwith the system PHP 7/8.1 CLI instead of the host's PHP 8.4 binary (php -vfirst). - Assuming the host blocks
exec()forever — backups still work via the PDO fallback. - Forgetting cron entirely, then blaming "e-mails not sending" (the mail queue never drains).
Troubleshooting
| Symptom | Fix |
|---|---|
| Installer stuck below PHP 8.4 | MultiPHP Manager → set the domain to PHP 8.4 |
| Missing extension | Enable it in Select PHP Version (some hosts require a support ticket) |
| "storage not writable" | Set 775 (or 755 if the host's PHP runs as your user); re-check ownership |
DB connection fails with utf8mb4 error |
Old MySQL/MariaDB — use a current version the host offers |
| Disk fills after a month | Check storage/app/recordings, exports and backups |
Technical details
- Installer preflight:
public/install.php($minPhp = '8.4.1',$requiredExts = [...], writable checks forstorage/+bootstrap/cache+public/). - Framework/stack signature:
composer.json(php: ^8.4, Laravel 13, Filament v4). - The cron runner alternative for no-SSH hosts:
cron.phpat the web root.
Related guides
Was this page helpful?
Thanks — noted. ✦