Zero-Downtime-Laravel-Deploys — die Atomic-Symlink-Pipeline, die Queues ehrlich hält
20. Mai 2026 · 1 Min. Lesezeit · von Sudhanshu K.
„Zero-Downtime-Laravel-Deploys" sind es selten. Das Release-Verzeichnis wird frisch gebaut, der Symlink wird atomar aktualisiert — soweit so gut — aber die Queue-Worker zeigen noch auf den alten Code, und OPcache auf dem laufenden PHP-FPM wurde nicht zurückgesetzt, also können Requests nach dem Symlink-Swap mehrere Sekunden lang einen Mix aus alten und neuen Code-Pfaden ausführen.
Dies ist die Deploy-Pipeline, die wir ausliefern und die Deploys tatsächlich langweilig hält.
Das Release-Verzeichnis + atomarer Symlink
# /var/www/app/
# releases/
# 2026-05-20-123456/ ← neues Release-Verzeichnis
# 2026-05-19-090000/ ← vorheriges, für Rollback behalten
# current → releases/2026-05-20-123456 ← atomarer Symlink
cd /var/www/app/releases
git clone --depth 1 git@github.com:org/app.git 2026-05-20-123456
cd 2026-05-20-123456
composer install --no-dev --optimize-autoloader
ln -s /var/www/app/shared/.env .env
ln -s /var/www/app/shared/storage storage
php artisan migrate --force --no-interaction
php artisan event:cache
php artisan route:cache
php artisan view:cache
ln -nfs /var/www/app/releases/2026-05-20-123456 /var/www/app/current
php artisan queue:restart
sudo systemctl reload php8.3-fpmln -nfs ist auf POSIX atomar — Nginx sieht nie einen halb aktualisierten Symlink. queue:restart weist Worker an, nach ihrem aktuellen Job graceful auszusteigen. systemctl reload php8.3-fpm setzt OPcache zurück, ohne Verbindungen zu droppen.
Der vollständige Beitrag behandelt:
- Pre-Deploy-
composer install— niemals auf dem Live-Host, immer woanders gebaut - Die Migrations-Sicherheits-Story: nur rückwärtskompatible Schema-Änderungen
- Queue-Worker-Handoff — alte drainen, neue starten, kein Job-Verlust
- OPcache-Reset-Timing relativ zum Symlink-Swap
- Rollback in 5 Sekunden: Symlink zurück auf vorheriges Release zeigen
- Das
shared/-Verzeichnis-Pattern (.env,storage/, persistente Uploads)
Wir liefern diese Deploy-Pipeline auf jedem gemanagten Laravel-Kunden aus.
Vollständiger Artikel verfügbar
Vollständigen Artikel lesen