food-market/docs/analytics.md
nns 346b7bfd48
Some checks failed
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
Docker Public / Build + push Public (push) Has been cancelled
Docker Public / Deploy Public on stage (push) Has been cancelled
feat(s20): Mapster + SSO scaffold + maintenance automation (7 пунктов)
1. TD-3 Mapster — Application/Mapping/MapsterConfig.cs с
   TypeAdapterConfig для Product, Counterparty + collections.
   ProductsController.List/Get/GetInternalAsync + CounterpartiesController.
   List/Get переведены на .ProjectToType<TDto>(MapsterConfig.Config).
   Inline Projection-Expression удалён.

2. SSO scaffold — Microsoft.AspNetCore.Authentication.Google + .MicrosoftAccount
   пакеты, условная регистрация в Program.cs (только если ClientId задан).
   ExternalAuthController с GET /api/auth/external/{provider} (Challenge или
   503 если не настроено), /callback (501 с email — invite-flow TODO),
   /providers (булевый список). docs/sso.md инструкция.

3. Stale-data cleanup — HousekeepingJobs расширен:
   PruneOrgAuditLogAsync (>90д из Cleanup:OrgAuditLogDays),
   PruneDraftsAsync (Supply/RetailSale/Demand старше 30д),
   PruneRevokedRefreshTokensAsync (raw SQL DELETE из OpenIddictTokens).
   3 новых cron'a в HangfireJobsConfigurator (03:00-03:20 UTC).

4. DB VACUUM automation — DatabaseMaintenanceJobs.VacuumTopTablesAsync:
   pg_total_relation_size → топ-5 таблиц → VACUUM (ANALYZE) per table
   с замером времени. Default cron еженедельно вс 04:00 UTC.

5. Disk usage monitoring — DiskMonitoringJob ежечасно: DriveInfo.AvailableFreeSpace
   на пути из Monitoring:DiskPaths (default "/opt,/var/lib/docker").
   <1GB → Telegram-alert на Monitoring:SuperAdminTelegramChatIds.
   Anti-spam cooldown 6h. Gauge food_market_disk_free_bytes{mount}.

6. Performance regression detection — ~/nightly-perf-check.sh после
   nightly-verify. Парсит /metrics, считает db_avg_ms, сравнивает с
   baseline в ~/.fm-watchdog/perf-baseline.json. Δ>30% → Telegram alert
   + baseline НЕ обновляется (sliding window).

7. Public-site analytics placeholder — Astro BaseLayout рендерит
   gtag/Yandex.Metrika только если задан PUBLIC_GA_ID / PUBLIC_YM_ID;
   иначе <script data-id="REPLACE_ME" data-doc="docs/analytics.md">
   маркер. docs/analytics.md с инструкцией подключения.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-07 21:54:12 +05:00

55 lines
2.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Web-analytics на public-сайте
Sprint 20: в `food-market.public` (Astro marketing-сайт) подключены
placeholder'ы для Google Analytics 4 и Яндекс.Метрики. По умолчанию
оба не активны — в HTML рендерятся `<script data-id="REPLACE_ME">`
маркеры. Аналитика включается через env-vars при сборке Astro.
**Зачем placeholder, а не сразу скрипты:**
- Аналитика на marketing-сайте — это PII (IP-адреса посетителей),
по GDPR / 152-ФЗ / казахскому ЗоЗПД требует согласия пользователя
или специальной конфигурации (`anonymize_ip: true` + cookies notice).
- Прод-аккаунт в Google/Yandex заводится отдельно владельцем; коммитить
его в репо неправильно.
## Google Analytics 4
1. Завести **GA4 property** на https://analytics.google.com.
2. **Admin → Data Streams → Web → Add stream** → ввести URL public-сайта.
3. Скопировать **Measurement ID** вида `G-XXXXXXXXXX`.
4. В `deploy/Dockerfile.public` или в env переменной добавить:
```bash
PUBLIC_GA_ID=G-XXXXXXXXXX
```
5. Пересобрать public-image: `cd src/food-market.public && pnpm build`.
6. Открыть https://food-market.kz, проверить в DevTools → Network тегом
`gtag/js?id=G-XXX`.
## Яндекс.Метрика
1. https://metrika.yandex.com → **Создать счётчик**.
2. Скопировать **ID счётчика** (8-значное число).
3. Env: `PUBLIC_YM_ID=12345678`.
4. Аналогично — пересобрать.
## Проверка что НЕ настроено
Открыть https://food-market.kz, View Source, найти:
```html
<script data-analytics="google" data-id="REPLACE_ME" data-doc="docs/analytics.md" />
<script data-analytics="yandex-metrika" data-id="REPLACE_ME" data-doc="docs/analytics.md" />
```
Если эти строки есть — аналитика **не подключена**. Если вместо них
видны `gtag` или `ym(...)` скрипты — настроено.
## Что НЕ собираем
- Никаких событий на админ-сайте `admin.food-market.kz` — это закрытая
система для авторизованных пользователей, тут аналитика будет
собирать persistent activity, что нарушает privacy expectations.
Если потребуется product-analytics в админке — отдельный обсуждение
(можем self-host Plausible / PostHog).
- Никаких user-id в Metrika events — только anonymous traffic.