Federation support for Discourse

Discourse에서 구현할 수 있는 아웃바운드(외부) 연동 지원 아이디어로, Brid.gy를 통해 중재된 웹멘션(Webmention)을 제안합니다.

플로우 개요:

  • 첫 번째 게시글에 링크를 포함하여 토픽 생성 - 초기 단계에서는 첫 번째 게시글의 단일 링크 또는 제목에 붙여넣은 URL을 감지
  • 선택 사항: 자잘한 스팸을 방지하기 위해 첫 번째 답변을 기다리거나 사이트 설정을 활성화
  • 해당 페이지가 웹멘션을 지원하는지 탐지
  • "이 페이지는 =SITE_DOMAIN=에서 논의되고 있습니다: “=TITLE=” =TOPIC_LINK= =CATEGORY_AND_TAGS="라는 텍스트와 함께 웹멘션 댓글을 전송 (사이트 기본 로케일 사용).
  • 사이트가 웹멘션을 수신하고(필요시 fed.brid.gy에 위임, 스팸 방지 적용 등) 결국 이를 댓글로 표시합니다.

액터(댓글 “작성자”)는 고품질 사이트 로고 또는 @system 아바타를 사용하며, 포럼의 짧은 이름을 사용합니다.

6개의 좋아요

안녕하세요, 원포스트 작성자입니다

참고로, 게시물에서 언급하지는 않았지만 이 프로토콜은 답글과 마찬가지로 '좋아요’와 '재게시’를 1급 시민(first-class citizen)으로 전송하는 것을 지원합니다. 디스커스(Disourse)에서도 이 기능이 구현되면 좋겠습니다.

Pavilion은 Discourse에 연동(federation) 지원을 추가하기 위해 NLnet에 40,000유로 규모의 보조금 신청서를 제출했습니다. 그러나 이는 거절되었고, 결국 DAPSI 프로그램에 신청하여(그리고 승인받아) 참여하게 되었습니다.

12개의 좋아요

업데이트 소식입니다. Pavilion과 CDCK(Discourse.org)는 Discourse용 ActivityPub 플러그인을 구축하는 것을 논의하고 있습니다. 충분한 논의를 거쳐 아래 명세에 도달했습니다. 최종 확정 전까지 의견이나 제안을 환영합니다. 참고할 점은 다음과 같습니다.

  • 수신 콘텐츠(예: Mastodon 등에 있는 게시글을 Discourse로 가져오는 것)에 대한 지원은 의도적으로 제외되었습니다. 이는 후속 버전에서 추가할 수 있습니다.

  • 사용자 팔로우(카테고리 팔로우와 달리)에 대한 지원도 의도적으로 제외되었습니다. 이 역시 후속 버전에서 추가할 수 있습니다.

  • 명세의 상당한 부분은 Lemmy가 채택한 방식을 따르고 있습니다.

  • Pavilion은 MVP 플러그인을 구축할 예정이며(저는 이 작업에 참여할 것입니다), CDCK는 이를 소유하고 호스팅할 것입니다(즉, Pavilion 플러그인이 아닌 CDCK 플러그인이 됩니다).

개요

Discourse용 ActivityPub(AP) 플러그인입니다.

이 플러그인의 목표는 ActivityPub, ActivityVocab 및 ActivityStreams 명세의 MVP 구현을 Discourse에서 달성하는 것이며, AP 준수 플랫폼인 Mastodon에 대한 MVP 기능의 통합을 하나의 사례로 보여주는 것입니다. 가능한 한 구현은 프로토콜의 추가 지원 및 모든 확장성을 지원하도록 구축될 것입니다.

이 명세는 AP 지원이 활성화된 카테고리에서 해당 카테고리의 각 토픽의 첫 번째 게시글만 연방화(“​첫 번째 게시글만”)되도록 카테고리별 AP 지원을 활성화하는 것에 관한 것입니다.

사용자

플러그인 사용법은 메타(meta)의 플러그인 토픽에서 포괄적으로 문서화될 것입니다.

