# zemlya-web — полная доработка сайта (на 2026-05-19)

**Статус:** Все фазы А-Е + 5 раундов мобильных правок + 5 юр.страниц + стэк-карточки админки + SEO base + 404 + AI-upsell + 10/нед. Сайт в проде. Final full_audit: **0 failures на 23 страницы × 2 viewport.**

## Что готово

### Фаза А — Админка (хаб + 6 разделов)
`backend/app/routes/admin.py` (~1240 строк), 7 разделов: хаб с метриками, users (list/card/grant/access), payments (list+xlsx export), reports, leads (list+xlsx export), feedback, promo, referrals. Всё под `admin_required` + slowapi + MSK-форматирование.

### Фаза Б — /help
5 секций (КН, тарифы, оплата, рефералы, поддержка) + 12-row сравнительная таблица из `bot/assets/пример.pdf` + мобильные TierBlock.

### Фаза В — /dashboard виджеты
Quick КН, последние 3 отчёта, мини реф-виджет, сняты «Скоро» с Рефералы/Помощь/Админка.

### Фаза Г — Mobile + бургер
`components/MobileMenu.tsx` (бургер на `<md:`, side-panel, ESC, body-scroll-lock) на **всех 19 страницах** + INFO-секция в меню (Тарифы, О сервисе, Контакты, Оферта, Политика ПД).

### Фаза Д — e2e тесты
`tests/full_audit.py` — обход 23 страниц × 2 viewport (mobile 390×844 + desktop 1440×900), проверка `scrollWidth ≤ clientWidth` + все `<a>` ссылки на 200 + бургер на мобайл-страницах.

### Фаза Е (5 раундов фидбека юзера)
1. Viewport meta (`width=device-width, initialScale=1, maximumScale=5` в `app/layout.tsx`)
2. Logo `shrink-0 + maxWidth:100%` (БЕЗ minWidth — иначе hero 520px не лезет)
3. Hero контейнер `max-w-[240px] sm:max-w-[320px] md:max-w-none`
4. Вертикальный стэк: `html,body { overflow-x:hidden; max-width:100vw }` + word-break на `<sm:` + таблица→cards на `/referrals`
5. Контент главной/help из `bot/assets/пример.pdf` (12 строк × 4 столбца сравнения + 10 разделов AI)
6. Цены: «от 599 ₽» / «от 1 200 ₽» (минимальные единичные)
7. 404-ссылки убраны → потом 5 страниц созданы (см. ниже)

### 2026-05-19: продолжение
1. **«3/нед» → «10/нед»** на главной и /help (правильный лимит free)
2. **Подпись «Спутниковый снимок (ESRI)» убрана** из `/reports/[id]`
3. **AI-upsell CTA** на `/reports/[id]` если `mode !== "ai"` → ведёт на `/dashboard/new?kn=...&tariff=ai` (предзаполняется)
4. **5 юр.страниц созданы:** /pricing, /about, /privacy, /oferta, /contacts (контент: ИП Балышев Д. Н., ИНН 292005433244, ОГРНИП 324784700373762, СПб, НПД; контакты @osminog/@Cebers_dev; минимальный комплаенс)
5. **Ссылки восстановлены** в шапке (+«Тарифы», «О сервисе») и футере (+«Контакты», «Оферта», «Политика ПД»); MobileMenu имеет INFO-секцию
6. **Стэк-карточки на мобайл для 6 админ-таблиц:** /admin/users, /payments, /reports, /leads, /promo, /referrals — на `<md:` карточки `<dl>` с парами label/value, на `≥md:` остаются таблицы (`hidden md:block`). `/admin/feedback` уже был cards-стилем
7. **SEO базис:** `app/sitemap.ts` (8 URL с priority/frequency), `app/robots.ts` (allow public + disallow private + ban 10 AI/SEO-краулеров: GPTBot/ClaudeBot/anthropic-ai/CCBot/PerplexityBot/Bytespider/SemrushBot/AhrefsBot/MJ12bot/DotBot). **Старый `public/robots.txt` удалён** (был статический с устаревшим duckdns доменом)
8. **`app/layout.tsx` metadata:** `metadataBase`, title.template, keywords, openGraph.siteName/url/images, twitter.card, robots.googleBot
9. **Кастомная `/not-found.tsx`** с брендингом (404 + 4 navigation cards)
10. **Финал:** `full_audit` → **0 failures / 0 warnings** на 23 × 2 viewport

## Чего НЕТ (отложено)

- **OAuth (Яндекс/VK/Email)** — требует:
  1. Регистрации приложения юзером в Яндекс ID/VK
  2. Получения ClientID/ClientSecret
  3. Продуктового решения «как связать web-пользователя с TG-пользователем» (3 варианта обсуждены, ждём ответ)
- **Тест-выплата своим аккаунтом** — рутинная операция юзера, не код
- **og-image PNG 1200×630** — пока используется /logo.jpg (без оптимизации под социальные превью)

## Технические якоря (актуально на 2026-05-19)

- SSH: `ssh -i ~/.ssh/id_ed25519 cebers_mini@192.168.0.107`
- Backend: `/Users/cebers_mini/Services/zemlya-web/backend/`, Python 3.12 venv, :20140
- Frontend: `/Users/cebers_mini/Services/zemlya-web/frontend/`, Next 14 prod, :20141
- БД: `/Users/cebers_mini/Services/zemlya-bot/data/db/zemlya_bot.db` (общая с ботом)
- Frontend build PATH: `export PATH=/opt/homebrew/bin:/opt/homebrew/opt/node@22/bin:$PATH`
- Restart: `launchctl kickstart -k gui/$(id -u)/local.zemlya-web-{backend,frontend,tunnel,bot}`
- JWT: `from app.auth.jwt import issue; issue(1005954706, 3)` (admin)
- Antibot headers: `Mozilla/5.0` + `Referer` + `Sec-Fetch-Site: same-origin`
- **macOS sed ≠ GNU sed** — in-place правки через ssh делать python-ом
- Playwright = `/usr/bin/python3` (3.9); backend = `backend/venv/bin/python` (3.12)

## Полный список роутов

**Публичные (8):** `/` `/pricing` `/about` `/help` `/contacts` `/oferta` `/privacy` `/login`
**Auth (8):** `/dashboard` `/dashboard/new` `/reports` `/reports/[id]` `/buy` `/referrals` `/promo` `/feedback`
**Admin (8):** `/admin` `/admin/users` `/admin/users/[id]` `/admin/payments` `/admin/reports` `/admin/leads` `/admin/feedback` `/admin/promo` `/admin/referrals`
**Payment callback (2):** `/payment/success` `/payment/fail`
**SEO (2):** `/sitemap.xml` `/robots.txt`
**System:** `/not-found` (404)

## Контрольная метрика

`/usr/bin/python3 /Users/cebers_mini/Services/zemlya-web/tests/full_audit.py` → **0 failures / 0 warnings** на 23 страницы × 2 viewport.
