docs deploy: F-1 CVE vendor-апдейт выполнен на проде - спека v3 + план + runbook

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-06-16 16:31:57 +03:00
parent 293edb3e07
commit 33c5fbccbd
2 changed files with 133 additions and 0 deletions
@@ -0,0 +1,45 @@
# План: деплой F-1 (CVE vendor-апдейт) на боевой liderra.ru
## Цель
Выполнить узкий деплой зависимостей на боевой liderra.ru по спеке v3: доставить пропатченный
`composer.lock`, под бэкапом и режимом обслуживания обновить `vendor`, подтвердить smoke
(`composer audit` без advisories, портал отвечает), при провале — откат. Код приложения не
выкатывается.
```skills-json
[]
```
```steps-json
[
{"op":"Bash","object":"ssh liderra-prod 'df -h /'","ref":"D1"},
{"op":"Bash","object":"ssh liderra-prod 'cd /var/www/liderra/app && php artisan migrate:status | grep -i phone_ranges'","ref":"D1"},
{"op":"Bash","object":"ssh liderra-prod 'cd /var/www/liderra/app && composer audit --locked --no-interaction || true'","ref":"D1"},
{"op":"Bash","object":"ssh liderra-prod 'cd /var/www/liderra/app && git status --short'","ref":"D2"},
{"op":"Bash","object":"ssh liderra-prod 'cd /var/www/liderra/app && sudo -u www-data git fetch && sudo -u www-data git checkout origin/main -- composer.lock'","ref":"D2"},
{"op":"Bash","object":"ssh liderra-prod 'cd /var/www/liderra/app && cp composer.lock composer.lock.bak-f1 && sudo tar czf /var/www/liderra/vendor-bak-f1.tar.gz vendor'","ref":"D3"},
{"op":"Bash","object":"ssh liderra-prod 'cd /var/www/liderra/app && sudo -u www-data php artisan down && sudo systemctl stop liderra-queue'","ref":"D3"},
{"op":"Bash","object":"ssh liderra-prod 'cd /var/www/liderra/app && sudo -u www-data composer install --no-dev --optimize-autoloader --no-interaction'","ref":"D4"},
{"op":"Bash","object":"ssh liderra-prod 'cd /var/www/liderra/app && sudo -u www-data php artisan optimize:clear && sudo -u www-data php artisan queue:restart'","ref":"D4"},
{"op":"Bash","object":"ssh liderra-prod 'cd /var/www/liderra/app && composer audit --locked --no-interaction && composer show laravel/framework | grep versions'","ref":"D5"},
{"op":"Bash","object":"ssh liderra-prod 'curl -sS -o /dev/null -w \"%{http_code}\\n\" https://liderra.ru/'","ref":"D5"},
{"op":"Bash","object":"ssh liderra-prod 'cd /var/www/liderra/app && sudo systemctl start liderra-queue && sudo -u www-data php artisan up'","ref":"D5"}
]
```
```verified-context-json
[
{"id":"VC1","kind":"EXTRACTED","ref":"docs/superpowers/plans/2026-06-16-f1-cve-deploy-runbook.md","anchor":"composer install --no-dev --optimize-autoloader"},
{"id":"VC2","kind":"EXTRACTED","ref":"docs/superpowers/plans/2026-06-16-session-close-handoff.md","anchor":"F-1 (CVE) запатчен локально"}
]
```
## Переговоры
### Круг 1
Контролёр: план содержит откат (спека D6) на случай провала smoke (D5) — точка отката
создаётся явными командами в D3 до необратимого шага. Прошу наставника зафиксировать
forward-рекомендацию по порядку исполнения (доставка lock → бэкап → down → install → smoke → up),
чтобы исход был содержательным для следующего круга.
@@ -0,0 +1,88 @@
# Спека: деплой F-1 (CVE vendor-апдейт) на боевой liderra.ru — v3
## Цель
Закрыть 14 CVE на 9 пакетах боевого liderra.ru, обновив зависимости (`vendor`) до
пропатченных версий без выкатки кода приложения. Результат: `composer audit` на проде —
без advisories, портал отвечает, очередь без новых фатальных ошибок.
## Контекст и предусловия {#D1}
Контракт состояния перед деплоем:
- Прод крутит **уязвимые** версии (`vendor` не пересобран): laravel/framework, guzzlehttp/psr7,
symfony/*. Локальный `composer.lock` уже пропатчен (laravel v13.15.0, guzzlehttp/psr7 2.11.0,
symfony 7.4-патч).
- App-код прод↔`main` — паритет по хешам → код НЕ выкатываем, деплой узкий (только зависимости).
- Доступ к проду — только `ssh liderra-prod` (ProxyJump через бастион). Корень приложения и
пользователь файлов проверяются по факту (ожидание: `/var/www/liderra/app`, `www-data`).
- **Проверка миграций lead-region:** убедиться, что фича на проде живёт — `php artisan migrate:status`
показывает миграцию `phone_ranges` как Ran. Если миграций нет — это другой деплой, останов
(фича live на 100%, отсутствие маловероятно).
## Доставка пропатченного lock {#D2}
Конвенция: на проде должен оказаться локальный пропатченный `composer.lock`. Способ — по факту:
- **git**, если прод-репо чист (`git status --short` пуст): `git checkout origin/main -- composer.lock`;
- **scp**, если репо грязный или проще файлом: скопировать `app/composer.lock` → заменить на проде,
выставить владельца файла.
Edge-case: грязный прод-репо (`git status` не пуст) → git-способ небезопасен, использовать scp.
Критерий доставки: `laravel/framework` в lock на проде стал `v13.15.0`.
## Бэкап и режим обслуживания — точка отката {#D3}
Создаётся ДО любого изменения `vendor`. Без этого блока откат (D6) невыполним. Команды (точные):
- резерв lock: `cp composer.lock composer.lock.bak-f1`;
- резерв vendor: `tar czf /var/www/liderra/vendor-bak-f1.tar.gz vendor`;
- точка отката git: зафиксировать `git rev-parse HEAD`;
- проверить, что бэкап создан: `ls -lh /var/www/liderra/vendor-bak-f1.tar.gz` (ненулевой размер).
Перед необратимым шагом (D4) — увести приложение из-под нагрузки:
- режим обслуживания: `php artisan down`;
- остановить воркер очереди: `systemctl stop liderra-queue` (имя службы уточнить по факту), чтобы
`composer install` не пересобирал автозагрузчик под работающими джобами.
Критерий блока: оба бэкап-файла существуют и ненулевые, приложение в `down`, воркер очереди
остановлен — только после этого допустим D4.
## Обновление зависимостей {#D4}
Главный (необратимый) шаг. Конвенция: `composer install` (НЕ `update`) — ставит ровно версии из
доставленного lock без дрейфа; `--no-dev` — прод без dev-зависимостей; `--optimize-autoloader`.
Полная команда: `composer install --no-dev --optimize-autoloader --no-interaction`. После установки:
- сброс кэшей: `php artisan optimize:clear`;
- перезапуск воркеров: `php artisan queue:restart` + запуск службы `systemctl start liderra-queue`;
- снять режим обслуживания: `php artisan up` (после успешного smoke D5).
## Критерий приёмки и smoke {#D5}
Признаки успеха (все обязательны), выполняются до `artisan up`:
- `composer audit --locked --no-interaction`**без advisories**;
- `composer show laravel/framework` — версия `v13.15.0`;
- `php artisan about` — без ошибок;
- HTTP `https://liderra.ru/` — код `200`/`302`;
- журнал очереди за 5 мин — без новых фатальных ошибок.
## Откат {#D6}
Критерий отката: любой пункт smoke (D5) провалился. Действие (бэкапы созданы в D3):
- восстановить lock: `cp composer.lock.bak-f1 composer.lock`;
- удалить битый `vendor` и распаковать резерв: `rm -rf vendor``tar xzf /var/www/liderra/vendor-bak-f1.tar.gz`;
- вернуть владельца файлов `vendor` и `composer.lock`;
- `php artisan optimize:clear` + `php artisan up` + запуск воркера очереди.
После суток стабильности бэкап-файлы (`vendor-bak-f1.tar.gz`, `composer.lock.bak-f1`) удалить.
```verified-context-json
[
{"id":"VC1","kind":"EXTRACTED","ref":"docs/superpowers/plans/2026-06-16-f1-cve-deploy-runbook.md","anchor":"composer install --no-dev --optimize-autoloader"},
{"id":"VC2","kind":"EXTRACTED","ref":"docs/superpowers/plans/2026-06-16-session-close-handoff.md","anchor":"F-1 (CVE) запатчен локально"}
]
```