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
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>
55 lines
2.8 KiB
Markdown
55 lines
2.8 KiB
Markdown
# 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.
|