Новость выходит — и через минуту о ней знают поисковики
Бэкенд регионального новостного издания на Django: редакция публикует материал в админке, а карты сайта, RSS, разметка для Google News и пуш-уведомления поисковикам собираются сами. Редактору остаётся писать, а не разбираться, почему статьи нет в выдаче.
Издание работало. Google его почти не видел
Аудит начался с фактов, а не с ощущений: read-only проверка живого прода —
robots.txt, карта сайта, RSS и сырой HTML реальной статьи.
Вывод получился неприятным и очень конкретным.
- —В карте сайта ровно 2 URL: две страницы «О редакции». Ни одной новости.
- —News-sitemap за последние 48 часов отсутствовал — Google News нечего было забирать.
- —Никаких пушей в поисковики: свежий материал ждал, пока его найдёт краулер.
- —Готовность к Google News и Discover — 45–50% по чек-листу.
- +Индекс карт сайта: страницы, новости и полные карты статей по каждому языку с пагинацией.
- +Google News sitemap с окном свежести 48 часов и лимитом 1000 URL — ровно по спецификации.
- +Три канала мгновенного обнаружения: IndexNow, WebSub, каркас Google Indexing API.
- +Редакционные QA-подсказки прямо в форме статьи — качество проверяется до публикации.
sko24.kz/sitemap.xml отдаёт индекс из
четырёх карт, а lastmod русской карты статей обновляется
в тот же день, когда выходит материал.
Шесть вещей, которые раньше делались руками или не делались вовсе
Публикация = сигнал поисковикам
Переход статьи в «опубликовано» ставит в очередь пинги в IndexNow и WebSub. Ни кнопки, ни ручного «отправить URL в вебмастер».
Редактор видит проблемы сразу
При сохранении статья проверяется на семь вещей: нет summary, короткий заголовок, нет обложки или она мельче, чем требует Discover, не указан источник фото, нет автора, нет даты, реклама без спонсора.
Материал выходит сам, в 07:00
Статус «Запланировано» + дата — и Celery beat опубликует материал в срок, а затем отправит те же пинги вручную: массовый update() сигналы не поднимает, и это учтено.
Черновик можно показать до выхода
Подписанная HMAC-ссылка на превью: главред открывает материал на сайте в реальной вёрстке, при этом статья остаётся невидимой для всех остальных.
Ни одна правка не теряется
django-reversion версионирует статьи вместе с переводами: любую редакцию текста можно поднять и сравнить — включая казахскую версию.
Реклама живёт своей жизнью
Отдельный модуль баннеров: коллекции, срок показа, автоотключение по дате. Рекламу снимают без разработчика.
Четыре шага, из которых редакция не делает ни одного
Обложка приводится в порядок
Разворот по EXIF, приведение к sRGB, даунскейл до 1200×800 LANCZOS, выбор формата по наличию альфы (WEBP или прогрессивный JPEG), отдельная чёткая миниатюра 300×200 с нерезкой маской. Имена файлов — по хэшу содержимого, поэтому CDN и браузер кэшируют их вечно.
Кэш витрины помечается устаревшим
Не сброс по таймеру и не точечное удаление ключей, а версионирование пространств имён: счётчик articles инкрементируется — и все старые ключи перестают существовать для приложения мгновенно.
Поисковики получают пуш
Только при первом переходе в «опубликовано» — повторное сохранение статьи поисковики не дёргает. Три асинхронные Celery-задачи, любая ошибка логируется и не ломает сохранение материала.
Карты сайта уже содержат новость
Они не хранятся файлами, а строятся из БД на запрос — с conditional GET по Last-Modified и Cache-Control, чтобы краул-бюджет тратился на новое, а не на повторную выкачку старого.
Решения, которые видно только в коде
Здесь нет ничего экзотического — есть аккуратность в местах, где проекты обычно ломаются.
SearchVector с весами: заголовок A, лид B, тело C; подсветка найденного через SearchHeadline, опечатки — триграммной похожестью. Отдельный конфиг словаря на язык. Одной инфраструктурной зависимостью меньше — для регионального издания это решающий аргумент.status=published и published_at <= now() — плюс готовые select_related и prefetch_related. Новая лента не приносит с собой новый N+1.Django 5.2 · DRF · Celery · PostgreSQL
У вас есть сайт. Вопрос в том, находят ли его
Медиа, каталог, портал — разница в контенте, а механика одна: пока карта сайта пустая, разметки нет, а поисковик узнаёт о публикации через неделю, весь труд редакции работает вполсилы. Это чинится за понятный объём работ.
Похожие задачи в других отраслях
Сверление и резка
Задание разбирается на отрезки профиля и уходит на станок одной кнопкой.
смотреть кейс → Логистика · операцииКурьерская CRM
Скан QR, подготовка заказов и пробег превращаются в готовый табель к концу смены.
смотреть кейс → Строительство · SaaSMetis One
Мультиарендная платформа сметного расчёта: техкарты, живые цены поставщиков, импорт чужих Excel-смет.
смотреть кейс →