Installation & Documentation

Deploy LimoSchedule With Confidence

Everything you need to install, configure, deploy, update and maintain your LimoSchedule booking platform on a production server.

PHP 8.2+ Laravel 12 MySQL / MariaDB Composer 2.x Node.js + npm
Production Ready
Application LimoSchedule
Architecture Laravel + Blade
Database MySQL / MariaDB
Assets Vite / Tailwind

Installation at a Glance

Most installations can be completed using the included Composer setup command.

01 Server Requirements
02 Upload Source Code
03 Configure Database
04 Configure Environment
05 Run Migrations & Seeders
06 Build Assets
07 Configure Web Server
08 Enable Integrations
09 Run Production Checks
10 Go Live
bash
composer setup
Requirements

System Requirements

Prepare your server with the following requirements before installation.

PHP
8.2+
Database
MySQL / MariaDB
Composer
2.x
Web Server
Apache / Nginx

Developed and tested against PHP 8.2.12. Node.js + npm is required for frontend asset compilation only.

Required PHP Extensions

gd pdo_mysql mbstring openssl tokenizer xml ctype json bcmath fileinfo
Document Root: /public
HTTPS required for browser push notifications in production.
Node.js/npm is required to build frontend assets. It is not required at runtime once public/build/ exists on the server. MySQL/MariaDB only — no SQLite/Postgres installation path is configured.
Installation

Fresh Installation

Step-by-step installation for a fresh server.

1

Obtain the Source Code

Clone the repository, or extract the delivered source archive.

bash
git clone <repository>
cd limoschedule_software
2

Install Composer Dependencies

bash
composer install
3

Create Environment File

bash
cp .env.example .env
4

Generate Application Key

bash
php artisan key:generate
5

Create Database

LimoSchedule uses Laravel migrations exclusively — there is no SQL dump to import.

bash
mysql -u root -p -e "CREATE DATABASE limoschedule CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
6

Configure Database

Add your DB credentials to .env.

env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=
7

Run Migrations

bash
php artisan migrate
8

Seed Demo / Initial Data

bash
php artisan db:seed

Strongly recommended — creates site settings, languages, translations, currencies, payment gateway rows, notification settings, vehicle categories, pricing rules, popular routes, coupons, promotions, vehicles, drivers, CMS pages, blog content, locations, roles, permissions, the first admin, and demo customers/bookings.

composer setup does NOT run php artisan db:seed.
9

Install Frontend Dependencies

bash
npm install
10

Build Production Assets

bash
npm run build

Production assets are compiled into public/build/.

Prefer a One-Command Setup?

Recommended

The project includes a Composer convenience script that automates the primary installation steps.

bash
composer setup
composer install
cp .env.example .env
key:generate
migrate --force
npm install
npm run build
composer setup does NOT run php artisan db:seed.
Database

Database Installation

LimoSchedule uses Laravel migrations exclusively. There is no SQL dump that needs to be imported.

Create Database
Configure DB_* Variables
Run Migrations
Run Seeders
Database Ready
bash
php artisan migrate
php artisan db:seed

Run a Specific Seeder

bash
php artisan db:seed --class=VehicleCategorySeeder
Environment

Configure Your Environment

env
APP_NAME="Your Company"
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=https://yourdomain.com

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=

SESSION_DRIVER=database
CACHE_STORE=database
QUEUE_CONNECTION=sync

MAIL_MAILER=log
MAIL_HOST=
MAIL_PORT=
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_FROM_ADDRESS=
MAIL_FROM_NAME="${APP_NAME}"

GOOGLE_MAPS_API_KEY=

VAPID_PUBLIC_KEY=
VAPID_PRIVATE_KEY=
VAPID_SUBJECT=mailto:admin@yourdomain.com
Day-to-day business configuration — company information, logo, SEO defaults, Stripe/PayPal credentials, tax rate, business hours and social links — is database-backed and managed through the Admin Panel rather than requiring .env edits.
Storage

Configure File Uploads

Laravel storage:link is NOT required. Uploads are written directly into public/uploads/ using the application's own upload implementation, bypassing Laravel's storage symlink pattern entirely.
text
public/uploads/

Upload Categories

Settings Logos
Favicons
Page Images
Vehicle Photos
Blog Images
Push Sound Files
Database Backups
Ensure public/uploads/ is writable by the web server user.
Permissions

Set Production Permissions

bash
chmod -R 775 storage bootstrap/cache

public/uploads/ must also be writable by the web server user.

text
LimoSchedule
├── public/
│   └── uploads/
├── storage/
└── bootstrap/
    └── cache/
Web Server

Configure Apache or Nginx

Document root must point to /public — never the project root.

Nginx

