Files
portal/deploy/README.md
T
Дмитрий b808a24f78
Accessibility (Pa11y live) / a11y (push) Has been cancelled
deploy: выкат стека на прод 23.06 + фикс redeploy.sh composer-прав + снимок ПИЛОТ
Выкачен недеплоенный стек b11e1d97 балансовый блок плюс F/J плюс source-edit-lock
плюс ЮKassa спит флаг off. Миграция add_balance_transaction_id применена вручную
под postgres таблица crm_migrator-owned. Деньги клиента целы tenant 2
1836400 руб 1013 сделок эталон до==после. Квирк-107 ок очередь active HTTP 200.

Фикс redeploy.sh композер install от root COMPOSER_ALLOW_SUPERUSER плюс chown
vendor www-data баг положил прод в 500 на окно наката. README дополнен граблями
composer-прав opcache-рестарт и crm_migrator-миграций. Снимок ПИЛОТ обновлён.
cspell-words пополнен проектным жаргоном.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 19:50:40 +03:00

50 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# deploy/
Скрипты применения обновлений на боевом сервере liderra.ru.
## redeploy.sh
Server-side половина деплоя. На боевом лежит в `/var/www/liderra/redeploy.sh`
(вне репозитория Laravel). Здесь — каноническая копия для версионирования
и аудита.
**Workflow деплоя:**
1. **Локально** — собрать архив кода + Vite-сборку:
```bash
git archive HEAD app/ db/ | gzip > /tmp/deploy-code.tgz
tar czf /tmp/deploy-build.tgz -C app/public build/
```
2. **scp** обоих архивов на сервер.
3. **На сервере** — распаковать в `/var/www/liderra/app/`, выставить владельца
`www-data:www-data`, запустить `bash /var/www/liderra/redeploy.sh`.
**NB:** `redeploy.sh` НЕ делает `git pull` — он рассчитан на то, что код
уже залит scp. Если запустить без предварительного scp — будет no-op
(composer install / migrate / optimize / restart на той же кодовой базе).
**Квирк 107 (фикс встроен):** строка `sudo -u www-data php artisan optimize`
обязательна. Без неё `optimize` запускался от `ubuntu` → `bootstrap/cache/config.php`
с владельцем `ubuntu` → php-fpm (под `www-data`) не мог прочитать → 503 на всём
портале. Инцидент 24.05.2026 03:46 UTC, портал лежал 18 минут.
**Грабли composer-прав (фикс встроен, инцидент 23.06.2026):** `vendor/` принадлежит
`www-data`, а `redeploy.sh` бежит от `ubuntu`. Голый `composer install` падал
`autoload_classmap.php: Permission denied`, и из-за `set -e` скрипт рвался ДО `optimize`
и рестарта → новый код на диске, classmap новых классов НЕ пересобран → **прод 500**.
Фикс: `sudo env COMPOSER_ALLOW_SUPERUSER=1 composer install …` + `sudo chown -R www-data:www-data vendor`.
**Также:** при ручном восстановлении кэши надо пересобирать ДО рестарта php-fpm —
opcache держит старые до перезапуска (затяжной 500, пока fpm не рестартнут ПОСЛЕ кэшей).
**Грабли миграций crm_migrator (инцидент 19.06 + 23.06):** таблицы, принадлежащие
`crm_migrator` (напр. `saas_transactions`), штатной `.env`-ролью НЕ альтерятся
(`must be owner`). Применять миграцию ВРУЧНУЮ под `sudo -u postgres psql` ДО запуска
`redeploy.sh` + `INSERT INTO migrations (migration, batch) VALUES ('<имя_без_php>', <batch>)`.
Тогда `php artisan migrate --force` в скрипте = no-op. Иначе `set -e` порвёт деплой.
**Расхождение с боевым:** если правится этот файл — синкать на боевой
(scp + проверка хеша). Боевой = source of truth для исполнения, репо =
source of truth для рецепта.