Двадцать лет работы, два зала, 24 направления, 18 инструкторов и больше четырёх тысяч клиентов. И сайт, которого поисковики не видели: старая сборка Bitrix была заражена вредоносным кодом и вдобавок отдавала в каждом ответе директиву noindex. Сколько бы контента там ни лежало, для Google и Яндекса центра просто не было. Мы пересобрали проект с нуля на Django, встроили собственную систему записи и открыли для индексации 116 страниц.
Клиент: центр йоги «Практика», Чебоксары · Категория: сайт + SEO
Коротко о главном
- Было 0 страниц в индексе, стало 116. Весь сайт стоял под noindex, для поиска он не существовал.
- Заражённый Bitrix заменён чистым Django без единой строки унаследованного кода.
- Своя система записи с админ-календарём и часовой синхронизацией расписания из Яндекс.Календаря.
- 1132 вопроса FAQ с разметкой на 110 страницах: столько живого текста центр накопил за двадцать лет.
- HTML 26 КБ, ответ за 0,4 секунды, gzip и HTTPS.
- Все старые адреса сохранены, включая .php: переходы по ссылкам из старых постов не теряются.
Технологический стек
- Бэкенд: Python, Django 5.2 с серверным рендерингом, Phusion Passenger.
- База данных: MySQL 8, миграция с унаследованной 5.7. На shared-хостинге стандартный драйвер не собирается, поэтому подключён чистый PyMySQL.
- Инфраструктура: nginx, Apache, Passenger, HTTPS через Let's Encrypt, gzip, принудительный редирект на HTTPS.
- Система записи: собственное Django-приложение, админка работает как интерфейс сотрудника.
- Интеграции: импорт расписания из Яндекс.Календаря по iCal, Яндекс.Метрика, cron.
- SEO и GEO: JSON-LD @graph, sitemap.xml, robots.txt, llms.txt и llms-full.txt.
Серверный рендеринг выбран не ради моды. HTML отдаётся готовым, поэтому и поисковые роботы, и ИИ-краулеры, которые почти не исполняют JavaScript, видят весь контент и микроразметку сразу.
С чего всё началось
Центр пришёл с жалобой, которую слышно часто: «сайт есть, а клиентов с него нет». Обычно за этим стоит слабый текст или медленная загрузка. Здесь причина была другой и куда неприятнее.
Во-первых, движок был заражён. Старая сборка Bitrix годами не обновлялась, и в коде жил вредонос. Во-вторых, весь сайт отдавал в заголовке директиву noindex, nofollow. То есть он честно работал, показывал расписание и цены, но для поисковых систем не существовал вовсе.
Лечить такое бессмысленно: те же дыры вернут ту же проблему. Проект пересобрали целиком, контент вынесли в единый реестр, а старый сайт сняли с обслуживания без простоя действующего домена.
Полный список реализованных функций
🌐 Сайт и контент
- 116 страниц: главная, каталог из 24 направлений, 18 личных страниц инструкторов, услуги, цены, контакты, блог
- Расписание на три недели вперёд с прокруткой по дням и мобильным адаптивом
- Блог из 50 статей о йоге под поисковые и информационные запросы
- Блок «Ближайшие практики» на главной, живой, из того же источника, что и расписание
- Единый реестр контента: страницы, направления, инструкторы, тексты, ключи и мета правятся в одном месте, дубли невозможны по конструкции
🗓 Система записи
- Календарь занятий как главный экран админки, занятие создаётся кликом
- Залы с вместимостью, инструкторы, карточки направлений, контроль лимита мест без гонок
- Импорт расписания из Яндекс.Календаря по обоим филиалам, автоматически раз в час
- Разделение состояний «календарь не загрузился» и «занятий нет»: человек видит корректный статус, а не пугающую ошибку
🔍 Техническое SEO и микроразметка
- Индивидуальные title от 30 до 60 знаков и description от 120 до 160 на всех 116 страницах, ноль дублей
- Canonical, корректная индексация, Open Graph и Twitter Card на каждой странице
- JSON-LD @graph: Organization, два филиала как LocalBusiness с адресами и часами, WebSite, WebPage, Service для направлений, Person для инструкторов, FAQPage, BreadcrumbList, Article
- Семантические хлебные крошки на 115 страницах, связанные со схемой
- FAQ-блоки: 1132 вопроса на 110 страницах, разметка строится из того же текста, что видит человек
- Карта сайта, robots.txt, llms.txt и llms-full.txt как карта контента для ИИ-поисковиков
🖼 Соцсети и доступность
- 116 карточек 1200×630 для репостов: фото плюс фирменная плашка с логотипом, генерируются скриптом
- Подписи полям форм, доступные имена ссылкам-иконкам и кнопкам, корректная разметка декоративных изображений
🚚 Миграция и запуск
- Заражённый Bitrix и его базы удалены, старый сайт снят с обслуживания без простоя домена
- Все прежние адреса сохранены, включая .php
- Прошли сайт по семи этапам: индексация, мета, микроразметка, крошки, схема страниц, доступность, контент
- Проверяли живой сайт по всем 116 страницам до двух чистых прогонов подряд
- Сняли noindex, открыли сайт для поисковиков, подготовили карту для Вебмастера и Search Console
Результаты
| Показатель | Было | Стало |
|---|---|---|
| Страниц, открытых для индексации | 0, весь сайт под noindex | 116 |
| Движок | заражённый Bitrix | Django 5.2, чистый код |
| Индивидуальные title и description | нет | 116 из 116, 0 дублей |
| Микроразметка Schema.org | отсутствует | 8+ типов сущностей, связный @graph |
| FAQ с разметкой | нет | 1132 вопроса на 110 страницах |
| Карточки для соцсетей | логотип-заглушка | 116 карточек 1200×630 |
| Система записи | нет | админ-календарь и часовая синхронизация |
| Технический аудит | — | 0 критичных находок на 116 страницах |

