Before you begin
For a public server, use a supported PHP release (8.3 or newer), MySQL or compatible MariaDB with InnoDB and utf8mb4, HTTPS, and a web server with routing configured. Required PHP extensions include pdo_mysql, json, mbstring, fileinfo, and zip. Give PHP write access only to working directories such as storage, content, and uploads.
Set upload_max_filesize and post_max_size above the size of any backup you intend to restore.
Clean installation
- Upload the clean FoxCoreCMS distribution to the site's document root.
- Create an empty database and a dedicated database user.
- Open /install/ over HTTPS and check the requirements.
- Enter the MySQL connection details and the site's name and URL.
- Create the first administrator with a unique password of at least 12 characters.
- Finish the wizard and sign in at /admin/.
The installer runs migrations and creates storage/private/installed.lock. Do not remove this lock to run setup again; the installer must remain unavailable after installation.
Migrating an existing site
The installation wizard can accept a portable FoxCoreCMS ZIP archive. It verifies the format and checksums before restoring the design, content, uploads, modules, page tree, and database. Enter the new database credentials and administrator details in the wizard.
After migration, confirm the site URL, every active language, forms, email, and integrations. Make a new backup on the destination server. To restore an already installed site, use the administration backup workflow rather than rerunning the installer.
Common problems
- Missing zip: enable PHP ZipArchive.
- Database connection fails: check host, port, database, user, and password.
- Files cannot be written: grant the web user access only to the required working directories.
- Archive too large: review PHP and web-server upload limits.
Exact requirements and installation outcome
PHP 7.4 is the technical minimum, but use a supported 8.3-or-newer release on a public server. Apache must allow .htaccess rules, or nginx must be configured manually. Use MySQL 5.7/8.x or compatible MariaDB, InnoDB tables, and utf8mb4. A clean installation without an archive creates a neutral design/starter, the home page, a 404 page, and an empty set of module instances and installed-module state. It does not import demonstration or previously migrated content.
When an archive is supplied, the wizard first creates the basic database structure, checks the ZIP format and checksums, then restores the design, content, media, modules, structure, and MySQL data. It uses the new database credentials, site URL, and first administrator from the current installation form. After installed.lock is created, rerunning the installer must return HTTP 403.
File permissions
Do not make the entire site writable and do not use 777. During normal operation PHP needs write access to storage/ (settings, sessions, cache, backups, and module data), uploads/, and content/. Permit writes to design/ and modules/*/templates/ only if templates will be edited in the administration panel.
Typical Linux permissions are 775 for storage/, uploads/, and content/, and 770 for storage/private/. Give design/ and modules/*/templates/ 775 only when panel-based template editing is required. Regular files in writable directories may use 664, and private files 660. The owner or group must match the PHP process user. Keep admin, src, install, database, and root PHP files read-only to the web server.
If the installer says the system is already installed, do not remove the lock file: restore from the administration panel instead. After migration, make a fresh backup on the destination server and ensure storage/private is inaccessible from the web.

← Documentation