Learning management system with a Laravel 12 backend and a Next.js 16 frontend.
- CPU: 2 cores minimum, 4 cores recommended
- RAM: 4 GB minimum, 8 GB recommended
- Disk: 5 GB free minimum, more if you store media files or large uploads
- PHP 8.3 or newer
- Composer 2
- Node.js 20 or newer
- pnpm
- MySQL or a compatible database server
- FFmpeg and ffprobe for subtitle and media processing
server/- Laravel API, queues, broadcasting, payments, and media processingfrontend/- Next.js application
-
Install backend dependencies.
cd server composer install -
Prepare the backend environment file.
copy .env.example .env php artisan key:generate
-
Configure the backend database and services in
server/.env.Common values used by this project include:
APP_URL=http://localhost:8003DB_CONNECTION=mysqlQUEUE_CONNECTION=databaseBROADCAST_CONNECTION=reverbREVERB_*for realtime broadcastingSTRIPE_*for paymentsFFMPEG_BINARIESandFFPROBE_BINARIESfor media processing
-
Run backend migrations.
php artisan migrate
-
Install frontend dependencies.
cd ../frontend pnpm install -
Create the frontend environment file if needed.
The frontend reads
NEXT_PUBLIC_API_URL. If it is not set, it defaults to:http://localhost:8003/api/v1
From server/:
php artisan serve --host=localhost --port=8003
php artisan queue:work --tries=3
php artisan reverb:startIf you use Stripe webhooks locally, run the Stripe CLI listener and forward it to:
http://localhost:8003/api/v1/stripe/webhook
From frontend/:
pnpm run devThe frontend runs on port 3003.
Recommended local services:
- Backend API:
http://localhost:8003 - Frontend:
http://localhost:3003 - Reverb:
http://localhost:8080
cd server
composer install
php artisan config:clearcd frontend
pnpm run build
pnpm run startcd server
php artisan testcd frontend
pnpm run lintIf subtitle or media processing fails with a missing binary error, install FFmpeg and set the binary paths in server/.env.
On Windows, you can install it with:
winget install Gyan.FFmpeg- Do not commit real API keys, Stripe secrets, or mail credentials.
- Keep the backend and frontend servers running together when you need realtime features.
- If you change frontend environment variables, restart the frontend dev server.