일반 사용자

  1. 카테고리 핸들(예: @announcements@meta.discourse.org)을 사용하여 Mastodon(또는 기타 Fediverse 서비스)에서 연방화(Discourse)가 활성화된 Discourse 카테고리(FDC)를 구독(또는 “팔로우”)합니다.

  2. Mastodon 피드에서 FDC 토픽의 첫 번째 게시글 발췌(구독한 이후에 게시된 것)를 확인하며, 각 발췌에는 관련 토픽으로 돌아가는 링크(예: “포럼에서 논의하기”)가 포함됩니다.

  3. Mastodon에서 해당 게시글과 관련된 모든 작업은 Discourse에 표시되지 않습니다.

  4. Discourse에서 해당 게시글과 관련된 모든 작업은 Mastodon에 표시되지 않습니다.

  5. 연방화된 게시글 발췌는 토픽 발췌 제어를 위해 사용되는 것과 유사한 마크업을 사용하여 게시글 작성자가 제어할 수 있습니다. 예: <div class="note">{text}</div>

관리자

  1. 카테고리 설정을 사용하여 카테고리별로 연방화를 활성화합니다. 공개 인스턴스에서 연방화는 "모두"에게 표시되는 카테고리에서만 활성화할 수 있습니다.

  2. 카테고리 설정 UI를 통해 카테고리의 연방화 사용자명을 설정합니다(변경 불가).

  3. 사이트 설정을 통해 활동이 자동으로 허용되거나 거부되는 도메인의 허용 목록과 거부 목록을 설정합니다.

  4. 서버 아웃박스(outbox)의 Block 객체에 포함될 연방화 사용자명의 "차단 목록"을 설정합니다.

  5. 사이트 설정(예: activitypub_note_excerpt_maxlength)을 사용하여 연방화 노트의 최대 문자 길이를 설정합니다.

  6. "커스터마이즈 > 텍스트"에서 연방화 Discourse 토픽의 첫 번째 게시글에 포함된 링크와 연관된 텍스트를 설정합니다.

  7. 연방화된 게시글에 포럼으로 돌아가는 링크(및 텍스트)를 포함할지 여부를 카테고리별로 설정합니다.

  8. 사이트 설정을 통해 연방화 콘텐츠를 서명하기 위한 키 페어를 추가합니다.

기술적 사항

  1. 이 플러그인은 포괄적인 테스트(유닛/통합 및 js 테스트)를 포함할 것입니다.

  2. 카테고리는 Discourse 내에서 자동화된 ActivityPub Actor입니다(Group ActorType으로). 연방화 preferredUsername은 관리자가 연방화를 활성화할 때 설정되며 카테고리 커스텀 필드에 저장됩니다. 연방화 이름(또는 표시 이름)은 카테고리의 full_name입니다.

  3. 사용자는 카테고리 Actor가 연방화하는 콘텐츠 내의 Actor입니다. 연방화 preferredUsername은 연방화 시점의 사용자 Discourse 사용자명입니다. 사용자가 Discourse 사용자명을 변경할 경우를 대비하여 사용자의 preferredUsername은 사용자 커스텀 필드에 저장됩니다. 연방화 이름(또는 표시 이름)은 사용자의 Discourse 이름입니다.

  4. 일반적으로 ActivityPub 객체는 적절한 경우 커스텀 필드(예: 객체 또는 액터 ID)를 사용하여 해당 Discourse 객체와 연관되고, 적절한 경우 새로운 테이블(예: 인박스(inbox)와 아웃박스(outbox))가 사용됩니다.

  5. 구현할 주요 ActivityPub Activity는 Follow이며, 이를 구현하는 데 필요한 관련 활동 및 모델(즉, 인박스, 아웃박스 및 필요한 관련 Actions와 Collections)입니다.

  6. Discourse 게시글은 ActivityStream Notes로 연방화되며, 콘텐츠는 HTML로 제공됩니다.

  7. 인증은 HTTP Signatures를 사용하여 처리됩니다. 여기와 여기를 참조하세요. ActivityPub 명세의 모든 기타 보안 고려 사항은 적절히 처리될 것입니다.

  8. 연방화 엔드포인트는 명세에 맞게 적절하게 보호됩니다. 즉, 컨트롤러에서 redirect_to_login_if_required가 사용되도록 하고, 모든 사용자가 볼 수 있는 카테고리 권한에 대한 가디언(guardian)을 추가합니다.

34개의 좋아요

이렇게 야심 찬 프로젝트를 진행해 주셔서 감사해요. 큰 관심으로 지켜볼게요 :slight_smile:

