Discourse-indexnow — 토픽 생성 또는 수정 시 Bing과 Yandex에 즉시 알림

:information_source: 요약 새로 생성된, 수정된, 삭제된 공개 주제 URL을 IndexNow 프로토콜에 자동으로 제출하여 Bing, Yandex 및 기타 참여 검색 엔진이 크롤링을 기다릴 필요 없이 몇 분 만에 콘텐츠를 발견하거나 색인에서 제외(de-index)할 수 있도록 합니다.
:hammer_and_wrench: 저장소 링크 github.com/imlotso/discourse-indexnow
:open_book: 설치 가이드 Discourse에 플러그인 설치 방법

더 많은 배경 정보를 담은 중국어 문서도 제 포럼에서 확인할 수 있습니다: sitetalk.net/t/topic/642.


기능

  • 새 공개 주제가 생성되면 자동으로 제출하고, 첫 번째 게시물이나 주요 속성이 수정되면 재제출합니다.
  • 주제가 삭제되면 해당 URL을 자동으로 제출하여 검색 엔진이 404/410 오류를 더 빠르게 감지하고 색인을 더 빨리 제외할 수 있게 합니다.
  • 콘텐츠 로컬라이제이션과 크롤러 로케일 파라미터가 활성화된 경우, 로컬라이제이션된 주제 URL이 메인 URL과 함께 자동으로 포함됩니다 — Discourse의 실제 로케일 쿼리 파라미터를 사용하며(절대 하드코딩되지 않음).
  • URL당 하나의 요청이 아닌, IndexNow urlList 배치 요청으로 주요 URL과 모든 기존 로컬라이제이션을 함께 제출합니다.
  • 역사적 백필(Historical backfill): 카테고리와 날짜 범위로 주제를 필터링하고, 일치하는 결과를 미리 본 후 한 배치로 제출합니다 — 동일한 배치 엔진을 재사용하며, 프로토콜의 10,000개 URL 한도를 자동으로 분할합니다. 대기 중이거나 진행 중인 배치(예: 실수로 크기가 과도한 백필)는 Logs 탭에서 직접 취소할 수 있습니다.
  • 수동 제출: 요청 시 특정 링크를 제출하기 위해 한 줄에 하나씩 URL을 붙여넣습니다. 외부 또는 제출 대상이 아닌 URL은 자동으로 필터링됩니다.
  • 시간당/일당 제출 한도가 있으며, IndexNow가 429를 반환하면 자동 백오프가 적용됩니다(Retry-After 헤더가 존재하는 경우 이를 준수).
  • 아래 자동 프라이버시 필터 외에도 특정 카테고리 및 태그를 제출에서 제외합니다.
  • 키 로테이션 지원 — 새 키를 생성하면 이전 키가 즉시 무효화됩니다.
  • 관리 패널에 직접 표시되는 /<key>.txt 파일의 가용성 내장 검사 기능.
  • 카테고리가 이동되거나 카테고리의 가시성/태그가 변경될 때 주제를 자동으로 재제출(또는 제외)합니다.
  • 제출 로그는 배치 ID, 로케일, 트리거 이유(생성/수정/삭제/카테고리 변경/백필/수동), 7일 성공/실패 추이, 실패 이유 분류(레이트 리밋 / 키 오류 / 도메인 불일치 / 기타)를 추적합니다.
  • 모든 제출은 Sidekiq를 통해 비동기적으로 실행되며 자동 제출과 동일한 프라이버시 필터를 거칩니다 — 어떤 것도 제외 규칙(개인 메시지, 제한된 카테고리, 미등록/삭제된 주제, 로그인 필수 사이트)을 우회하지 않습니다.
  • 관리 UI는 영어와 간체중국어 버전으로 제공됩니다.

설정

  1. 플러그인을 설치하고(위 설치 가이드 참조) 컨테이너를 재빌드합니다.
  2. 관리자 > 플러그인 > discourse-indexnow로 이동합니다.
  3. 설정 탭에서 키 생성을 클릭합니다(또는 다른 곳에서 이미 등록한 기존 32자 자리 16진수 키를 붙여넣습니다).
  4. IndexNow 제출 활성화 상자를 체크합니다.
  5. 키가 아래 주소에서 공개적으로 접근 가능한지 확인합니다:
    https://your-forum.example/<key>.txt
    
    키가 일반 텍스트로 HTTP 200을 반환해야 합니다. 관리 패널도 이 검사를 자동으로 실행하여 “key.txt 접근 가능” 옆에 캐시된 녹색/적색 상태를 표시합니다.
  6. (선택 사항) 로그 탭에서 백필 패널을 사용하여 과거 주제를 제출합니다 — 카테고리와 날짜 범위를 선택하고, 미리보기를 클릭하여 일치하는 주제 수를 확인한 후 제출합니다. 진행 중인 경우 같은 탭에서 배치를 취소할 수 있습니다.
  7. (선택 사항) 수동 제출 필드를 사용하여 정규 자동 플로우 외에 즉시 제출할 일회성 URL을 한 줄에 하나씩 붙여넣습니다.

