---
title: Здоровье / SEO сайта
description: Мониторинг website_url, аудит, IndexNow, GSC/Yandex, PageSpeed — в админке CMS Сайт.
---

# Здоровье / SEO сайта

Раздел **CMS Сайт → Здоровье / SEO** (staff) следит за живым `website_url`: crawl, score, issues, готовность блога/KB, IndexNow, органический поиск и PageSpeed.

Публикация с низким SEO score — **предупреждение**, без блокировки. Публичный badge в MVP нет.

## Что автоматизировано (и что нет)

| Есть | Где |
| --- | --- |
| `sitemap.xml` (fetch + список URL) | Аудит |
| `robots.txt` (доступность, Disallow: /, Sitemap:) | Аудит |
| On-page HTML (title, H1, meta, canonical, JSON-LD, alt, TTFB) | Аудит |
| Чеклист blog/KB → `seo_score` + checks | Аудит / Контент / редактор |
| PageSpeed / CWV главной | Аудит + **Дополнительно → Скорость** |
| IndexNow ping | при публикации / ручной ping |
| Клики / impressions / запросы | **Дополнительно → Поиск** после OAuth + «Синк» |
| ИИ-комментарий | **Дополнительно → Настройки → ИИ**, поверх фактов отчёта |
| План: починить / дописать / добавить | кнопка **Проверить сайт** → три списка |

Аудит **не меняет живой сайт** и не парсит SERP Яндекса/Google. Organic и средняя позиция — из GSC / Вебмастера. Семантика: кластер ↔ страница (пробел / есть URL / каннибал). Внедрение на вашей стороне.

## Что нужно

1. В обзоре сайта укажите **Website URL** (или `base_url` в настройках SEO).
2. Включите мониторинг и при необходимости задайте sitemap / расписание.
3. Примените миграции SEO на Supabase (профили, issues, отчёты, интеграции).

## Экран (без вкладок)

1. **Проверить сайт** — аудит, затем автоматически список дел.
2. Три списка: **Починить** / **Дописать** / **Добавить**. Откройте пункт: куда, что вставить, «Сделано».
3. Platform сайт сам не меняет.

Подключения GSC/Яндекс, PageSpeed, отчёты и настройки — блок **Дополнительно** (свёрнут).

| Дополнительно | Назначение |
| --- | --- |
| Поиск | IndexNow, OAuth GSC / Яндекс.Вебмастер, organic sync |
| Сырой аудит | Issues, страницы crawl |
| Контент CMS | Блог/KB: score + чеклист |
| Скорость | PageSpeed / CWV (главная) |
| Отчёты | План исправлений + runbook (MD) + опц. ИИ |
| Настройки | URL, schedule, уведомления, IndexNow |

## API (admin)

База: `YOUR_API_URL`, сессия админки.

```http
GET  /v1/cms/sites/{siteId}/seo/verdict
POST /v1/cms/sites/{siteId}/seo/scans
GET  /v1/cms/sites/{siteId}/seo/issues?status=open
GET  /v1/cms/sites/{siteId}/seo/pages
POST /v1/cms/sites/{siteId}/seo/readiness/blog
POST /v1/cms/sites/{siteId}/seo/readiness/kb
POST /v1/cms/sites/{siteId}/seo/indexnow
POST /v1/cms/sites/{siteId}/seo/psi
POST /v1/cms/sites/{siteId}/seo/digest
GET  /v1/cms/sites/{siteId}/seo/content
GET  /v1/cms/sites/{siteId}/seo/tasks
GET  /v1/cms/sites/{siteId}/seo/dashboard
GET  /v1/cms/sites/{siteId}/seo/work-plan
POST /v1/cms/sites/{siteId}/seo/work-plan/generate
GET  /v1/cms/sites/{siteId}/seo/work-plan/markdown
PATCH /v1/cms/sites/{siteId}/seo/clusters/{clusterId}
POST /v1/cms/sites/{siteId}/seo/competitors
GET/PUT /v1/settings/ai
```

OAuth:

```text
Google Redirect URI (ровно как в UI Поиск):
{YOUR_API_URL}/v1/cms/seo/oauth/google/callback
→ Google Cloud → Authorized redirect URIs (хост API, не админки)

Яндекс (типичный кабинет): Callback только
https://oauth.yandex.ru/verification_code
→ «Открыть Яндекс» → скопировать код → «Подтвердить код»
(POST /v1/cms/sites/{siteId}/seo/search/connect/yandex/code)

Свой callback `{YOUR_API_URL}/v1/cms/seo/oauth/yandex/callback` —
только если Яндекс явно разрешил Callback URI и задан YANDEX_OAUTH_REDIRECT_URI.
```

