wm2.dev
seo-auditИзбранное

seo-audit — кейс

Автоматический аудитор SEO, техSEO, скорости и AI-готовности сайта на Python/Django: на входе URL, на выходе 400+ проверок, взвешенная оценка и PDF-отчёт.

Автор и ведущий разработчик/2026
backendinfra
400+проверок в аудите
70,5 → 98,5оценка app-kit.ru, быстрый аудит
~20 сбыстрый аудит; полный ~4,5 мин

01 Задача

На каждом сайте, который я выпускал, приходилось вручную проверять одно и то же: редиректы, canonical, sitemap, микроразметку, Core Web Vitals, llms.txt. Онлайн-чекеры закрывают каждый свой кусок, ставят оценку по невидимым правилам и часто пишут «всё в порядке» там, где просто не смогли проверить. Мне был нужен один движок, который идёт по моему собственному чек-листу, подтверждает каждый вердикт фактами и выдаёт отчёт, по которому владелец сайта может действовать. Проект стартовал в июне 2026 года как личный инструмент, а архитектуру я сразу держал готовой к работе в виде сервиса.

02 Что сделал

Сервис на Django + DRF с воркерами Celery, PostgreSQL и Redis. Аудит идёт асинхронным пайплайном: обход сайта, загрузка сырого HTML, рендер страниц в Playwright, Lighthouse, проверки, подсчёт оценки, сборка отчёта. Тяжёлая работа (headless Chromium, Lighthouse, PDF) выполняется только в отдельной очереди heavy, поэтому медленный рендер не тормозит лёгкую часть аудита.

  • Проверки как данные: реестр генерируется из письменного чек-листа, расхождения ловит CI
  • Без фактов нет вердикта: ни pass, ни fail без доказательств; непроверенное не входит в оценку
  • Краулер с robots.txt, лимитами и пробами soft 404; Playwright и Lighthouse в отдельной очереди heavy
  • Отчёт на одном языке, RU или EN, в PDF; HTTP API с ключами, защитой от SSRF и лимитами по IP

03 Проверки как данные, а не код

Источник правды — чек-лист в моей базе знаний: около 40 разделов, от HTTP-статусов и редиректов до JSON-LD, доступности, аналитики и AI-краулеров. У каждого пункта есть ID, приоритет (P0, P1 или P2) и тип: автоматическая, полуавтоматическая или ручная проверка. Генератор превращает чек-лист в реестр checks.yaml, а отдельная команда роняет сборку, если реестр и чек-лист разошлись.

Новая проверка — это строка в реестре и функция-runner с тестом, движок при этом не меняется. Так реестр вырос до 400+ проверок в 36 группах. Каждый runner покрыт тестом на мок-сайте, а набор почти из 2900 тестов работает без доступа к сети.

04 Оценка, которая не врёт

Вес проверки зависит от приоритета: P0 — 10 баллов, P1 — 3, P2 — 1. Оценка группы — это пройденный вес, делённый на вес применимых проверок. Полуавтоматические проверки идут с половинным весом до подтверждения экспертом, ручные выводятся отдельным списком. Неприменимые проверки выпадают из знаменателя: сайт без магазина не теряет баллы за отсутствие разметки товаров.

Главное правило: проверка не может пройти без подтверждённого факта (HTTP-ответа, отрендеренного DOM, замера) и не может без него провалиться. Если движок не смог что-то проверить, вердикт — «не проверено», и в оценку он не входит. В сводке видно покрытие, то есть долю применимых проверок с автоматическим вердиктом; если оно ниже 60%, отчёт это помечает.

05 Краулер, пробы и очередь heavy

Краулер написан на httpx и selectolax, соблюдает robots.txt, лимит страниц и лимит запросов в секунду и представляется своим user agent. После основного обхода он отправляет пробы: несуществующий адрес в корне и в разделах сайта (до восьми), плюс варианты хоста с http и www. Пробы поймали реальный баг на app-kit.dev: несуществующая статья блога отдавала 200 с noindex вместо 404. После исправления все пробы получили честный 404.

Рендер и Lighthouse запускаются постранично в очереди heavy с жёсткими лимитами времени. Страница, которая не уложилась, сохраняется как факт со статусом ошибки и не роняет весь аудит. Ещё движок измеряет вес изображений, не скачивая файлы целиком (HEAD, затем Range-запрос на один байт, затем поток с ограничением), и читает собственные JavaScript-бандлы сайта, чтобы понять, когда грузятся счётчики аналитики.

06 Отчёт, по которому можно работать

Клиентский отчёт — это HTML, свёрстанный под A4 и превращённый в PDF. У каждой проверки свой текст: что не так, почему это важно, как исправить и как проверить вручную, если автоматика не справилась. Нарушения отсортированы по потерянным баллам, рядом — затронутые страницы и факт, на котором основан вердикт. Вывод Lighthouse переведён на понятный язык, а тест-гард не пускает внутренние термины движка в текст для клиента.

Отчёт пишется на одном языке, русском или английском: язык задаётся при запуске или берётся из html lang сайта. Английские словари покрывают все проверки и несколько сотен подписей фактов, а тесты следят, чтобы в английском отчёте не было кириллицы, а в русском — служебного английского. Каждый прогон сохраняет снимок оценки, поэтому история показывает, как сайт менялся от аудита к аудиту.

07 От консольной утилиты к публичному сервису

Движок работает отдельным сервисом, а не внутри платформы App-Kit. Обход произвольных адресов — это поверхность для SSRF и непредсказуемая нагрузка, поэтому сервис живёт на своей виртуальной машине в Docker Compose: API, лёгкий воркер, тяжёлый воркер, PostgreSQL и Redis. HTTP API принимает аудит в быстром или полном режиме, проверяет API-ключ, ещё до постановки в очередь отклоняет приватные, loopback- и metadata-адреса (в том числе после DNS-резолва) и ограничивает число аудитов на IP клиента.

Прод нашёл баги, которые пропустили тесты: Lighthouse не находил Chromium в образе, Chromium падал на стандартных 64 МБ разделяемой памяти, а Celery молча отбрасывал задачу PDF, потому что её приложение не было зарегистрировано. Все три исправлены. На App-Kit движок работает как бесплатный SEO-аудит сайта онлайн: быстрый предпросмотр за секунды, затем полный аудит с живым прогрессом и PDF. Как он устроен, рассказано в статье SEO-аудит сайта онлайн: 400 проверок, оценка и PDF, а самые важные проверки собраны в чек-листе технического SEO-аудита.

08 Результат

Первый быстрый аудит app-kit.ru дал 70,5 из 100 за 19,6 секунды и перечислил 14 конкретных провалов: http без 301 на https, устаревшая директива Host в robots.txt, нет canonical на саму себя, слишком длинные title и другие. После исправлений полный аудит 18 страниц дал 93% без потерь на проверках P0, а после следующего круга быстрый аудит app-kit.ru показал 98,5%. Полный аудит с рендером и Lighthouse занимает около четырёх с половиной минут. С июня 2026 года в проекте 144 коммита, и им я проверяю свои сайты, включая этот.