Правки прямо в production-каталоге затрудняют повторяемость и откат. Простая release-схема готовит новую версию отдельно, а затем одним атомарным переключением меняет symlink current.
Структура
/var/www/app/
current -> releases/20260808-120000
releases/
shared/.env
shared/uploads/
Новый release клонируется или распаковывается в новый каталог. Подключите shared-файлы, выполните composer install --no-dev --classmap-authoritative, сборку frontend и read-only проверки. Только после успеха:
ln -sfn /var/www/app/releases/20260808-120000 /var/www/app/current.next
mv -Tf /var/www/app/current.next /var/www/app/current
systemctl reload php8.4-fpm
На одной файловой системе mv переключает ссылку атомарно. Web root всегда указывает на current/public.
База данных
Миграции должны быть обратно совместимы с предыдущим release: сначала добавление нового, потом код, позже удаление старого. Откат symlink не откатывает схему автоматически. Перед опасной миграцией нужна отдельная копия и проверенный план.
Храните несколько последних release и удаляйте старые только после мониторинга. Не переносите .git, секреты и пользовательские uploads внутрь одноразового каталога.
Официальные источники