adacto-company/laravel-docker-deploy
Deploy Laravel with a Docker Stack using an Artisan installer and environment generator. Installs required deployment files, helps manage multiple .env.* configs, and works alongside Laravel Sail for local development. Set APP_ENV per deployment environment.
Installation
composer require adacto-company/laravel-docker-deploy
Publish the config file:
php artisan vendor:publish --provider="Adacto\LaravelDockerDeploy\LaravelDockerDeployServiceProvider" --tag="config"
First Use Case: Basic Deployment
Add a deploy.php file in your project root (or configure in config/laravel-docker-deploy.php):
<?php
return [
'servers' => [
'production' => [
'host' => 'your-server.com',
'user' => 'deploy-user',
'port' => 22,
'repository' => 'git@github.com:your/repo.git',
'branch' => 'main',
'deploy_path' => '/var/www/your-app',
],
],
'shared_files' => ['.env'],
'shared_dirs' => ['storage'],
'writable_dirs' => ['bootstrap/cache', 'storage/framework'],
];
Run Deployment
php artisan docker:deploy production
config/laravel-docker-deploy.php (default settings, hooks, and server definitions).app/DeployHooks/ (custom logic for pre/post-deployment steps).Dockerfile is optimized for multi-stage builds if using Docker.CI/CD Pipeline Trigger deployments from GitHub Actions, GitLab CI, or Jenkins:
# Example GitHub Actions workflow
- name: Deploy to Production
run: php artisan docker:deploy production
env:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
Environment-Specific Configs Use environment variables or separate config files for different stages:
// config/laravel-docker-deploy.php
'servers' => env('DEPLOY_SERVERS', []),
Docker Compose Integration Extend the package to rebuild and restart containers post-deploy:
// In deploy.php or hooks
'post_deploy' => [
'docker-compose down',
'docker-compose up -d --build',
],
Zero-Downtime Deployments Use rolling updates with Docker:
'post_deploy' => [
'docker service update --force --image your-image:latest your-service',
],
shared_files and shared_dirs to persist .env, storage, or public/uploads.'post_deploy' => [
'php artisan migrate --force',
],
php artisan docker:deploy production --optimize --no-interaction
SSH Key Management
~/.ssh/id_rsa is added to deploy_keys in GitHub/GitLab or configured via SSH_AUTH_SOCK.SSH_PRIVATE_KEY env var or ~/.ssh/config:
Host your-server.com
IdentityFile ~/.ssh/deploy_key
IdentitiesOnly yes
Permission Issues
bootstrap/cache) may fail if permissions aren’t set.chmod in hooks:
'post_deploy' => [
'chmod -R 775 ' . config('laravel-docker-deploy.writable_dirs'),
],
Docker-Specific Quirks
docker group or use docker exec with sudo.deploy_path to match your Docker volume mount point.Hook Execution Order
pre_deploy, deploy, post_deploy, post_rollback.return false; in hooks to abort deployment.'debug' => true,
php artisan docker:deploy production --dry-run
/tmp/laravel-docker-deploy.log for errors.Custom Hooks
Create reusable hooks in app/DeployHooks/:
// app/DeployHooks/ExampleHook.php
namespace App\DeployHooks;
class ExampleHook {
public function handle() {
// Custom logic (e.g., purge cache)
\Artisan::call('cache:clear');
}
}
Register in config/laravel-docker-deploy.php:
'hooks' => [
'pre_deploy' => \App\DeployHooks\ExampleHook::class,
],
Event Listeners Listen to deployment events:
// app/Providers/EventServiceProvider.php
protected $listen = [
\Adacto\LaravelDockerDeploy\Events\DeploymentStarted::class => [
\App\Listeners\LogDeployment::class,
],
];
Docker Compose Templates
Use templates for dynamic docker-compose.yml generation:
'post_deploy' => [
'envsubst < docker-compose.template.yml > docker-compose.yml',
'docker-compose up -d',
],
How can I help you explore Laravel packages today?