7개의 좋아요

이 소식이 정말 기대됩니다! 감사합니다! 또한, 상투적으로 말하듯 코끼리를 통째로 삼키려 하지 않고 간단한 초기 구현으로 시작하는 것도 좋습니다(마스토돈에 대한 우회적 언급은 아닙니다). 아무것도 추가하라고 권하고 싶지는 않지만, 제안을 요청하셨으니 제가 생각하기에 그다지 큰 추가 작업이 아닐 것 같은 제안을 하나 드리겠습니다:

inReplyTo를 사용하여 답글의 발췌본도 선택적으로 게시하는 것은 어떻게 생각하시나요? 이렇게 하면 디스코스에서 이루어지는 대화를 더 잘 부각시킬 수 있고, 더 친근하게 느껴질 것이라고 생각합니다. "우리 포럼에서 논의하기"와 함께 대화를 볼 수 있게 되면 더 많은 사람들이 참여할 가능성이 높을 것으로 예상합니다.

4개의 좋아요

피드백과 지원을 해주셔서 감사합니다!

현재 단계에서 답변을 연동(federation)하는 것의 문제는, 이를 제대로 지원하기 전까지는 충족되지 않을 참여 기대감을 만들어낼 수 있다는 점입니다. 여기서 사용자 기대치를 명확히 유지하는 것이 중요합니다. 일부 사용자는 이러한 연동된 답변의 제한 사항을 이해할 수 있지만, 그렇지 않은 사용자도 있을 수 있습니다. 또 다른 문제는 한 번에 해결해야 할 기술적 과제들의 수를 줄이려는 것입니다.

그럼에도 불구하고, 위에서 보시는 “첫 게시물만” 사양에 “전체 토픽” 확장을 이미 검토해 보았습니다. 이것이 어디로 향할 수 있는지에 대한 감을 잡을 수 있도록 아래에 관련 기술 노트 일부를 공유합니다. 다만 “전체 토픽” 확장은 초기 사양의 일부가 아니며, 현재 단계에서는 단지 가능성에 불과하다는 점을 강조하고 싶습니다.

전체 토픽 확장
  1. 수신된 노트(Note)는 새 토픽이나 답변으로 게시됩니다(inReplyTo 또는 Replies 사용).

  2. 수신된 객체에 대해 Accept / Reject objects를 사용하여 가능한 한 Discourse의 보안 및 스팸 필터가 적용됩니다.

  3. 노트 게시물은 액터 ID와 관련이 있는 스테이징(staged) 사용자에게 커스텀 필드를 통해 귀속됩니다. 이는 사용자가 실제 이메일을 갖지 않으므로(연동된 액터의 ID와 preferredUsername을 사용하여 플레이스홀더를 생성할 수 있음) 이메일 기반이 아닌 스테이징 사용자 개념의 변형이 필요합니다.

  4. 스테이징된 ActivityPub 사용자를 표준 Discourse 사용자와 연결하는 것은 가능하지만, 현재 이 사양의 어느 부분에도 포함되지 않았습니다. 이는 “연동된 신원(federated identity)” 및 그와 관련된 해결책의 문제입니다.

  5. 연동된 게시물은 연동된 @멘션을 지원하지 않으며, 핵심 ActivityPub/Stream 사양을 벗어나는 기타 유사한 기능도 지원하지 않습니다. 이러한 기능의 지원은 Webfinger나 Mastodon을 사용하는 등의 방식으로 후속 버전에서 추가될 수 있습니다.

이 첫 번째 버전의 핵심은 최소 실행 가능 구현(MVP)에 집중하는 것입니다. 그 기반이 마련되면, 이러한 “전체 토픽” 노트의 방향에 따라 더 완전한 연동 지원이 실현 가능해질 것입니다. 다만 이 플러그인의 방향성은 CDCK가 결정할 사항이라는 점을 강조하고 싶습니다. 여기서 언급하는 내용은 모두 기반 사양 위에 구축될 수 있는 가능한 방식들일 뿐입니다.

6개의 좋아요

Fediverse의 일부 게시물과 진행 중인 토론:

P.S. 지난 11월에 Flarum의 핵심 개발자인 Daniël Klabbers가 저에게 접근하여 ActivityPub 확장 기능을 개발 중이라고 알려주었습니다. 현재 상태는 알 수 없지만, 포럼(Forums) 도메인 내의 모든 프로젝트가 협력하여 해당 영역에서 최대한의 상호운용성을 확보하는 것이 좋을 것입니다.

