Урок 12

Деплой и миграции на продакшене

Порядок деплоя

  1. Забрать код из репозитория
  2. Установить зависимости: composer install --no-dev --optimize-autoloader
  3. Применить миграции: php artisan migrate --force
  4. Запустить сидеры, если нужно: php artisan db:seed --class=ProdSeeder --force
  5. Очистить кеш: php artisan optimize:clear
  6. Пересобрать кеш: php artisan optimize
  7. Перезапустить очередь: 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

Для больших проектов используют подход с постепенным развёртыванием: сначала применяются безопасные миграции, потом обновляется код, потом удаляются старые колонки. Это позволяет не останавливать сервис.