1. Server Requirements

Software Requirements

Component Minimum Recommended
PHP 8.2 8.3+ with OPcache
Database PostgreSQL 14 PostgreSQL 15 or 16
Web Server Apache 2.4 or Nginx 1.18 Nginx with SSL/TLS
Composer 2.x Latest 2.x
MySQL is NOT supported. RepairFlow uses PostgreSQL-specific features (JSONB columns, array operators). Only PostgreSQL 14+ is supported.

Required PHP Extensions

ExtensionPurpose
pdoDatabase abstractionRequired
pdo_pgsqlPostgreSQL driverRequired
pgsqlPostgreSQL native functionsRequired
curlHTTP requestsRequired
gdImage processingRequired
jsonJSON supportRequired
mbstringMulti-byte stringsRequired
opensslEncryptionRequired
tokenizerPHP tokenizerRequired
xmlXML parsingRequired
zipZIP archive handlingRequired
fileinfoFile type detectionRequired
bcmathPrecision arithmeticRequired
intlInternationalizationRequired

The web installer will check all extensions and display which ones are missing before you proceed. You can verify them yourself with: php -m | grep -E 'pdo|curl|gd|zip'

Optional (Production)

  • Supervisor — runs the queue worker (php artisan queue:work) to process background jobs such as push notifications and email delivery.
  • Redis — can replace the database cache/queue driver for better performance. The database driver is used by default and works well for most shops.
  • SSL certificate — required for PWA installation prompt and push notification features. Free certificates available via Let's Encrypt / Certbot.
  • Node.js 18+ / npm — only needed if you want to rebuild the frontend assets. Pre-compiled assets are included in the package.

2. Upload Files to Your Server

What to upload

Extract the purchased ZIP file. Inside you will find the application folder (named repairflow/ or similar). Upload all contents to your server's document root or a subdirectory. Typical locations:

  • Shared hosting: /public_html/
  • VPS / Dedicated: /var/www/repairflow/
  • Subdomain: point the subdomain's document root to the public/ subdirectory
Web server document root must point to the public/ folder inside the application. For example: if you upload files to /var/www/repairflow/, set the document root to /var/www/repairflow/public/. Never expose the root of the application directly.

Nginx configuration example

