The 10 PM Deployment Rule
tail -50 storage/logs/laravel.log | grep -E "\[[0-9]4-[0-9]2-[0-9]2.*\].*ERROR" Or use Log::error() yourself next time with a unique marker like 🚨 DEPLOY . You set QUEUE_CONNECTION=database in .env . But config/queue.php says redis because someone committed it.
Use php artisan octane:start or sail up -d with APP_ENV=local but CACHE_DRIVER=redis and QUEUE_CONNECTION=database . Simulate production locally, or the Laravel gods will simulate failure for you at 2 AM. the laravel survival guide
Add this temporarily to AppServiceProvider@boot :
It’s 9:58 PM. You just pushed what you thought was a tiny hotfix: “Update user avatar validation.” The 10 PM Deployment Rule tail -50 storage/logs/laravel
Three minutes later, your phone buzzes. Then again. Then the Slack channel erupts. “500 error on profile uploads.” “Jobs stuck in failed table.” “Why is S3 returning AccessDenied?” Welcome to Laravel after dark. Here’s your survival guide for this exact moment. Don’t open the controller. Don’t blame Redis.
php artisan config:clear php artisan config:cache php artisan queue:restart Then verify: php artisan tinker --execute="dd(config('queue.default'));" Check your Eloquent::saving() event listeners. Check your observers. One of them is returning false — which cancels the save silently. Use php artisan octane:start or sail up -d
Now go fix that avatar upload. And next time? Deploy at 11 AM on Tuesday.
The 10 PM Deployment Rule
tail -50 storage/logs/laravel.log | grep -E "\[[0-9]4-[0-9]2-[0-9]2.*\].*ERROR" Or use Log::error() yourself next time with a unique marker like 🚨 DEPLOY . You set QUEUE_CONNECTION=database in .env . But config/queue.php says redis because someone committed it.
Use php artisan octane:start or sail up -d with APP_ENV=local but CACHE_DRIVER=redis and QUEUE_CONNECTION=database . Simulate production locally, or the Laravel gods will simulate failure for you at 2 AM.
Add this temporarily to AppServiceProvider@boot :
It’s 9:58 PM. You just pushed what you thought was a tiny hotfix: “Update user avatar validation.”
Three minutes later, your phone buzzes. Then again. Then the Slack channel erupts. “500 error on profile uploads.” “Jobs stuck in failed table.” “Why is S3 returning AccessDenied?” Welcome to Laravel after dark. Here’s your survival guide for this exact moment. Don’t open the controller. Don’t blame Redis.
php artisan config:clear php artisan config:cache php artisan queue:restart Then verify: php artisan tinker --execute="dd(config('queue.default'));" Check your Eloquent::saving() event listeners. Check your observers. One of them is returning false — which cancels the save silently.
Now go fix that avatar upload. And next time? Deploy at 11 AM on Tuesday.