nginx
server {
    listen 80;
    server_name yourdomain.com;
    root /var/www/limoschedule_software/public;

    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

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

Apache

The project's public/.htaccess (Laravel's default) handles URL rewriting as long as mod_rewrite is enabled and AllowOverride All is set for the /public directory.

HTTPS

Enable HTTPS Before Production

Required For

  • Browser push notifications
  • Production Stripe / PayPal checkout

Strongly Recommended For

  • Login pages
  • Customer, driver & admin panels
  • Pages handling personal data
Browser push registration works over HTTPS or localhost. Production deployments should use HTTPS.
Queues & Cron

Choose Your Queue Strategy

Sync

Default
env
QUEUE_CONNECTION=sync

Push notifications execute inline during the request. No worker process required. Best for small deployments and simple setup.

Database

Optional
env
QUEUE_CONNECTION=database
bash
php artisan queue:table
php artisan queue:work --tries=3

queue:table is only needed if the jobs table isn't already migrated.

Supervisor Example

ini
[program:limoschedule-worker]
command=php /var/www/limoschedule_software/artisan queue:work --tries=3 --timeout=90
autostart=true
autorestart=true
user=www-data
numprocs=1

Use Supervisor or systemd to keep the worker running automatically.

No Cron Jobs Required. The current codebase does not implement scheduled tasks — no schedule:run, no cron entry, and no cron-dependent functionality exists.
Email

Configure Email Delivery

Framework Fallback.env MAIL_* variables.
Admin ConfigurationAdmin → Settings → Email Settings (database-backed SMTP).
MAIL_MAILER=log is suitable for local development/testing only — it does NOT deliver real emails. Configure real SMTP credentials for production.
Payments

Configure Stripe & PayPal

Stripe

Publishable Key
Secret Key
Sandbox / Live
Enable / Disable

Admin → Settings → Payment Gateways

PayPal

Client ID
Client Secret
Sandbox / Live
Enable / Disable

Admin → Settings → Payment Gateways

Booking
Payment Required
Selected Gateway
Payment Confirmation
Booking Confirmation
A gateway only becomes ready when its active-mode credentials are configured and the gateway is enabled. No .env editing needed — both gateways are configured entirely from the Admin Panel.
Google Maps

Configure Google Maps Services

Required APIs

Geocoding API Distance Matrix API Maps JavaScript API Places API
Google Cloud Console
Enable APIs
Create API Key
Restrict by Referrer
Add Key
Test Connection

Configure via .env (GOOGLE_MAPS_API_KEY) or Admin → System Tools → Integrations.

The Test Connection button returns Google's actual error — invalid key, restricted key, API not enabled, over quota, or a billing issue.
Push Notifications

Enable Browser Push Notifications

LimoSchedule uses VAPID-based browser Web Push.

Generate VAPID Keys

bash
php -r "require 'vendor/autoload.php'; print_r(Minishlink\WebPush\VAPID::createVapidKeys());"
env
VAPID_PUBLIC_KEY=<publicKey>
VAPID_PRIVATE_KEY=<privateKey>
VAPID_SUBJECT=mailto:admin@yourdomain.com

Then, as an admin, visit Admin → Settings → Notifications, enable Enable Browser Push Notifications, turn on the roles/events you want, and use Send Test to verify delivery.

Admin Customer Driver
Windows Development Note: if VAPID signing produces an OpenSSL "configuration file routines::no such file" error, set WEBPUSH_OPENSSL_CONF in .env to the full path of a valid openssl.cnf on that machine. Not a production Linux issue.
Admin & Accounts

Create Your First Admin

bash
php artisan db:seed --class=AdminSeeder
Change Immediately: the seeder creates a default admin login (Super Admin role). Change this password immediately after first login via Admin → Profile.

Additional admins are managed from Admin → Settings → Roles & Permissions → Admins, each with their own email/password and a chosen role's permission set.

Account Setup

Customer

  • Self-register via /register
  • Created by an admin directly
  • Guest booking with no account

A guest booking resolves/creates a Customer record from contact details.

Driver

  • Do NOT self-register
  • Created by Admin only
  • Log in at /driver/login

There is no public driver sign-up form.

Production Deployment

Production Deployment

Source
Environment
Database
Dependencies
Assets
Web Server
HTTPS
Integrations
Testing
Go Live
bash
php artisan migrate --force

php artisan config:cache
php artisan route:cache
php artisan view:cache
bash
npm run build

public/build/ must be deployed after the asset build.

Pre-Launch Checklist

APP_ENV=production
APP_DEBUG=false
Real APP_URL configured
Production database configured
Database migrations completed
Config/route/view caches generated
public/build/ deployed
HTTPS enabled
SMTP tested
Stripe/PayPal live credentials configured
Real payment tested
Google Maps connection tested
Google billing enabled
VAPID keys configured
Browser push tested
storage/ writable
bootstrap/cache writable
public/uploads/ writable
.env protected (not web-accessible)
First admin password changed
Full booking workflow tested

