Деплой и миграции на продакшене
Порядок деплоя
- Забрать код из репозитория
- Установить зависимости:
composer install --no-dev --optimize-autoloader - Применить миграции:
php artisan migrate --force - Запустить сидеры, если нужно:
php artisan db:seed --class=ProdSeeder --force - Очистить кеш:
php artisan optimize:clear - Пересобрать кеш:
php artisan optimize - Перезапустить очередь:
php artisan queue:restart
Флаг --force
В продакшене команда migrate требует подтверждения. Флаг --force обходит его. Это защита от случайного запуска на боевой БД.
php artisan migrate --force
Безопасные миграции
На продакшене нельзя ломать работающее приложение. Правила:
- Добавление колонки — безопасно, если она nullable или с default
- Удаление колонки — опасно: сначала перестань её использовать, потом удали отдельной миграцией через несколько релизов
- Переименование — опасно: сначала добавь новую, заполни, переключись, удали старую
- Изменение типа — может блокировать таблицу
- Добавление NOT NULL без default — упадёт на существующих строках
Пример безопасного переименования
Релиз 1. Добавить новую колонку:
$table->string('full_name')->nullable()->after('name');
Релиз 2. Заполнить данными:
DB::table('users')->update(['full_name' => DB::raw('name')]);
Релиз 3. Переключить код на новую колонку, удалить старую:
$table->dropColumn('name');
Откат
Если миграция сломала продакшен:
php artisan migrate:rollback --step=1 --force
Но помни: down может не восстановить данные. Поэтому важны бэкапы.
Бэкапы
Перед миграцией на продакшене всегда делай бэкап:
pg_dump -U roman skills_db > backup_$(date +%Y%m%d).sql
Мониторинг
Логируй миграции. Если что-то упало — должно быть видно в логах и мониторинге.
Zero-downtime
Для больших проектов используют подход с постепенным развёртыванием: сначала применяются безопасные миграции, потом обновляется код, потом удаляются старые колонки. Это позволяет не останавливать сервис.