From 5be5fc005f0ebe7310fe2dac69da577c66855fb8 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Tue, 15 Sep 2026 19:21:15 +0300 Subject: [PATCH] =?UTF-8?q?feat(mera):=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B8=D1=82=D1=8C=20=D1=81=D1=87=D1=91=D1=82=D1=87?= =?UTF-8?q?=D0=B8=D0=BA=20=D0=AF=D0=BD=D0=B4=D0=B5=D0=BA=D1=81.=D0=9C?= =?UTF-8?q?=D0=B5=D1=82=D1=80=D0=B8=D0=BA=D0=B8=20112563104=20=D0=BA=20?= =?UTF-8?q?=D0=BF=D1=83=D0=B1=D0=BB=D0=B8=D1=87=D0=BD=D0=BE=D0=BC=D1=83=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=82=D1=83=D1=80=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Обвязка аналитики стояла на сайте с #3436, но собирала ноль: все четыре переменные NEXT_PUBLIC_YM_ID/GA_ID/YANDEX_VERIFICATION/GOOGLE_VERIFICATION уходили в сборку пустыми, а пустая строка по контракту фронта убирает тег целиком. Владелец завёл счётчик 112563104 — вписан литералом в ОБА блока build-args деплоя (основной и retry без кеша): пропустить второй значит получить сборку без счётчика ровно в тот прогон, когда битый buildcache уронит первый. Номер счётчика не secret: он и так уходит в разметку каждой страницы, а литерал в диффе можно проверить глазами. Добавлен ssr:true в init. Страницы публичного контура рендерятся на сервере, и без флага Метрика считает первый хит по состоянию DOM на момент гидратации, а не по отданной сервером разметке. Флаг выставлен и в самом счётчике на стороне Метрики. ВЕБВИЗОР ОСТАЁТСЯ ВЫКЛЮЧЕН, хотя в счётчике владелец его включил. Он пишет ввод в поля формы, а на /estimate человек вводит адрес своей квартиры; раздел 9 политики конфиденциальности запись действий не объявляет. Включать следует одним заходом с двумя правками: фраза про запись действий в п. 9.1 privacy/page.tsx и маскировка полей адреса и телефона через ym-hide-content / data-ym-disable-keys. GA4 и коды верификации поисковых консолей остаются пустыми — не заведены. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01VQ8jqr4SFirX5tFLwdSrXh --- .forgejo/workflows/deploy-tradein.yml | 23 +++++++++++-------- .../_components/AnalyticsScripts.tsx | 5 ++++ 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/.forgejo/workflows/deploy-tradein.yml b/.forgejo/workflows/deploy-tradein.yml index 9282b3fa..99fda74f 100644 --- a/.forgejo/workflows/deploy-tradein.yml +++ b/.forgejo/workflows/deploy-tradein.yml @@ -511,21 +511,24 @@ jobs: # NEXT_PUBLIC_APP_VERSION/BUILD_SHA/BUILD_DATE — build-time (Next.js # инлайнит NEXT_PUBLIC_* в статику, runtime env их не подхватит, # см. frontend/Dockerfile комментарий у соответствующих ARG). - # NEXT_PUBLIC_YM_ID/GA_ID/YANDEX_VERIFICATION/GOOGLE_VERIFICATION — - # ПОКА ПУСТЫЕ: владелец ещё не завёл счётчики Метрики/GA4 и - # мета-теги верификации поисковых консолей. Пустая строка = скрипт - # счётчика НЕ рендерится вообще (контракт фронта, см. тот же - # Dockerfile-комментарий). Когда номера появятся — вписать - # литералом сюда И в retry-блок ниже (оба обязательны, иначе - # ретрай без кеша уедет без счётчика), и это ТРЕБУЕТ пересборки - # образа (build-time bake, не runtime-правка на проде). + # NEXT_PUBLIC_YM_ID — счётчик Яндекс.Метрики публичного контура, + # заведён владельцем 15.09.2026. Литерал, а не secret: номер + # счётчика и так уходит в разметку каждой страницы, прятать нечего, + # а secret'ом его нельзя проверить глазами в диффе. + # NEXT_PUBLIC_GA_ID/YANDEX_VERIFICATION/GOOGLE_VERIFICATION — + # ПОКА ПУСТЫЕ: ресурс GA4 и права в поисковых консолях ещё не + # заведены. Пустая строка = соответствующий тег НЕ рендерится + # вообще (контракт фронта, см. тот же Dockerfile-комментарий). + # ЛЮБОЕ из этих значений вписывать литералом СЮДА И в retry-блок + # ниже — оба обязательны, иначе ретрай без кеша уедет без счётчика. + # Требует пересборки образа: build-time bake, не runtime-правка. build-args: | NEXT_PUBLIC_BASE_PATH=/trade-in NEXT_PUBLIC_API_BASE_URL=/trade-in NEXT_PUBLIC_APP_VERSION=${{ needs.changes.outputs.app_version }} NEXT_PUBLIC_BUILD_SHA=${{ needs.changes.outputs.build_sha }} NEXT_PUBLIC_BUILD_DATE=${{ needs.changes.outputs.build_date }} - NEXT_PUBLIC_YM_ID= + NEXT_PUBLIC_YM_ID=112563104 NEXT_PUBLIC_GA_ID= NEXT_PUBLIC_YANDEX_VERIFICATION= NEXT_PUBLIC_GOOGLE_VERIFICATION= @@ -552,7 +555,7 @@ jobs: NEXT_PUBLIC_APP_VERSION=${{ needs.changes.outputs.app_version }} NEXT_PUBLIC_BUILD_SHA=${{ needs.changes.outputs.build_sha }} NEXT_PUBLIC_BUILD_DATE=${{ needs.changes.outputs.build_date }} - NEXT_PUBLIC_YM_ID= + NEXT_PUBLIC_YM_ID=112563104 NEXT_PUBLIC_GA_ID= NEXT_PUBLIC_YANDEX_VERIFICATION= NEXT_PUBLIC_GOOGLE_VERIFICATION= diff --git a/tradein-mvp/frontend/src/app/mera-public/_components/AnalyticsScripts.tsx b/tradein-mvp/frontend/src/app/mera-public/_components/AnalyticsScripts.tsx index 49faa074..cf424ded 100644 --- a/tradein-mvp/frontend/src/app/mera-public/_components/AnalyticsScripts.tsx +++ b/tradein-mvp/frontend/src/app/mera-public/_components/AnalyticsScripts.tsx @@ -86,6 +86,10 @@ export function AnalyticsScripts() { (1) отдельная фраза про запись действий в п. 9.1 `privacy/page.tsx`, (2) маскировка полей ввода адреса и телефона через `ym-hide-content` / `data-ym-disable-keys`. */} + {/* `ssr:true` — страницы публичного контура рендерятся на сервере, + и без этого флага Метрика считает первый хит по состоянию DOM на + момент гидратации, а не по отданной сервером разметке. Флаг + выставлен и в самом счётчике на стороне Метрики. */}