상호운용성에 관하여, Codeberg의 Fediverse Enhancement Proposal(FEP) 프로세스도 언급하고 싶습니다:

예를 들어 Lemmy는 최근 ActivityPub 그룹에 대한 FEP를 최종 확정했습니다. 토론은 SocialHub에서 진행됩니다:

(Fediverse의 성장과 함께 FEP 프로세스가 탄력을 받고 있으며, 현재 프로토콜 메커니즘을 표준화하는 최선의 장소입니다)

4개의 좋아요

@aschrijver 감사합니다, 정말 유용합니다! 저는 위에서 명세된 MVP 구현에 집중하여 CDCK와 긴밀히 협력할 예정입니다. @mcdanlj의 간결한 표현대로, 그 노력이 “코끼리를 통째로 삼키려” 하지 않는 것이 매우 중요합니다. 명세에 대한 건설적인 피드백, 특히 기술적 측면에 대한 의견을 듣고 싶습니다.

다만, Pavilion의 다른 두 멤버인 @nmeyne(SSI 커뮤니티의 베테랑, 특히 검증 가능한 자격 증명 분야에 강점이 있음)와 @merefield도 이 분야에서 일하고 있으며, 그들이 제기한 보다 광범위한 질문들에 관심이 있습니다.

6개의 좋아요

좋습니다, 감사합니다. Daniël Klabbers에게 DM으로 위 공지사항을 참고하도록 미리 알려드렸습니다.

3개의 좋아요

저에게는 완전히 이해가 됩니다!

충실도에 대한 착각으로 인해 발생하는 실제 오해의 예를 들어 설명하자면, 우리가 겪은 문제 중 하나는 구글 플러스(Google+)가 사라질 때 그 커뮤니티를 대량으로 가져온 메이커 포럼(Maker Forums)의 사례입니다. 가져오기가 매우 높은 충실도로 수행되었기 때문에, 해당 사이트를 처음 방문하는 사용자들은 구글 플러스에서 아직 (아직) 이 사이트로 오지 않은 다른 사용자와 상호작용을 하려고 하고 있다는 사실을 깨닫지 못합니다. 그래서 우리는 그들이 대화하려는 상대가 응답할 수 있는 위치에 있지 않다는 것을 알리는 표준 답변을 준비해 두었습니다.

“전체 주제 확장(whole topic extension)” 아이디어에 대한 세부 정보를 제공해 주셔서 감사합니다.

5개의 좋아요

이 기능이 나중에 추가된다면… 참고로, Pterotype for Wordpress가 제공한 방식을 정말 좋아합니다. 이 방식은 연방화(연동)된 댓글이 원본 포럼 주제에 답글로 게시되기 전에 직접 모더레이션/그룹 승인 절차를 거치도록 하는 것입니다.

포럼의 경우, 이는 스태프보다는 TL4/TL3 유형이 더 잘 수행할 수 있는 작업일 수 있습니다.

개인적으로 이 방식이 주제와 무관한/소셜 미디어 스타일의 답글이 원본 토론 주제를 압도하는 것을 방지하는 데 특히 유용하다고 생각합니다.

4개의 좋아요

네, 수신 콘텐츠에 대해 검토 대기열(review queue)을 사용하는 것은 우리가 논의해 온 사항입니다. 지적하신 대로, 이는 해당 단계에 도달했을 때(첫 번째 버전에서는 아닙니다) 고려해야 할 문제입니다.

이 작업과 관련된 행정적인 문제들이 해결되었으므로, 다음 주부터 사양 문서 작업에 착수할 예정입니다. 사양 문서에 대한 추가적인 기술적 피드백이나 의견은 언제든지 환영합니다.

이것이 fruition(구체적인 결과)로 이어지기까지는 몇 달이 걸릴 것이므로, 조금만 기다려 주십시오.

5개의 좋아요

Discourse에서 게시물이 삭제되면 팔로워들에게 Delete 액션이 전송될 수 있나요?

