Deploys Laravel sem downtime — o pipeline de symlink atômico que mantém as filas honestas
20 de maio de 2026 · 1 min de leitura · por Sudhanshu K.
«Deploys Laravel sem downtime» raramente são. O release directory é construído do zero, o symlink é atualizado atomicamente — até aí tudo bem — mas os queue workers ainda apontam para o código antigo, e o OPcache no PHP-FPM em execução não foi resetado, então requisições após o swap do symlink podem executar uma mistura de caminhos de código antigos e novos por vários segundos.
Este é o pipeline de deploy que entregamos e que de fato deixa deploys chatos.
O release directory + symlink atômico
# /var/www/app/
# releases/
# 2026-05-20-123456/ ← novo release directory
# 2026-05-19-090000/ ← anterior, mantido para rollback
# current → releases/2026-05-20-123456 ← symlink atômico
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 é atômico em POSIX — o Nginx nunca vê um symlink meio atualizado. queue:restart diz aos workers para sair graciosamente após o job atual. systemctl reload php8.3-fpm reseta o OPcache sem derrubar conexões.
O artigo completo cobre:
- Pre-deploy
composer install— nunca no host vivo, sempre construído em outro lugar - A história de segurança de migrations: apenas mudanças de schema retro-compatíveis
- Handoff de queue workers — drenar os antigos, iniciar os novos, sem perda de job
- Timing do reset de OPcache em relação ao swap do symlink
- Rollback em 5 segundos: re-apontar o symlink para o release anterior
- O padrão do diretório
shared/(.env,storage/, uploads persistentes)
Entregamos este pipeline de deploy em cada cliente Laravel gerenciado.
Full article available
Read the full article