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

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

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

기능

  • 새로운 공개 주제를 자동으로 제출하며, 첫 번째 게시글이나 중요한 주제 속성이 변경되면 다시 제출합니다.
  • 댓글 작성 시 제출: 새 댓글이 게시되면 페이지네이션된 URL(예: ?page=3)을 자동으로 제출하며, 스팸을 방지하기 위해 URL별 재설정 가능한 쿨다운 시간을 적용합니다.
  • 주제가 삭제되면 URL을 자동으로 제출하여 엔진이 404/410을 감지하고 빠르게 목록에서 제거하도록 돕습니다.
  • 콘텐츠 로컬라이제이션 및 크롤러 로케일 쿼리 파라미터가 활성화되면 로컬라이즈된 주제 URL을 자동으로 배치합니다. 하드코딩된 값이 아닌 실제 구성된 로케일 파라미터를 사용합니다.
  • 개별 전송 대신 정규 URL과 로컬라이즈된 URL을 단일 IndexNow urlList 배치 요청으로 묶어 전송합니다.
  • 역사적 백필(Backfill): 카테고리 및 날짜 범위로 필터링하고, 매칭 개수를 미리 확인한 후 일괄 제출합니다. 프로토콜 한도인 10,000개를 초과하는 배치에 대해 자동 청킹을 수행합니다. 활성 작업은 로그 탭에서 취소할 수 있습니다.
  • 수동 제출: 필요 시 라인별로 사용자 정의 URL을 제출할 수 있으며, 외부 또는 대상이 아닌 링크는 자동으로 필터링됩니다.
  • 지능형 속도 제한: 세밀한 슬라이딩 윈도우 알고리즘을 사용하여 시간당 및 일당 한도를 적용합니다. 429 응답 시 자동으로 백오프(후퇴)하며(Retry-After 준수). 관리자 UI에는 현재 사용량과 용량이 해제되는 정확한 시간을 보여주는 시각적 **할당량 바(Quota Bars)**가 제공됩니다.
  • 자동화된 프라이버시 필터 위에 비즈니스 레이어 규칙으로 특정 카테고리 및 태그를 제외할 수 있습니다.
  • 실수로 덮어쓰기 방지 확인 대화상자를 갖춘 키 로테이션; 이전 키는 즉시 무효화됩니다.
  • /<key>.txt의 공개 접근 가능 여부를 확인하기 위한 관리자 검증.
  • 주제 이동, 카테고리 가시성 변경, 태그 업데이트는 UI 블로킹을 방지하기 위해 백그라운드 작업에서 비동기 재제출 또는 제외 팬아웃(fan-out)을 트리거합니다.
  • 배치 ID, 로케일, 트리거 이유, 7일 성공/실패 추세 차트, 범주별 실패 이유(속도 제한, 키 오류, 도메인 불일치)가 포함된 풍부한 로그 항목.
  • 프라이버시 경계를 준수하는 완전히 비동기 제출: 개인 메시지, 제한된 카테고리, 미공개/삭제된 주제, 로그인 필요 사이트는 절대 제출되지 않습니다.
  • 영어 및 중국어 간체로 사용 가능합니다.

설정 단계

  1. 위의 가이드에 따라 플러그인을 설치하고 컨테이너를 재빌드합니다.
  2. 관리자 > 플러그인 > discourse-indexnow로 이동합니다.
  3. 설정 아래에서 키 생성을 클릭합니다(또는 기존 32자리 16진수 키를 붙여넣습니다).
  4. IndexNow 제출 활성화를 체크합니다.
  5. 키의 공개 접근 가능 여부를 확인합니다:
https://your-forum-domain.com/<key>.txt

키 문자열과 함께 HTTP 200을 반환해야 합니다. 관리자 패널에도 캐시된 녹색/적색 표시기가 표시됩니다.
6. (선택 사항) 로그 탭에서 “백필” 패널을 사용합니다: 기준을 선택하고, 미리보기를 클릭한 다음 제출을 클릭합니다.
7. (선택 사항) 수동 제출 상자를 사용하여 자동화 흐름 밖에서 개별 URL을 제출합니다.

로그 페이지에는 제출 문제를 쉽게 진단할 수 있도록 할당량 사용량 바, 7일 추세 차트, 실패 분석 지표가 제공됩니다.

구성 설정

설정 설명
indexnow_enabled 마스터 스위치. login_required가 활성화되면 자동으로 비활성화됩니다.
indexnow_api_key 제출 검증을 위한 32자리 16진수 키.
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은 크롤러 로케일 파라미터가 활성화되고 로컬라이즈된 콘텐츠가 존재할 때만 제출됩니다.
  • 현재 첫 번째 게시글 편집과 새 댓글 페이지네이션은 지원되지만, 중간 댓글의 편집은 독립적으로 제출을 트리거하지 않습니다.

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

7개의 좋아요

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

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

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

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

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

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

2개의 좋아요

병합했습니다.

코드베이스에 대해 이렇게 깊이 있게 분석해 주셔서 감사합니다. 슬라이딩 윈도우 버킷팅 로직과 백그라운드 작업 배치 처리는 확실한 개선점입니다. 답장 트리거도 아주 좋은 아이디어였네요.

추가한 새로운 쿼터 바와 쿨다운 설정을 주요 게시물 문서에 반영했습니다.

고품질 PR과 상세한 설명을 작성해 주셔서 정말 감사합니다. :content:

1개의 좋아요