Maker Forums에서는 "구글 포인트"가 충분히 높아 SEO 스팸이 많이 유입됩니다. 새로운 사용자의 일반적인 사용 형태 중 하나는 사이트 관련 도움을 구하는 좌절된 사람이므로, 우리는 신규 사용자에게 비교적 느슨한 권한을 부여하고 있습니다. 이렇게 하면 그들을 더 빠르게 도울 수 있습니다. 하지만 이 때문에 스팸이 스팸 게시물을 올린 후 비교적 빠르게 스팸으로 플래그가 걸리고, 목록에서 제외되며, 결국 삭제되는 경우가 많습니다.

연동(federated)된 게시물이 삭제되고 Delete를 통해 그 삭제가 공개되어 연동 캐시에서 스팸이 정리되기를 바랍니다. 이것이 범위(scope) 내에 가능한 일일까요?

4개의 좋아요

이 경우, 스팸을 처리할 수 있도록 몇 시간 정도의 연동(페더레이션) 지연이 있으면 도움이 될 수 있습니다. (상대적으로 신규 사용자의 첫 게시물에만 지연을 적용하는 것도 고려해 볼 수 있겠죠?)

3개의 좋아요

두 가지 모두 유용한 제안입니다. 감사합니다.

질문하신 이유와 같은 맥락에서, MVP(최소 기능 제품) 단계에서 이를 구현할 것으로 예상합니다. 적절한 시점에 Discourse 팀과 이를 더 논의하겠습니다.

유용한 제안입니다. 연동은 비동기적으로 definitely 진행될 것입니다. MVP에서 이러한 지연 시간을 어떻게 설정하고 처리할지는 어떤 형태로든 다뤄야 할 문제입니다.

특히 이전 사용 사례나 기술적 전문 지식을 바탕으로 한 MVP에 대한 구체적인 제안은 언제나 환영합니다.

3개의 좋아요

초기 작업량이 크게 증가하지 않는다면, 게시물 수정도 Update 활동으로 연동하는 것이 가치 있을 것입니다. MVP 이후에 기여할 수 있는 사항 중 하나라면, 나중에 이를 추가하는 것을 합리적으로 수용할 수 있는 설계가 이상적입니다.

참고로, 제 인스턴스에서는 지연 시간을 낮게 설정하겠습니다. 스팸 게시물 연동을 피하기 위해 이를 사용할 계획은 없습니다. 이는 합리적으로 우리 Discourse로 연방 우주 피드를 보고 있던 관리자(Moderator)를 끌어와 조치를 취하게 만드는 신호가 될 가능성이 높기 때문입니다. 나는 오타 수정을 위해 chat_integration_delay_seconds를 20으로 설정해 두고 있으며, 여기서도 유사한 조치를 취할 것으로 예상합니다. 최소한 해당 설정은 이러한 지연에 대한 선례를 마련합니다. :smiling_face:

2개의 좋아요

간단한 업데이트를 공유합니다! 개발이 한 달째 접어들었으며, 대략적으로 다음과 같은 기능들이 작동하고 있습니다.

  • ActivityPub가 활성화된 카테고리를 팔로우할 수 있습니다.
  • ActivityPub가 활성화된 카테고리의 첫 번째 게시물이 팔로워들에게 연동(federate)됩니다.

작은 기능들도 몇 가지 있지만, 지금은 자세히 언급할 단계는 아닙니다. 내부 테스트를 시작하기까지는 최소 한 달 이상의 개발 기간이 더 필요합니다.

요약하자면, 개발은 순조롭게 진행되고 있습니다 :slight_smile:

14개의 좋아요

정말 대단하네요, 공유해 주셔서 감사합니다.

중앙 서비스의 승인 여부와 관계없이 우리가 구축할 수 있는 모든 측면에서 자유가 필요합니다.

이것은 모든 CEO, CTO, 혹은 그 외 기이한 직함의 의사결정권자들에게도 막을 수 없는, 그리고 허가 없이 진행할 수 있는 일입니다. :slight_smile:

참여해 주신 모든 개발자분들과 그들이 이룬 진전에 큰 감사를 드립니다. 공개되면 직접 테스트해 보고 제 생각을 공유하겠습니다.

1개의 좋아요

좋네요, 그렇다면 태그에도 적용할 수 있을까요? 현재 사용자는 RSS를 통해 우리의 태그를 구독하고 있습니다.

어쨌든, 축하합니다! 정말 기대가 됩니다.