discourse-indexnow — автоматическое уведомление Bing и Yandex после создания или редактирования темы

:information_source: Описание Автоматическая отправка URL открытых тем после их создания, редактирования и удаления по протоколу IndexNow, чтобы совместимые поисковые системы, такие как Bing и Yandex, могли обнаружить или удалить ваш контент за считанные минуты, а не ждать, пока краулеры постепенно проиндексируют его.
:hammer_and_wrench: Репозиторий github.com/imlotso/discourse-indexnow
:open_book: Руководство по установке How to install plugins in Discourse

Возможности

  • Автоматическая отправка при создании новой темы; автоматическая повторная отправка при редактировании, если изменён первый пост или ключевые параметры темы.
  • Отправка при ответе: при появлении нового ответа автоматически отправляется URL соответствующей страницы (например, ?page=3), также поддерживается время охлаждения для одного URL, чтобы предотвратить частые повторные отправки.
  • Автоматическая отправка URL при удалении темы, что помогает поисковым системам быстрее обнаружить 404/410 и ускорить удаление контента из индекса.
  • При включённой локализации контента и параметре locale для краулера автоматически отправляются URL локализованных тем — используются реальные параметры locale, настроенные в Discourse, без хардкода.
  • Объединение основного URL и уже существующих локализованных URL в один пакетный запрос IndexNow urlList, а не поочерёдная отправка.
  • Пополнение исторических записей: фильтрация тем по категориям и диапазону дат, предварительный просмотр результата, затем пакетная отправка — используется тот же механизм пакетной отправки, а при превышении лимита в 10 000 URL за раз автоматически происходит разбиение на части. Пакеты, которые всё ещё обрабатываются (например, при выборе слишком большого диапазона), можно отменить на вкладке журналов.
  • Ручная отправка: достаточно вставить URL по одному в каждую строку, чтобы отправить выбранные ссылки в дополнение к обычному автоматическому процессу; внешние ссылки и неподходящие темы автоматически фильтруются.
  • Интеллектуальное ограничение и управление квотами: поддержка hourly/daily лимитов на основе скользящего окна (sliding window). При получении ответа 429 от IndexNow автоматически применяется экспоненциальная задержка (приоритет отдаётся заголовку Retry-After). В панели администратора отображается наглядный индикатор использования квоты и обратный отсчёт до её восстановления.
  • Поддержка исключения определённых категорий и тегов, добавляя слой бизнес-логики поверх автоматической фильтрации конфиденциальности.
  • Поддержка ротации ключей (с подтверждением для предотвращения случайных нажатий); при генерации нового ключа старый сразу перестаёт действовать.
  • Встроенная проверка доступности /<key>.txt в панели администратора.
  • При перемещении темы между категориями, изменении видимости категории или обновлении тегов автоматически выполняется асинхронная повторная отправка или исключение; массовые операции не блокируют страницу.
  • Журналирование ID пакета, locale, причины (создание / редактирование / удаление / изменение категории / пополнение / ручная), трендов успешных/неуспешных отправок за последние 7 дней, а также классификация причин ошибок (ограничение / ошибка ключа / несоответствие домена / другое).
  • Все отправки выполняются асинхронно и проходят через ту же логику фильтрации конфиденциальности, что и автоматическая отправка: личные сообщения, ограниченные категории, темы без списка / удалённые, а также сайты с требованием входа — никогда не отправляются.
  • Интерфейс управления доступен на английском и китайском (упрощённом) языках.

Шаг настройки

  1. Установите плагин согласно руководству выше, выполните перезагрузку контейнера.
  2. Откройте Admin > Plugins > discourse-indexnow.
  3. На вкладке Settings нажмите Generate key (или введите 32-значный шестнадцатеричный ключ, зарегистрированный ранее).
  4. Отметьте галочку Enable IndexNow submissions.
  5. Убедитесь, что ключ доступен из интернета:
https://<домен-вашего-форума>/<key>.txt

Должен возвращаться HTTP 200, а содержимое — сам ключ. Панель администратора также автоматически выполняет эту проверку и показывает зелёный/красный статус с учётом кэша рядом с надписью «key.txt доступен».
6. (по желанию) На вкладке Logs используйте панель «пополнение»: выберите категорию и диапазон дат, нажмите Preview, чтобы увидеть количество совпадений, затем Submit. Если пакет всё ещё обрабатывается, его можно отменить на той же странице.
7. (по желанию) Используйте поле ручной отправки: вставьте URL по одному в каждую строку, чтобы немедленно отправить выбранные ссылки помимо обычного автоматического потока.

На странице журналов также отображается индикатор использования квоты, график успешных/неуспешных отправок за последние 7 дней и статистика по причинам ошибок, что позволяет одним взглядом понять, была ли ошибка связана с ограничением, несоответствием ключа или другой причиной.

Параметры конфигурации

Название Описание
indexnow_enabled Общий переключатель плагина. Не может быть включён, если на сайте установлен login_required; если этот параметр активируется позже, плагин автоматически отключается.
indexnow_api_key Текущий 32-значный шестнадцатеричный ключ, используемый для проверки при отправке.
indexnow_submit_on_create Автоматическая отправка при создании новой открытой темы.
indexnow_submit_on_edit Автоматическая повторная отправка после изменения первого поста или атрибутов темы.
indexnow_submit_on_reply Автоматическая отправка URL страницы с ответом при появлении нового ответа.
indexnow_url_cooldown_minutes Время охлаждения (в минутах) для предотвращения частых повторных отправок одного и того же URL.
indexnow_excluded_category_ids Дополнительные исключаемые категории; даже если категория публичная, её темы не будут отправляться.
indexnow_excluded_tag_names Дополнительные исключаемые теги; даже если тема соответствует критериям отправки, она не будет отправлена.
indexnow_hourly_limit Максимальное количество URL, отправляемых за час (на основе скользящего окна).
indexnow_daily_limit Максимальное количество URL, отправляемых за день (на основе скользящего окна).

Известные ограничения

  • Google пока не присоединился к протоколу IndexNow.
  • Локализованные URL отправляются только при включённом параметре locale для краулера и при наличии соответствующего локализованного контента.
  • На данный момент поддерживаются редактирование первого поста и изменение страниц с ответами, однако отдельное редактирование промежуточных постов не запускает повторную отправку.

Это плагин независимого разработчика, не поддерживаемый официально Discourse. Он уже работает на моём личном форуме в продакшене, сопровождается тестами RSpec и проходит CI при каждом push/PR. Буду благодарен за обратную связь и предложения о функциях через GitHub issue или ответы в этой теме.