Deploy LimoSchedule With Confidence
Everything you need to install, configure, deploy, update and maintain your LimoSchedule booking platform on a production server.
Installation at a Glance
Most installations can be completed using the included Composer setup command.
composer setup
System Requirements
Prepare your server with the following requirements before installation.
Developed and tested against PHP 8.2.12. Node.js + npm is required for frontend asset compilation only.
Required PHP Extensions
Fresh Installation
Step-by-step installation for a fresh server.
Obtain the Source Code
Clone the repository, or extract the delivered source archive.
git clone <repository> cd limoschedule_software
Install Composer Dependencies
composer install
Create Environment File
cp .env.example .env
Generate Application Key
php artisan key:generate
Create Database
LimoSchedule uses Laravel migrations exclusively — there is no SQL dump to import.
mysql -u root -p -e "CREATE DATABASE limoschedule CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
Configure Database
Add your DB credentials to .env.
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE= DB_USERNAME= DB_PASSWORD=
Run Migrations
php artisan migrate
Seed Demo / Initial Data
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.
Install Frontend Dependencies
npm install
Build Production Assets
npm run build
Production assets are compiled into public/build/.
Prefer a One-Command Setup?
RecommendedThe project includes a Composer convenience script that automates the primary installation steps.
composer setup
Database Installation
LimoSchedule uses Laravel migrations exclusively. There is no SQL dump that needs to be imported.
php artisan migrate php artisan db:seed
Run a Specific Seeder
php artisan db:seed --class=VehicleCategorySeeder
Configure Your Environment
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
Configure File Uploads
public/uploads/
Upload Categories
Set Production Permissions
chmod -R 775 storage bootstrap/cache
public/uploads/ must also be writable by the web server user.
LimoSchedule
├── public/
│ └── uploads/
├── storage/
└── bootstrap/
└── cache/
Configure Apache or 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.
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
Choose Your Queue Strategy
Sync
DefaultQUEUE_CONNECTION=sync
Push notifications execute inline during the request. No worker process required. Best for small deployments and simple setup.
Database
OptionalQUEUE_CONNECTION=database
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
[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.
Configure Email Delivery
Configure Stripe & PayPal
Stripe
Admin → Settings → Payment Gateways
PayPal
Admin → Settings → Payment Gateways
Configure Google Maps Services
Required APIs
Configure via .env (GOOGLE_MAPS_API_KEY) or Admin → System Tools → Integrations.
Enable Browser Push Notifications
LimoSchedule uses VAPID-based browser Web Push.
Generate VAPID Keys
php -r "require 'vendor/autoload.php'; print_r(Minishlink\WebPush\VAPID::createVapidKeys());"
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.
Create Your First Admin
php artisan db:seed --class=AdminSeeder
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
php artisan migrate --force php artisan config:cache php artisan route:cache php artisan view:cache
npm run build
public/build/ must be deployed after the asset build.
Pre-Launch Checklist
Test the Complete Booking Workflow
Run this workflow before launching the production system.
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.
How to Update the Application
Back Up
Back up the database and public/uploads/.
Apply New Source Code
Pull or apply the new source code, preserving .env and public/uploads/.
Install Dependencies
composer install --no-dev --optimize-autoloader
Run Migrations
php artisan migrate --force
Build Assets
npm install npm run build
Rebuild Caches
php artisan config:cache php artisan route:cache php artisan view:cache
Restart Queue Workers
If using queue workers:
php artisan queue:restart
Backup Strategy
Database
Admin → System Tools → Backup generates a downloadable SQL dump via a custom exporter.
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.
Important Production Notes
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.