server {
    listen 80;
    server_name your-domain.com;
    root /var/www/repairflow/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    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;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Apache (.htaccess)

A .htaccess file is included in the public/ folder. Ensure mod_rewrite is enabled on your Apache installation. In your Apache VirtualHost config, set:

DocumentRoot /var/www/repairflow/public
<Directory /var/www/repairflow/public>
    AllowOverride All
    Require all granted
</Directory>

3. File & Directory Permissions

Before running the installer, ensure the web server user (typically www-data on Ubuntu/Debian or nginx/apache on CentOS) has write access to two directories:

chmod -R 775 storage bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache

Or, if you are not sure of the web server user, use 777 (less secure but works everywhere):

chmod -R 777 storage bootstrap/cache
The installer will check permissions at Step 2 and show a red error if these directories are not writable. Fix permissions before clicking Continue.

4. Web Installer — 7 Steps

Open your browser and navigate to https://your-domain.com/install to start the installer. If the application is already installed (the lock file exists), you will be redirected to the login page instead.
1

System Requirements Check

The installer checks your PHP version and all required extensions. Each item shows a green checkmark or a red cross.

If any extension is missing, install it via your hosting control panel or with sudo apt install php8.2-pgsql php8.2-gd php8.2-curl php8.2-zip on Ubuntu. Then refresh the page.

Click Continue only when all checks are green.

2

Directory Permissions Check

Verifies that storage/ and bootstrap/cache/ are writable by the web server.

If either shows a red error, run the chmod commands from Step 3 above, then click Re-check.

3

Database Configuration

Enter your PostgreSQL connection details:

  • Host — usually 127.0.0.1 or localhost
  • Port — default is 5432
  • Database name — e.g. gara_manager
  • Username — PostgreSQL user with CREATE DATABASE privileges
  • Password — the user's password

Click Test Connection. The installer will: connect to PostgreSQL, and if the named database does not exist, attempt to create it automatically (requires sufficient privileges). Your credentials are saved in the session — not written to .env yet.

If auto-create fails (shared hosting with restricted privileges), create the database manually first via phpPgAdmin or your hosting panel, then re-enter credentials and test.
4

Site Information

Configure basic site details that will be written to .env:

  • Shop / App Name — shown in the browser tab and emails
  • App URL — full URL including https:// (e.g. https://gara.yourcompany.com)
  • Timezone — select from the dropdown (e.g. Asia/Ho_Chi_Minh)
The App URL must be exact. If PWA push notifications or shareable links do not work after installation, the URL mismatch is the most common cause.
5

Admin Account

Create the primary administrator account:

  • Phone number — used to log in (required)
  • Password — minimum 8 characters
  • Email — optional, but required later if you want to use the Forgot Password feature
  • Full name

This is the only account created by the installer. You can add more staff accounts from Admin → Users after installation.

Additionally, the installer creates three demo staff accounts (see the Demo Accounts section). Change their passwords after your first login.

6

Installing — Real-time Progress

Click "Start Installation". The installer executes the following steps in sequence and streams each result to the browser:

  1. 1
    Reconnect to the database with your credentials
  2. 2
    Generate a secure APP_KEY (if not already set)
  3. 3
    Run database migrations — creates all tables and indexes
  4. 4
    Seed roles and permissions (RolePermissionSeeder)
  5. 5
    Create your admin account and the three demo staff accounts
  6. 6
    Create the public storage symlink (storage:link)
  7. 7
    Write final .env file (APP_ENV=production)
  8. 8
    Mark the installation as complete (lock file + database flag)
  9. 9
    Clear config and cache
Do not close the browser tab during installation. The process takes 30–120 seconds depending on server speed. If you see a red error in the log, see the Troubleshooting section.
7

Finish

Installation complete. The installer shows a success screen with a "Go to Login" button.

The /install/* routes are now permanently locked. If you navigate to /install again you will be redirected to the login page.

Log in with your admin phone number and password. Complete the Post-Install Checklist before inviting your team.

5. Demo Accounts

The installer automatically creates three demo staff accounts alongside your admin account. These accounts are useful for exploring role-based access before setting up your real team. Change their passwords immediately after first login.

Role Login (Phone) Default Password
Receptionist 0900000002 123456
Technician 0900000003 123456
Accountant 0900000004 123456
Security: Delete or change these demo accounts before going live with real data. Go to Admin → Users to manage them.

6. Post-Install Checklist

Complete these steps before inviting your team

  1. 1
    Change the admin password — click your avatar in the top-right corner → My Profile → change password.
  2. 2
    Delete or update demo accounts — go to Admin → Users and remove the demo accounts (0900000002, 0900000003, 0900000004) or reset their passwords.
  3. 3
    Set shop information — go to Admin → Settings → General: enter your shop name, phone number, address, and upload your logo (displayed on invoices and the PWA splash screen).
  4. 4
    Configure SMTP email — go to Admin → Settings → Email (SMTP) to enable the Forgot Password feature. Without SMTP, password reset emails cannot be sent. See the Email & SMTP section of the User Guide for Gmail setup instructions.
  5. 5
    Add product categories — go to Admin → Settings → Product Categories and create your categories (e.g. Parts, Materials, Services).
  6. 6
    Add suppliers — go to Admin → Settings → Suppliers and enter your parts suppliers.
  7. 7
    Create warehouses and locations — go to Admin → Settings → Warehouses to set up at least one warehouse (e.g. "Main Warehouse") and storage locations (e.g. Shelf A, Shelf B).
  8. 8
    Configure payment accounts — go to Admin → Settings → Payment Accounts and add your cash register, bank accounts, or e-wallet accounts.
  9. 9
    Add products and services — go to Admin → Products and create your catalog. Import initial stock via Admin → Inventory → Purchase Orders.
  10. 10
    Create staff accounts — go to Admin → Users and invite your receptionists, technicians, and accountants. Assign the appropriate role to each.

7. Troubleshooting Common Errors

❌ Blank white page after upload
Usually a PHP error suppressed in production. Check your server error log (/var/log/nginx/error.log or /var/log/apache2/error.log). Also ensure storage/ and bootstrap/cache/ are writable. If you see "No application encryption key has been specified," the installer has not run yet — go to /install.
❌ SQLSTATE[08006]: could not connect to server
PostgreSQL is not running, the host/port is wrong, or the firewall blocks port 5432. On a VPS: sudo systemctl status postgresql to verify it is running. On shared hosting: confirm PostgreSQL is available (not just MySQL).
❌ SQLSTATE[42501]: permission denied to create database
The PostgreSQL user does not have CREATEDB privileges. Either grant the privilege (ALTER USER youruser CREATEDB;) or create the database manually first, then re-enter credentials in Step 3 of the installer.
❌ 419 Page Expired after submitting installer form
CSRF token expired. This usually happens if you left the browser tab open for a long time before clicking Continue. Refresh the page and start the step again. Also check that your SESSION_DRIVER is valid — the installer uses the database driver.
❌ Installation log shows "php artisan migrate" failed
Most common cause: the PostgreSQL extension for PHP is not installed (pdo_pgsql missing). Install it with sudo apt install php8.2-pgsql, restart PHP-FPM (sudo systemctl restart php8.2-fpm), then start the installer again.
❌ "Storage directory is not writable" on Step 2
Run: chmod -R 775 storage bootstrap/cache and chown -R www-data:www-data storage bootstrap/cache (replace www-data with your web server user). Then click "Re-check Permissions" in the installer.
❌ I need to reinstall / reset everything
Delete the file storage/app/installed and remove the record with key = 'app_installed' from the settings database table (or drop and recreate the entire database). The installer will be accessible again at /install.
❌ 404 Not Found for all routes after deployment
The web server is not pointing to the public/ subdirectory. Also verify that URL rewriting is active: on Nginx, confirm try_files $uri $uri/ /index.php?$query_string is in your server block. On Apache, confirm mod_rewrite is enabled and AllowOverride All is set for the public directory.
❌ PWA install prompt does not appear
PWA installation requires HTTPS. Ensure your site is served over https:// and your SSL certificate is valid (not self-signed). On HTTP, the browser will never show the install prompt regardless of the manifest.
Still stuck? Open a support ticket via the item page where you purchased, including: your PHP version (php -v), the exact error message, and which step of the installer failed.