Test the Complete Booking Workflow

Guest Booking
Payment
Admin Confirmation
Driver Assignment
Driver Start
Driver Completion
Customer Invoice / PDF

Run this workflow before launching the production system.

Troubleshooting

Troubleshooting

500 Error / Blank Page

Likely Cause

Uncaught application error.

Solution

Temporarily enable APP_DEBUG=true (development/staging only) and check storage/logs/laravel.log, or use Admin → System Tools → Error Logs.

Missing APP_KEY

Likely Cause

Application key not generated.

Solution

Run php artisan key:generate.

Database Connection Error

Likely Cause

Incorrect DB credentials or unreachable server.

Solution

Check DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD; confirm database connectivity and permissions.

Composer / PHP Version Error

Likely Cause

Composer using an older PHP CLI version.

Solution

Run php -v and confirm Composer is using PHP 8.2+.

npm Build Error

Likely Cause

Node.js issue or dependency mismatch.

Solution

Confirm Node.js is installed, then run npm install and npm run build. Remove node_modules and retry if a lockfile mismatch is suspected.

Uploaded Images 404

Likely Cause

Missing or non-writable uploads directory.

Solution

This project does not use storage:link — check that public/uploads/ exists and is writable, not that a symlink is missing.

Email Not Sending

Likely Cause

MAIL_MAILER still set to log.

Solution

Mail is written to Laravel logs instead of being delivered. Configure real SMTP through Admin → Email Settings.

Payments Not Working

Likely Cause

Gateway disabled or mode mismatch.

Solution

Confirm the gateway is enabled, the correct Sandbox/Live mode is selected, credentials match, and run an end-to-end test.

Google Maps Not Working

Likely Cause

Invalid key, restrictions, quota, or billing.

Solution

Use Admin → System Tools → Integrations → Test Connection to see the exact API restriction, quota, or billing error.

Push Notifications Not Arriving

Likely Cause

HTTPS, VAPID keys, or toggle configuration.

Solution

Check HTTPS, VAPID keys, the master notification switch, role/event switches, browser permission, and use Send Test.

Queue Not Running

Likely Cause

sync vs database queue confusion.

Solution

If QUEUE_CONNECTION=sync, there is no worker to run — jobs execute inline. If database, ensure php artisan queue:work --tries=3 is running.

Cron Not Running

Likely Cause

No cron-dependent functionality exists.

Solution

No scheduled tasks are implemented in the current codebase, so there is no application cron to troubleshoot.

Updating

How to Update the Application

1

Back Up

Back up the database and public/uploads/.

2

Apply New Source Code

Pull or apply the new source code, preserving .env and public/uploads/.

3

Install Dependencies

bash
composer install --no-dev --optimize-autoloader
4

Run Migrations

bash
php artisan migrate --force
5

Build Assets

bash
npm install
npm run build
6

Rebuild Caches

bash
php artisan config:cache
php artisan route:cache
php artisan view:cache
7

Restart Queue Workers

If using queue workers:

bash
php artisan queue:restart
Admin → System Tools also exposes Run Migrations and Composer Update for environments without SSH access. Use these carefully in production. There is no built-in "check for updates" or auto-updater — updates are performed manually.
Backups & Notes

Backup Strategy

Database

Admin → System Tools → Backup generates a downloadable SQL dump via a custom exporter.

Manual / On-Demand Not Cron-Scheduled

Uploaded Files

Back up public/uploads/ separately — it is not part of the database backup. Also back up .env, which holds critical configuration and secrets.

Restoring or dropping database tables is destructive. There is no undo.

Important Production Notes

No storage:linkNot required by this implementation.
No CronNo scheduled tasks currently implemented.
No Runtime Vite ServerProduction uses pre-built assets.
HTTPS Required for PushBrowser push requires HTTPS outside localhost.
Manual BackupsThe application's backup tool is not automatically scheduled.
No Auto-UpdaterUpdates are performed manually.

Installation Questions

Do I need a Google Maps API key to use LimoSchedule?

Yes. LimoSchedule uses Google Maps services, which requires creating a Google Cloud Console API key, enabling the required APIs, and restricting the key by referrer before adding it to your installation.

Do browser push notifications require special server setup?

HTTPS is required in production. Beyond that, push notifications execute inline with each request — there's no separate worker process to run, which keeps setup simple for small deployments.

What if I run into a problem during installation?

The installation guide includes a dedicated Troubleshooting section covering common setup issues, so you can diagnose and resolve problems without leaving the documentation.

Ready to Put LimoSchedule Into Production?

Follow the installation guide, configure your integrations, complete the production checklist and launch your own limo booking platform.

Talk to us — Instant reply