docs(пилот): точечный выкат снесло полным перезаливом — хронология, повторная установка, сверка байт в байт
Accessibility (Pa11y live) / a11y (push) Has been cancelled

Дополняет запись о выкате 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) <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-07-29 18:00:33 +03:00
parent 27aa6342f2
commit 6e31cf9e39
+63 -4
View File
@@ -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:1014:35** — параллельная сессия влила телеграм-модуль в `main` (`77f61fb1`, +39
коммитов) и **перезалила прод целиком** по overlay-схеме. Мои два файла вернулись к
дореформенным (9081 / 11211 байт). **Все файлы приложения получили одно время
`14:04:15`** — overlay сохраняет время из архива, поэтому по датам перезалив выглядит
«раньше» моего выката, хотя произошёл позже. 🪤 По `stat` определить порядок событий
НЕЛЬЗЯ.
- **Проверено на живых данных: пятёрка снова врала** (АКЗ, три «Автоломбарда», «Сергей
Сергеевич»). Правка прожила на бою ~30 минут и исчезла молча — ни ошибки, ни записи в
журнале. Нашлось только потому, что заказчик попросил сверить прод с git **побайтово**.
- **14:37** — переставил заново. 🔑 На этот раз содержимое бралось **прямо из git**
(`git cat-file blob <sha>` → 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 — «Реклама за показы» + окно передачи отказов модерации ВЫКАЧЕНЫ