# Универсальное ТЗ для SEO‑апгрейда — v8.6
> **Версия:** 8.6
> **Дата:** 2026-04-06
> **Область:** Все домены экосистемы Dragon Education
> **Целевой воркер:** Cloudflare Worker v6.5
> **Автор:** AI-SEO архитектор Dragon Education
---
## Содержание
- [§0. Архитектура: два файла, две роли](#§0-архитектура-два-файла-две-роли)
- [§1. Cloudflare Worker v6.5](#§1-cloudflare-worker-v65)
- [§1.1. Канонический домен, www и боты](#§11-канонический-домен-www-и-боты)
- [§2. ai-seo.json — ОБЯЗАТЕЛЬНЫЙ файл для Worker](#§2-ai-seojson--обязательный-файл-для-worker)
- [§3. ai-context.json — AI-контекст для LLM](#§3-ai-contextjson--ai-контекст-для-llm)
- [§4. seoConfig.ts + Seo-компонент (фронт)](#§4-seoconfigts--seo-компонент-фронт)
- [§5. index.html, noscript, JSON-LD](#§5-indexhtml-noscript-json-ld)
- [§6. sitemap.xml + robots.txt](#§6-sitemapxml--robotstxt)
- [§7. Sync-протокол — порядок обновления](#§7-sync-протокол--порядок-обновления)
- [§8. Cache-Control и Cloudflare Purge](#§8-cache-control-и-cloudflare-purge)
- [§9. Чеклист проверки (curl-команды)](#§9-чеклист-проверки-curl-команды)
- [§10. Правила по умолчанию](#§10-правила-по-умолчанию)
---
## Что изменилось с v7 → v8
| Проблема в v7 | Исправление в v8 |
|---------------|------------------|
| `ai-seo.json` упомянут, но нет чёткого требования «создать ПЕРВЫМ» | **Явный шаг 0:** создать `ai-seo.json` ДО всего остального |
| Ссылка на Worker v6.4 | Обновлено на **v6.5** с описанием актуальной логики |
| Кэширование CDN не упомянуто | Новая **§8:** Cache-Control + purge после деплоя |
| Sync-протокол размытый | **Жёсткий чеклист** с порядком: seoConfig → ai-seo.json → ai-context.json → sitemap → lastUpdated |
| lastUpdated забывается | **Явное правило:** обновлять при КАЖДОМ деплое |
| Проверка не формализована | **Конкретные curl-команды** с ожидаемым выводом |
| Путаница ai-context.json vs ai-seo.json | **Чёткое разделение ролей** — §0 |
---
## §0. Архитектура: два файла, две роли
В экосистеме Dragon Education для каждого домена используются **ДВА** JSON-файла с принципиально разными ролями:
### `ai-seo.json` — для Cloudflare Worker
| Параметр | Значение |
|----------|----------|
| **Потребитель** | Cloudflare Worker v6.5 (HTMLRewriter) |
| **Задача** | Инъекция `
`, ``, ``, JSON-LD в HTML для ботов |
| **Формат** | `{ default: {...}, pages: [{path, title, description, canonical, ogImage, jsonLd}] }` |
| **Расположение** | `public/ai-seo.json` → `https://{ORIGIN}.lovable.app/ai-seo.json` |
| **Кто читает** | ТОЛЬКО Worker при обработке запроса бота |
### `ai-context.json` — для LLM-краулеров
| Параметр | Значение |
|----------|----------|
| **Потребитель** | PerplexityBot, GPTBot, ClaudeBot, Anthropic-AI и другие LLM |
| **Задача** | Объяснить ИИ-системам что такое этот сайт, какие страницы есть, какова экосистема |
| **Формат** | `{ version, lastUpdated, site, ecosystem, pages[], services[], aiInstructions }` |
| **Расположение** | `public/ai-context.json` → `https://DOMAIN/ai-context.json` |
| **Кто читает** | AI-боты напрямую (fetch JSON), поисковые роботы |
### ⚠️ Критическое правило
> **НИКОГДА** не путать эти файлы. Worker не читает `ai-context.json`. LLM не читают `ai-seo.json`.
> При добавлении новой страницы — обновлять **ОБА** файла.
### Дополнительные файлы
| Файл | Роль |
|------|------|
| `ai-context.md` | Человекочитаемая версия ai-context.json для ботов без JSON-парсинга |
| `ai-lovable-guide.md` | Инструкция для AI-агента (Lovable) по работе с конкретным доменом (опционально) |
| `ai-lovable-update.md` | Журнал изменений для AI-агента (опционально) |
---
## §1. Cloudflare Worker v6.5
### Архитектура
Общий Cloudflare Worker обслуживает **все** домены экосистемы Dragon Education.
```
Запрос → Worker → configureByHost(request) → определяет ORIGIN + SITE_URL
→ fetchOrigin() → получает HTML с Lovable
→ isBot(UA)? → да → fetchSeoManifest() → HTMLRewriter → ответ
→ нет → ответ как есть
```
### Функция `configureByHost(request)`
Сопоставляет `Host` заголовок запроса с origin:
| Host | ORIGIN_SUBDOMAIN | SITE_URL |
|------|------------------|----------|
| `dragon-english.biz` | `dragon-english-biz.lovable.app` | `https://dragon-english.biz` |
| `dragon-education.ru` | `dragon-education.lovable.app` | `https://dragon-education.ru` |
| `tv140380.ru` | `tv140380.lovable.app` | `https://tv140380.ru` |
| `dragon-russian.ru` | `dragon-russian.lovable.app` | `https://dragon-russian.ru` |
| `skills-panel.ru` | `skills-panel.lovable.app` | `https://skills-panel.ru` |
### Функция `getOrigins()`
```
LOVABLE_ORIGIN = https://{ORIGIN_SUBDOMAIN}.lovable.app
SEO_URL = {LOVABLE_ORIGIN}/ai-seo.json
GEO_URL = {LOVABLE_ORIGIN}/ai-geo.json (опционально)
```
### BOT_AGENTS (v6.5)
Worker определяет ботов по подстроке в `User-Agent`:
```
Googlebot, Bingbot, YandexBot, DuckDuckBot, Baiduspider,
Twitterbot, facebookexternalhit, LinkedInBot, WhatsApp,
Slackbot, Telegrambot, Discordbot, Applebot, Applebot-Extended,
GPTBot, ChatGPT-User, Claude-Web, ClaudeBot, Anthropic-AI,
anthropic-ai, PerplexityBot, Google-Extended, Amazonbot,
CCBot, AI2Bot, Cohere-AI, Bytespider, meta-externalagent
```
### HTMLRewriter — что делает
Для ботов + HTML-ответов Worker:
1. **Заменяет** содержимое `` на `title` из ai-seo.json для данного `path`
2. **Заменяет/вставляет** ``
3. **Заменяет/вставляет** ``
4. **Вставляет** ``, `og:description`, `og:url`, `og:image`
5. **Вставляет** JSON-LD `