로그 탭에는 7일 성공/실패 추이 차트와 실패 이유 분류도 표시되어 제출이 레이트 리밋에 걸렸는지, 키 불일치로 거부되었는지, 또는 다른 이유로 실패했는지 한눈에 파악할 수 있습니다.

설정 항목

이름 설명
indexnow_enabled 플러그인의 마스터 스위치. login_required가 켜져 있을 때 활성화할 수 없으며, 나중에 login_required가 켜지면 자동으로 비활성화됩니다.
indexnow_api_key 제출 인증에 사용되는 현재 32자 자리 16진수 키.
indexnow_submit_on_create 새 공개 주제가 생성되면 자동으로 제출.
indexnow_submit_on_edit 첫 번째 게시물 또는 주제 속성이 변경되면 자동으로 재제출.
indexnow_excluded_category_ids 공개되어 있더라도 항상 제외할 추가 카테고리.
indexnow_excluded_tag_names 주제의 카테고리가 그 외 조건을 충족하더라도 항상 제외할 추가 태그.
indexnow_hourly_limit 시간당 제출할 최대 URL 수.
indexnow_daily_limit 일당 제출할 최대 URL 수.

알려진 제한 사항

  • Google은 IndexNow 프로토콜에 참여하지 않습니다.
  • 로컬라이제이션된 URL은 크롤러 로케일 파라미터가 활성화되어 있고 해당 주제에 로컬라이제이션이 실제로 존재할 때만 제출됩니다.
  • 현재 제출은 주제의 첫 번째 게시물만 포함합니다 — 이후 답변에 대한 중요한 수정은 아직 재제출을 트리거하지 않습니다.

이것은 독립적이고 비공식적인 플러그인이며 Discourse 팀에서 유지 관리하지 않습니다. 제 자체 포럼에서 프로덕션 환경으로 운영 중이며, 모든 push/PR마다 CI가 실행되는 RSpec 테스트 커버리지가 있습니다. GitHub 이슈나 여기 댓글을 통한 버그 보고나 기능 요청을 환영합니다.

7개의 좋아요

감사합니다! 마침 제가 막 'Indexnow 플러그인을 직접 만들어야 하나?'라고 생각하고 있었는데, 바로 이걸 찾았네요!

indexnow_submit_on_edit가 콘텐츠가 변경되는 모든 rebake 시점에 Indexnow 제출을 수행하는지 알려줄 수 있을까요?

아니요 — 이 플러그인은 일반적인 PostRevisor 플로우를 통한 실제 편집 시에만 발동하며, 해당 토픽의 첫 번째 게시물(OP)에 대해서만 적용됩니다. OP가 아닌 답변이나 시스템에 의해 트리거되는 재처리(이미지 수정 크론, 관리자 일괄 재처리 등)는 재제출을 트리거하지 않습니다. 이는 해당 작업들이 이 플러그인이 연결되는 이벤트를 거치지 않기 때문입니다.

지난 한 달간 이 플러그인을 사용해 왔는데, 전반적으로 훌륭했습니다. 제가 원하는 대로 정확히 작동했지만, 설치 직후 플러그인이 즉시 실패하는 몇 가지 버그를 경험했습니다.

구체적으로, 동일한 엔드포인트를 사용하는 다른 플러그인들과의 라우트 충돌을 발견했습니다. 또한 속도 제한(rate limiting) 관련 문제도 있었는데, 제출(submission)이 한도에 도달하면 몇 분을 기다린 뒤 다시 한도에 도달하는 상황이 발생했습니다. 아울러 관리자 패널의 스타일시트가 공개 영역에 주입되고 있었고, 플러그인을 위한 CSS 클래스가 올바르게 접두사(prefix) 처리되지 않았습니다.

또한 제가 정말 원했던 기능을 추가했습니다. 바로 주제(topic)에 답글이 있을 때 제출할 수 있는 기능입니다. 이 제출은 특정 페이지 번호를 기준으로 작동하여 전체 주제를 처리하지 않도록 설계되었습니다. 수백 개의 답글이 있는 주제의 경우 마지막 페이지만 제출하므로, 크롤러가 답글을 더 빠르게 찾아 주제를 업데이트할 수 있습니다.