laravel-github-deployer maintained by nassirian
Laravel GitHub Deployer
Simple and flexible Laravel package to automate deployments using GitHub Webhooks.
This package supports both:
- 🔁 Synchronous deployments (runs directly on the server)
- 🧵 Queue-based deployments (offloaded to dedicated queue workers — e.g., Docker container or remote worker)
✅ Features
- Git pull
- Composer install
- Docker container restart
- Laravel migrations, route/config caching
- Dedicated
deployqueue support - Secure signature verification from GitHub
📦 Installation
composer require nassirian/laravel-github-deployer
⚙️ Configuration (Optional)
Publish the config file to customize deployment behavior:
php artisan vendor:publish --tag=config
This creates: config/github-deployer.php
return [
// 'sync' will run directly on server, 'queue' will dispatch a job to deploy queue
'mode' => env('DEPLOY_MODE', 'queue'),
// Deploy queue name for queue-based mode
'queue_name' => env('DEPLOY_QUEUE', 'deploy'),
// Optional job middleware (e.g., throttle or queue isolation)
'middleware' => [
\Nassirian\GitHubDeployer\Middleware\EnsureDeployQueue::class,
],
// Commands to run before deploy
'pre_deploy_commands' => [],
// Main deploy commands
'deploy_commands' => [
'git pull origin main',
'composer install --no-interaction --prefer-dist --optimize-autoloader',
'docker-compose pull',
'docker-compose up -d',
],
// Post-deploy artisan commands
'post_deploy_commands' => [
'php artisan migrate --force',
'php artisan config:cache',
'php artisan route:cache',
],
// Optional throttle behavior for wrong queue workers
'deploy_release_throttle' => [
'base_delay' => 5,
'max_attempts' => 5,
],
];
📡 GitHub Webhook Setup
- Expose your webhook route
Laravel will respond to:
POST /github/webhook
-
Add Webhook in GitHub:
- Go to Repo Settings → Webhooks → Add Webhook
- Payload URL:
https://your-domain.com/github/webhook - Content type:
application/json - Secret:
your-random-string - Events: ✅ Push event only
-
Set secret in
.env:
GITHUB_WEBHOOK_SECRET=your-random-string
⚙️ Sync vs Queue Mode
| Mode | Description |
|---|---|
sync |
Runs deployment commands immediately in the HTTP request (for small projects or simple VPS) |
queue |
Dispatches a background job to the deploy queue (best for Docker, Horizon, supervisors) |
Set this in your .env:
DEPLOY_MODE=queue
DEPLOY_QUEUE=deploy
Then, in supervisord or Docker, run:
php artisan queue:work --queue=deploy
✅ How It Works
- GitHub sends a webhook →
/github/webhook - Laravel verifies the HMAC signature
- Based on config mode:
sync: Runs the deploy shell commands right awayqueue: Dispatches a background job to thedeployqueue
- Commands are run in 3 phases:
pre_deploy_commandsdeploy_commandspost_deploy_commands
📚 Tips & Extensions
- Need
npm run build? Add it todeploy_commands - Want zero-downtime? Use
php artisan down/upinpre/post - Using Horizon? Just isolate
deployworkers separately
🔐 Security
- Verifies GitHub
X-Hub-Signature-256 - Jobs can self-check queue name (
EnsureDeployQueue) - Workers on wrong queues will back off with throttling
📋 Requirements
- PHP 8.1+
- Laravel 9.x → 12.x
- GitHub webhook support
- Docker (optional)
- Supervisor or Horizon (for queue mode)
💼 License
This package is open-sourced under the MIT license.
✨ Deployment Flow Example
GitHub Push →
Webhook triggered →
Dispatch Job →
Run:
git pull
composer install
docker-compose pull
docker-compose up -d
php artisan migrate
php artisan config:cache
php artisan route:cache
Fully automated. No manual SSH. No downtime.
🔥 Your deployments are now modern and effortless.