From 6e31cf9e39ffdf13dff53dcfaa6dd1f7dbb81863 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: Wed, 29 Jul 2026 18:00:33 +0300 Subject: [PATCH] =?UTF-8?q?docs(=D0=BF=D0=B8=D0=BB=D0=BE=D1=82):=20=D1=82?= =?UTF-8?q?=D0=BE=D1=87=D0=B5=D1=87=D0=BD=D1=8B=D0=B9=20=D0=B2=D1=8B=D0=BA?= =?UTF-8?q?=D0=B0=D1=82=20=D1=81=D0=BD=D0=B5=D1=81=D0=BB=D0=BE=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D0=BD=D1=8B=D0=BC=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B7?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B2=D0=BE=D0=BC=20=E2=80=94=20=D1=85=D1=80?= =?UTF-8?q?=D0=BE=D0=BD=D0=BE=D0=BB=D0=BE=D0=B3=D0=B8=D1=8F,=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B2=D1=82=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=20=D1=83=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D0=B0,=20=D1=81=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BA=D0=B0=20=D0=B1=D0=B0=D0=B9=D1=82=20=D0=B2=20?= =?UTF-8?q?=D0=B1=D0=B0=D0=B9=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Дополняет запись о выкате 29.07 фактами, вскрывшимися при сверке прода с git: - первый выкат (14:07) молча снесён полным overlay-перезаливом параллельной сессии; правка прожила ~30 мин, пятёрка проектов снова врала; ошибок в журнале при этом не было — нашлось только побайтовой сверкой; - 🪤 overlay сохраняет время из архива, поэтому все файлы получили метку 14:04:15 и по stat порядок событий определить нельзя; - повторная установка (14:37) — содержимое берётся прямо из git через git cat-file, отпечатки сверены на проде до установки, права root:root 664 как у соседей; - 🔑 класс: полный перезалив молча откатывает всё, что выкачено точечно и не влито в main; защита — вливать в main сразу; - сверка прод ↔ git: 2401 из 2401 байт в байт; перечислено лишнее на проде (build.prev, два .bak, 7 тестов, которых в main нет) — дрейф overlay; - телеграм-модуль оказался на бою вместе с перезаливом: 6 таблиц, 14 миграций партией 48; первая попытка миграций упала на правах (не crm_migrator), переделана верно. Шапка записи обновлена: ветка влита в main = 27aa6342. Co-Authored-By: Claude Opus 5 (1M context) --- ПИЛОТ.md | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 4 deletions(-) diff --git a/ПИЛОТ.md b/ПИЛОТ.md index 504ba681..4e46e7be 100644 --- a/ПИЛОТ.md +++ b/ПИЛОТ.md @@ -19,10 +19,13 @@ ## 🆕 ОБНОВЛЕНИЕ 29.07.2026 (вечер) — статус проекта врал клиенту «Готовим к запуску» при живом заказе **Выкачены ДВА backend-файла** — `app/Models/Project.php` и `Api/ProjectController.php` -(коммит `f01f9fa2`, ветка `fix/project-sync-status-pivot` от боевого `gitea/main`; **в `main` -не влито**). Предполёт делал контроллер сам (не через `prod-deploy-validator`): портал 200, -файл на проде сверен как дореформенный, копии старых — `/tmp/Project.php.bak-20260729` и -`/tmp/ProjectController.php.bak-20260729`. +(коммит `f01f9fa2`, ветка `fix/project-sync-status-pivot` от боевого `gitea/main`). +**Влито в `main` = `27aa6342`.** Выкат делался ДВАЖДЫ: первый в 14:07 снесло полным +перезаливом параллельной сессии, повторный в 14:37 — см. подраздел «Точечный выкат снесло» +ниже. Предполёт делал контроллер сам (не через `prod-deploy-validator`): портал 200, файл на +проде сверен как дореформенный, копии старых — `/tmp/Project.php.bak-20260729` и +`/tmp/ProjectController.php.bak-20260729`. Третьим файлом на прод доложен новый тест +(прод несёт каталог `tests/`; без него прод не был бы равен `main` побайтово). - **Баг (найден при разборе статусов у тенанта 10).** Карточка проекта показывала жёлтое «Готовим к запуску» у проектов, чей заказ у поставщика реально стоял и по которым шли @@ -64,6 +67,62 @@ t2 заказал 45, получил 0; t9 заказал 5, получил 0). с прода — поймано **до** пуша, заменено на выдуманный, повторный скан чист. Разобраться с lefthook отдельно. +### 🔴🔴 Точечный выкат снесло полным перезаливом параллельной сессии — и это НЕ заметил бы никто + +**Хронология (UTC):** + +- **14:07** — выкатил два файла точечно, проверил: 9 из 9 проектов показывают правду. +- **~14:10–14:35** — параллельная сессия влила телеграм-модуль в `main` (`77f61fb1`, +39 + коммитов) и **перезалила прод целиком** по overlay-схеме. Мои два файла вернулись к + дореформенным (9081 / 11211 байт). **Все файлы приложения получили одно время + `14:04:15`** — overlay сохраняет время из архива, поэтому по датам перезалив выглядит + «раньше» моего выката, хотя произошёл позже. 🪤 По `stat` определить порядок событий + НЕЛЬЗЯ. +- **Проверено на живых данных: пятёрка снова врала** (АКЗ, три «Автоломбарда», «Сергей + Сергеевич»). Правка прожила на бою ~30 минут и исчезла молча — ни ошибки, ни записи в + журнале. Нашлось только потому, что заказчик попросил сверить прод с git **побайтово**. +- **14:37** — переставил заново. 🔑 На этот раз содержимое бралось **прямо из git** + (`git cat-file blob ` → stdin-стрим), отпечатки сверены на проде ДО установки; + права выставлены как у соседей после overlay — `root:root 664` (в первый выкат я поставил + `www-data 644`, разошлось с деревом). + +**🔑 Класс проблемы:** пока идут параллельные сессии, **любой полный перезалив молча +откатывает всё, что выкатили точечно и ещё не влили в `main`**. Единственная защита — +влить в `main` до/сразу после точечного выката. Сделано: `main` = `27aa6342` (слияние +без конфликтов; их `77f61fb1` — предок, коммитов было 3766, стало 3769, ничего не потеряно; +разница «их main → нынешний main» = ровно 4 файла, все мои). + +**Сверка прод ↔ git побайтово** (отпечаток git-blob по каждому файлу, скрипт +`/tmp/cmp.sh` на проде + манифест из `git ls-tree -r main -- app`): + +- **2401 из 2401 совпадает байт в байт**, расхождений 0, недостающих 0. +- **Лишнее на проде, чего нет в git** (боевого кода среди этого нет): `public/build.prev/` + — 21 файл, копия предыдущей сборки фронта; два ручных бэкапа + `welcome.blade.php.bak-metrika-20260708` и `routes/console.php.bak-sov-20260710-022806`; + **7 тестовых файлов, которых в `main` нет вообще** (`AdAudienceChannelsModelTest.php`, + `JivoWidget.spec.ts`, `SalesAdAudienceView.spec.ts`, `WarmingChannelIcons.spec.ts`, + `menuRepositionFix.spec.ts`, `AdMarkupTest.php`, `XfetchBalanceProviderTest.php`) — хвосты + прошлых выкатов: overlay кладёт файлы поверх, лишние не удаляет. 🪤 Дрейф копится молча. + +**Состояние на 17:55 МСК:** статусы верны у всех 9 работающих проектов (0 врущих), мои +файлы нетронуты (время `14:37:12`, отпечатки = git), нового перезалива после 14:37 не было, +выкатов в процессе нет, `lk.liderra.ru` и `liderra.ru` — 200, `/api/projects` — 401, +php-fpm / nginx / очередь активны, ошибок в журнале после выката — ноль. + +### Телеграм-модуль оказался на бою (делала параллельная сессия, не эта) + +По прежним записям сначала планировались показы Яндекса, телеграм следом — фактически +модуль уехал на прод 29.07 вместе с перезаливом. Развёрнут **целиком**: код на месте +(входит в те же 2401 совпавших файла), в боевой базе 6 таблиц `client_tg_*` +(`client_tg_auto_rule`, `client_tg_campaign_phones`, `client_tg_campaigns`, +`client_tg_contacts`, `client_tg_optouts`, `client_tg_tariffs`), 14 миграций записаны +**партией 48**, непринятых миграций нет. + +🪤 **Первая попытка миграций провалилась** — `14:11:42`, +`SQLSTATE[42501] permission denied for schema public` на `create table client_tg_campaigns` +(запуск не под `crm_migrator`). Переделали правильно, всё доехало; это **единственная** +ошибка в журнале за 29.07. + --- ## 🆕 ОБНОВЛЕНИЕ 29.07.2026 — «Реклама за показы» + окно передачи отказов модерации ВЫКАЧЕНЫ