Расписание: worker → `POST /v1/internal/seo/tick` (`WORKER_SECRET`).

## IndexNow

1. «Сгенерировать ключ» в Поиск / Настройки.
2. Разместить `{key}.txt` на корне живого сайта (тело = ключ).
3. При публикации блога/KB Platform шлёт ping (если ключ есть) и soft-recheck URL.

## PageSpeed

Вкладка **Производительность** вызывает [PageSpeed Insights API](https://developers.google.com/speed/docs/insights/v5/get-started) для `Website URL` сайта. Без ключа Google почти сразу режет по IP (429) — поэтому на проде ключ обязателен.

### Для чайника: что сделать, чтобы заработало

1. **Website URL на сайте**  
   CMS Сайт → Обзор → поле Website URL = `https://твой-сайт.ru` (открывается из интернета, не `localhost`).

2. **Включить API в Google Cloud**  
   Открой: [PageSpeed Insights API — Enable](https://console.cloud.google.com/apis/library/pagespeedonline.googleapis.com)  
   Выбери проект (или создай новый) → **Enable**.

3. **Создать API key**  
   Открой: [Credentials](https://console.cloud.google.com/apis/credentials) → **Create credentials** → **API key**.  
   Скопируй ключ. (Опционально: Restrict key → только «PageSpeed Insights API».)

4. **Прописать на сервере API**  
   В env процесса Platform API (Dokploy / Docker / `.env`):

   ```bash
   PAGESPEED_API_KEY=AIza...твой_ключ
   ```

   **Перезапусти** контейнер/процесс API. Ключ читается только при старте.

5. **Проверить**  
   - `GET YOUR_API_URL/v1/health` → `seo.pagespeed` должно быть `"configured"` (не `"missing_env"`).  
   - CMS Сайт → Здоровье / SEO → **Производительность** → «Запустить PSI».  
   - Либо полный аудит главной (PSI входит в чеклист).

Ручная проверка без Platform: [pagespeed.web.dev](https://pagespeed.web.dev/) — вставь тот же URL.

### Частые ошибки

| Симптом | Что делать |
| --- | --- |
| `missing_env` / «ключ нет» | Нет `PAGESPEED_API_KEY` или API не перезапущен |
| 429 / лимит | Нет ключа или квота; поставь ключ |
| 403 | Ключ неверный / API не включён / restriction режет |
| `website_url_required` | Нет Website URL на обзоре сайта |
| Score «—», ошибка про URL | Сайт недоступен снаружи или неверный https |

Ключ **не** вводится в админке — только env API. В **Дополнительно → Скорость** есть чеклист и статус ключа с `/v1/health`.

## SEO-мета в контенте

В редакторе блога и KB: meta title/description, alt обложки, карточка готовности. Score взвешенный (не грубые ступеньки 0/17/33…). Публичный KB отдаёт `meta_title`, `meta_description`, `cover_alt` в `GET …/kb/articles/{slug}`.

## Отчёты и ИИ-стратег

После аудита в **Отчёты**: блок «что проверено», **полный план** (не только топ-5) с полями «кто / где в коде / шаги / acceptance», кнопка **Копировать runbook (MD)** для тикета разработчику, опционально ИИ.

Каталог типов проблем и инструкции: [SEO — runbook для разработчика](/guides/cms-seo-dev-runbook).

```http
GET /v1/cms/sites/{siteId}/seo/reports
GET /v1/cms/sites/{siteId}/seo/reports/{reportId}
GET /v1/cms/sites/{siteId}/seo/reports/{reportId}/developer-doc
POST /v1/cms/sites/{siteId}/seo/reports/{reportId}/ai
POST /v1/cms/sites/{siteId}/seo/digest
```

Ключи ИИ: **Настройки → ИИ** (не env). Провайдеры: Claude, OpenAI, [Timeweb AI Gateway](https://timeweb.cloud/docs/ai-agents/api-usage/ai-gateway) (`base_url` `https://api.timeweb.ai/v1`, модели вида `openai/gpt-4o`). API: `GET/PUT /v1/settings/ai`.

В редакторе блога/KB: кнопка **Сгенерировать SEO** заполняет только пустые `meta_title`, `meta_description`, `body` (с `# H1`), `cover_alt` — `POST /v1/cms/sites/{id}/seo/generate-fields`.

## GSC / Яндекс — env на API

Без `GOOGLE_OAUTH_CLIENT_ID/SECRET` и `YANDEX_OAUTH_CLIENT_ID/SECRET` кнопки «Подключить» неактивны (`platform_oauth_missing`). Redirect URI в UI совпадает с тем, что уходит в OAuth authorize.

См. также [CMS Сайт](/guides/cms-site).
