Getting Started
Installation
Upload, point the document root at public_html/, run install.sh, and finish in the browser. No build step, no Composer, no Node — about 10 minutes.
Requirements
- PHP 8.3+ (8.4 recommended).
- MySQL 8.0+ or MariaDB 10.5+, with an empty database and a user that has full privileges on it.
- SSH or FTP access to upload and extract the release.
- A domain or subdomain whose document root points to
public_html/.
Tip · PHP extensions
Required: pdo, pdo_mysql, mbstring, json, curl, openssl, session. fileinfo is optional (image-upload validation). Verify everything with php app/bin/console check.
Install
- Extract the
.zipas the user that will own the site — not root. - Point the domain's document root at
public_html/(app/stays above the web root and is never served). - Run the helper — it creates the storage directories and fixes permissions:
bash install.sh - Open the wizard at
https://your-domain/install.phpand follow it.
The setup wizard
A self-contained, 5-step wizard (no dependency on the app bootstrap):
- Language — installer and panel default.
- Database — host, port, name, user, password. Test connection runs a live check and enforces MySQL 8.0+ / MariaDB 10.5+.
- Admin — name, email, and a password of at least 8 characters. This becomes the superadmin.
- Branding — panel name, short name, accent color, optional logo and favicon.
- Confirmation — review and install; optionally seed demo data (example users, roles, notifications).
On install it writes app/.env, runs the migrations, seeds settings, creates the admin, saves branding, and creates the storage directories. When it finishes it deletes install.php and check.php automatically.
After install
- Log in at
https://your-domain/loginwith the admin credentials you just created. - Delete the
.zipyou uploaded. - Confirm
install.phpis gone frompublic_html/— it must not stay publicly reachable.
Notes & troubleshooting
- Pointing the document root (subdomain / vhost)
- Set the domain's document root to this installation's
public_html/. On Apache:DocumentRoot /home/youraccount/public_htmlwithAllowOverride All. On cPanel, set the subdomain's Document Root to that folder. Everything inapp/(your.env, logs, uploads) lives above it and is never served. - Permission errors /
app/storagenot writable - Re-run
bash install.sh— it setsapp/storage/to755, and when run as root it also fixes ownership to the hosting user. On shared hosting, make sure ownership matches your account user. - "PHPFoundry is already installed"
- The installer refuses to run once
app/.envexists, to protect an existing install. If you are done, just removepublic_html/install.php. To reinstall intentionally, deleteapp/.env(and drop the database) first — destructive, so back up. - "Could not connect to the database"
- Re-check host, port, name, user and password; the database must already exist and the user needs privileges on it. The host is usually
localhostor127.0.0.1, and on shared hosting the database/user are prefixed with your account name. - "Could not auto-delete install.php"
- Install succeeded but the file could not remove itself (permissions). Delete
public_html/install.phpmanually. - Logo / favicon uploads rejected
- The Branding step uses the
fileinfoextension to validate image MIME types. It is optional — without it the panel still works; enablefileinfoif you need upload validation.