Installation Guides
Every downloaded package already includes its PHP dependencies and compiled frontend assets — no Composer or Node.js needed on the machine you're installing to. Once the files are in place and pointed at by a web server, the app's own setup wizard (visiting the site for the first time) handles the database and admin account.
Local / Windows Server
Windows (XAMPP)
These steps are verified against a real Windows 10 VM running XAMPP.
- Install XAMPP for Windows 8.2.12: download link (uninstall any older XAMPP first). The app requires PHP
^8.2— 8.2, 8.3, and 8.4 all work; older versions will not run it. - Open
C:\xampp\php\php.ini. Confirm these two lines have no;in front (XAMPP 8.2.12 ships with both already enabled by default — just double-check):extension=openssl extension=imap
If either has a;in front, remove it and save. - Open XAMPP Control Panel, start Apache and MySQL.
- Go to
http://localhost/phpmyadminand create a new database. Note its name. - Download the package and extract it to:
C:\xampp\htdocs\msp-helpdesk
- Open Command Prompt and run:
cd C:\xampp\htdocs\msp-helpdesk copy .env.example .env C:\xampp\php\php.exe artisan key:generate
This step is required before the first visit — without it, the site returns a 500 error instead of the setup wizard. - Edit
C:\xampp\apache\conf\extra\httpd-vhosts.confand add:<VirtualHost *:80> DocumentRoot "C:/xampp/htdocs/msp-helpdesk/public" ServerName localhost <Directory "C:/xampp/htdocs/msp-helpdesk/public"> AllowOverride All Require all granted </Directory> </VirtualHost>Usinglocalhosthere (not a custom hostname) avoids needing to edit the Windows hosts file at all. - In XAMPP Control Panel, Stop then Start Apache to reload the config.
- Visit
http://localhost/— the setup wizard loads automatically and shows a system requirements check (all green). Click Continue, then fill in the Database & Site Setup form:- Site URL: leave as
http://localhost. - Database Host: leave as
127.0.0.1, Port: leave as3306. - Database Name: the database you created in step 4.
- Database Username:
root— XAMPP's default MySQL user. - Database Password: leave blank — XAMPP's default
rootuser has no password.
- Site URL: leave as
After that submission, you'll hit a "Not Found" page. This is expected: the installer's own code writes
APP_ENV=production into .env the moment you submit that form, which force-redirects every page to HTTPS — and this setup has no SSL configured. Fix it:
- Open
C:\xampp\htdocs\msp-helpdesk\.env, changeAPP_ENV=productiontoAPP_ENV=local, save. - Go directly to
http://localhost/install/migrate(plainhttp://) to continue — do not resubmit the Database step, since that would just writeproductionback in again.
Self-Managed Server
Linux (Ubuntu/Debian)
These steps are verified against a real Ubuntu 22.04 deployment.
- Install PHP 8.2 (Ubuntu 22.04's default repo only has 8.1, so add the PPA first). PHP
^8.2is required — 8.3 and 8.4 also work if you swap the version number below:sudo add-apt-repository ppa:ondrej/php -y sudo apt update sudo apt install php8.2-fpm php8.2-cli php8.2-mysql php8.2-mbstring \ php8.2-xml php8.2-curl php8.2-zip php8.2-gd php8.2-bcmath php8.2-intl php8.2-imap -y
- Install and start MySQL:
sudo apt install mysql-server -y sudo systemctl enable mysql --now
Create a database and user — replacechoose-a-strong-passwordwith your own password before running this:sudo mysql -e "CREATE DATABASE msphelpdesk; CREATE USER 'msphelpdesk'@'localhost' IDENTIFIED BY 'choose-a-strong-password'; GRANT ALL PRIVILEGES ON msphelpdesk.* TO 'msphelpdesk'@'localhost'; FLUSH PRIVILEGES;"
Note the database name, username, and password — you'll enter them in the installer. - Install Nginx:
sudo apt install nginx -y - Download and extract the package (the zip has no wrapping folder, so create the target directory first and unzip into it):
sudo apt install curl unzip -y sudo mkdir -p /var/www/your-app-name cd /var/www/your-app-name sudo curl -LO https://updates.simpleit.nyc/releases/msp-helpdesk-1.0.45.zip sudo unzip msp-helpdesk-1.0.45.zip sudo rm msp-helpdesk-1.0.45.zip
Check the download page for the current version number — the URL above will go stale as new versions are released. - Run these before the first visit — without them, the site returns a 500 error instead of the setup wizard (all files here are owned by
rootfrom the previous step, so these needsudo):cd /var/www/your-app-name sudo cp .env.example .env sudo php8.2 artisan key:generate
Then setAPP_URLto exactly how you'll access the site in a browser — the same host you'll put inserver_namebelow, includinghttp://. Replaceyour-domain-or-ipwith your real IP or domain:sudo sed -i 's|^APP_URL=.*|APP_URL=http://your-domain-or-ip|' .env
This matters:.env.exampledefaultsAPP_URLtohttp://localhost, and Laravel rejects any request whose Host header doesn't match it, with a 400 Bad Request. If you skip this and access the server by IP or a custom domain, you'll hit that error. - Set ownership so the web server (running as
www-data) can write where it needs to:sudo chown -R www-data:www-data storage bootstrap/cache sudo chmod -R 775 storage bootstrap/cache sudo chown www-data:www-data .env
The last line matters: the setup wizard writes your database settings into.envdirectly from the browser (aswww-data). If.envis still owned byroot, that write silently fails and your settings won't actually save. - Create
/etc/nginx/sites-available/your-app-namepointing at the package'spublic/folder, with PHP-FPM handling.phprequests. Run this whole block as one command — it writes the file for you, no text editor needed. Replaceyour-domain-or-ipwith the same host you set asAPP_URLabove:sudo tee /etc/nginx/sites-available/your-app-name > /dev/null <<'EOF' server { listen 80; server_name your-domain-or-ip; root /var/www/your-app-name/public; index index.php; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } } EOFDo not paste just theserver { ... }block on its own — pasted straight into the shell without thesudo tee ... <<'EOF'wrapper, bash tries to runserver,listen, etc. as commands and fails with a wall of "command not found" errors. - Enable the site and reload Nginx:
sudo ln -s /etc/nginx/sites-available/your-app-name /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx
- If
ufwis enabled on this server, allow HTTP first:sudo ufw allow 80/tcp(check withsudo ufw status— skip this if it says inactive). - Visit the site in a browser — the setup wizard loads and shows a system requirements check. Continue to the Database & Site Setup form and enter the Site URL (same value as
APP_URL), Database Host127.0.0.1, Port3306, and the database name/username/password from step 2. Click Test Connection & Continue.
After that submission, you may hit a "Not Found" page. This is expected if you don't have SSL configured (e.g. an internal/staging box): the installer's own code writes
APP_ENV=production into .env the moment you submit that form, which force-redirects every page to HTTPS — and without SSL nothing is listening on port 443. Fix it:
- Run:
sudo -u www-data sed -i 's/^APP_ENV=production/APP_ENV=local/' /var/www/your-app-name/.env - Go directly to
http://your-domain-or-ip/install/migrate(plainhttp://) to continue — do not resubmit the Database step, since that would just writeproductionback in again.
APP_ENV=production — that's correct there.Shared Hosting
Namecheap, HostGator & Similar (cPanel) Hosting
- Confirm your hosting plan supports PHP 8.2 — in cPanel, use Select PHP Version (sometimes called "MultiPHP Manager") to set it for your domain, and enable the extensions listed on the download page if any show as off.
- Create a MySQL database and database user in cPanel's MySQL Database Wizard, and note the database name, username, and password it generates (shared hosts commonly prefix these with your account username automatically).
- Upload the package via cPanel's File Manager (upload the zip, then use its built-in "Extract" option) or via FTP, into a folder outside your domain's public web root — e.g. a sibling folder next to
public_html, not inside it. -
The app's structure expects the web server to point at its
public/subfolder specifically, but most shared hosting points your domain straight atpublic_html. Two ways to handle this, in order of preference:- If you're installing to a subdomain or addon domain: most cPanel setups let you choose a custom document root when creating it — point it directly at the package's
publicfolder. - If you must use the account's main
public_html: move everything from inside the package'spublicfolder up intopublic_html, then edit the tworequirelines inpublic_html/index.phpso they point one directory further up to where the rest of the app (thevendorandbootstrapfolders) actually lives.
- If you're installing to a subdomain or addon domain: most cPanel setups let you choose a custom document root when creating it — point it directly at the package's
- Visit your domain in a browser and complete the installer using the database details from step 2.
Most reputable hosts (including Namecheap and HostGator) provision free SSL automatically (AutoSSL / Let's Encrypt) — on this kind of hosting the installer's HTTPS behavior is generally correct out of the box and needs no adjustment, unlike a bare local/internal server.