From 33c5fbccbd3f724e12e0cbb50fad49e13e61dcd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Tue, 16 Jun 2026 16:31:57 +0300 Subject: [PATCH] =?UTF-8?q?docs=20deploy:=20F-1=20CVE=20vendor-=D0=B0?= =?UTF-8?q?=D0=BF=D0=B4=D0=B5=D0=B9=D1=82=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=20=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B4?= =?UTF-8?q?=D0=B5=20-=20=D1=81=D0=BF=D0=B5=D0=BA=D0=B0=20v3=20+=20=D0=BF?= =?UTF-8?q?=D0=BB=D0=B0=D0=BD=20+=20runbook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- .../plans/2026-06-16-f1-cve-deploy-plan.md | 45 ++++++++++ .../specs/2026-06-16-f1-cve-deploy-spec-v3.md | 88 +++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 docs/superpowers/plans/2026-06-16-f1-cve-deploy-plan.md create mode 100644 docs/superpowers/specs/2026-06-16-f1-cve-deploy-spec-v3.md diff --git a/docs/superpowers/plans/2026-06-16-f1-cve-deploy-plan.md b/docs/superpowers/plans/2026-06-16-f1-cve-deploy-plan.md new file mode 100644 index 00000000..be235766 --- /dev/null +++ b/docs/superpowers/plans/2026-06-16-f1-cve-deploy-plan.md @@ -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), +чтобы исход был содержательным для следующего круга. diff --git a/docs/superpowers/specs/2026-06-16-f1-cve-deploy-spec-v3.md b/docs/superpowers/specs/2026-06-16-f1-cve-deploy-spec-v3.md new file mode 100644 index 00000000..7b63c6ab --- /dev/null +++ b/docs/superpowers/specs/2026-06-16-f1-cve-deploy-spec-v3.md @@ -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) запатчен локально"} +] +```