Центр йоги «Практика» в Чебоксарах — два зала, 24 направления, 18 инструкторов и свыше 4000 клиентов — работал на заражённом Bitrix, который вдобавок держал весь сайт под директивой `noindex`: для поисковиков его попросту не существовало. Мы пересобрали проект с нуля на Django 5.2 с серверным рендерингом, перенесли базу на MySQL 8 и сохранили все старые адреса. Встроили собственную систему записи с админ-календарём и часовой синхронизацией расписания, а затем открыли для индексации 116 страниц — с микроразметкой Schema.org, 1132 вопросами FAQ и картой контента для ИИ-поиска.
Коротко о результате
- 🔓 Было 0 → стало 116 страниц, открытых для индексации (сайт был полностью закрыт
noindex) - 🦠 Заражённый Bitrix → чистый Django без единой строки унаследованного кода
- 🗓 Своя система записи с админ-календарём и часовой синхронизацией расписания из Яндекс.Календаря
- 🧩 1132 вопроса FAQ и микроразметка Schema.org на 110 страницах
- ⚡ HTML 26 КБ, ответ 0,4 c, gzip, HTTPS — техническая база под рост
Задача
Клиент — центр йоги «Практика» в Чебоксарах: два зала, более 20 направлений, 18 инструкторов, свыше 4000 клиентов за 20 лет работы. Старый сайт стоял на устаревшей Bitrix-сборке, которая к моменту начала работ была заражена вредоносным кодом. Плюс к этому весь сайт отдавал в <head> директиву noindex, nofollow — то есть был полностью невидим для Google и Яндекса: сколько бы контента на нём ни было, в поиске он не существовал.
Нужно было не «подкрутить SEO», а пересобрать проект целиком: убрать заражённый движок, перенести контент на управляемую платформу, дать центру инструмент для работы с расписанием и записью, и с нуля выстроить техническую поисковую гигиену — так, чтобы сайт наконец начал индексироваться.
Что сделали
Сайт заново собран на Django 5.2 с серверным рендерингом: HTML отдаётся готовым, а не собирается в браузере, поэтому и поисковые роботы, и ИИ-краулеры (которые JavaScript почти не исполняют) видят весь контент и микроразметку сразу.
Контент вынесен в единый реестр: страницы, направления, инструкторы, тексты, ключи, мета — всё в одном месте, правится централизованно. 116 страниц строятся из этого реестра, дубли невозможны по конструкции.
Заражённый Bitrix и его базы удалены, старый сайт снят с обслуживания без простоя действующего домена. Все прежние адреса (включая .php) сохранены — переходы по старым ссылкам не теряются.
Технологический стек
- Backend: Python, Django 5.2 (SSR), Phusion Passenger
- База данных: MySQL 8 (мигрировали с унаследованной 5.7; на shared-хостинге, где не собирается стандартный драйвер, подключён чистый PyMySQL)
- Инфраструктура: nginx → Apache → Passenger, HTTPS (Let's Encrypt), gzip, HTTP→HTTPS редирект
- Система записи: собственное Django-приложение, админка как рабочий интерфейс
- Интеграции: импорт расписания из Яндекс.Календаря (iCal), Яндекс.Метрика, cron
- SEO/GEO: JSON-LD @graph, sitemap.xml, robots.txt, llms.txt, llms-full.txt
Реализованный функционал
Сайт и контент
- 116 страниц: главная, каталог из 24 направлений, 18 личных страниц инструкторов, разделы услуг, цен, контактов, блог
- Расписание на 3 недели вперёд с прокруткой по дням и адаптивом под мобильные
- Блог из 50 SEO-статей о йоге под поисковые и информационные запросы
- Блок «Ближайшие практики» на главной, живой, из того же источника, что и расписание
Система записи (внутренняя)
- Календарь занятий как главный экран админки, создание занятия кликом
- Залы с вместимостью, инструкторы, карточки направлений, контроль лимита мест без гонок
- Импорт расписания из Яндекс.Календаря по обоим филиалам, автоматически раз в час
- Разделение «календарь не загрузился» и «занятий нет» — пользователь видит корректный статус, а не пугающую ошибку
Техническое 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, зафиксировали, что сайт полностью закрыт от индексации, составили карту проекта.
- Пересборка на Django. Перенесли контент в управляемый реестр, собрали 116 страниц с серверным рендерингом.
- Миграция инфраструктуры. Развернули на прод-хостинге, перевели БД на MySQL 8, настроили HTTPS и старые URL.
- Система записи. Спроектировали и встроили календарь, залы, импорт расписания из Яндекса.
- SEO / GEO / A11y. Прошли сайт по семи этапам: индексация, мета, микроразметка, крошки, схема страниц, доступность, контент.
- Цикл аудитора. Проверяли живой сайт по всем 116 страницам до двух чистых прогонов подряд со статусом CLEAN.
- Запуск. Сняли
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 |
| Система записи | нет | админ-календарь + часовая синхронизация |
| Технический аудит | — | STATUS: CLEAN, 0 критичных на 116 страницах |

