Pular para o conteúdo
EdgeServers
Blog

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-fpm

ln -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