ActivityPub 플러그인

이 플러그인을 설치하려고 했지만 /logs에 항상 다음과 같은 경고가 표시됩니다:

[Discourse Activity Pub] https://futarino.online/ap/actor/a3838865a250342cf09f7907b653b9d1 failed to schedule https://futarino.online/ap/activity/2628ea98d33a52fd2412f9d59541bb91 for delivery: no recipients

백트레이스:

/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/delivery_handler.rb:73:in `log_failure' 
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/delivery_handler.rb:31:in `can_deliver?' 
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/delivery_handler.rb:16:in `perform' 
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/delivery_handler.rb:23:in `perform' 
/var/www/discourse/plugins/discourse-activity-pub/app/models/concerns/discourse_activity_pub/ap/model_callbacks.rb:143:in `activity_pub_deliver_activity' 
/var/www/discourse/plugins/discourse-activity-pub/app/models/concerns/discourse_activity_pub/ap/model_callbacks.rb:33:in `perform_activity_pub_activity' 
/var/www/discourse/plugins/discourse-activity-pub/plugin.rb:494:in `block (2 levels) in activate!' 
/var/www/discourse/lib/plugin/instance.rb:316:in `public_send' 
/var/www/discourse/lib/plugin/instance.rb:316:in `block (2 levels) in add_to_class' 
/var/www/discourse/plugins/discourse-activity-pub/plugin.rb:502:in `block (2 levels) in activate!' 
/var/www/discourse/lib/plugin/instance.rb:316:in `public_send' 
/var/www/discourse/lib/plugin/instance.rb:316:in `block (2 levels) in add_to_class' 
/var/www/discourse/plugins/discourse-activity-pub/app/controllers/discourse_activity_pub/post_controller.rb:13:in `schedule' 
actionpack-7.0.7/lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action' 
actionpack-7.0.7/lib/abstract_controller/base.rb:215:in `process_action' 
actionpack-7.0.7/lib/action_controller/metal/rendering.rb:165:in `process_action' 
actionpack-7.0.7/lib/abstract_controller/callbacks.rb:234:in `block in process_action' 
activesupport-7.0.7/lib/active_support/callbacks.rb:118:in `block in run_callbacks' 
/var/www/discourse/app/controllers/application_controller.rb:421:in `block in with_resolved_locale' 
i18n-1.14.1/lib/i18n.rb:322:in `with_locale' 
/var/www/discourse/app/controllers/application_controller.rb:421:in `with_resolved_locale' 
activesupport-7.0.7/lib/active_support/callbacks.rb:127:in `block in run_callbacks' 
activesupport-7.0.7/lib/active_support/callbacks.rb:138:in `run_callbacks' 
actionpack-7.0.7/lib/abstract_controller/callbacks.rb:233:in `process_action' 
actionpack-7.0.7/lib/action_controller/metal/rescue.rb:23:in `process_action' 
actionpack-7.0.7/lib/action_controller/metal/instrumentation.rb:67:in `block in process_action' 
activesupport-7.0.7/lib/active_support/notifications.rb:206:in `block in instrument' 
activesupport-7.0.7/lib/active_support/notifications/instrumenter.rb:24:in `instrument' 
activesupport-7.0.7/lib/active_support/notifications.rb:206:in `instrument' 
actionpack-7.0.7/lib/action_controller/metal/instrumentation.rb:66:in `process_action' 
actionpack-7.0.7/lib/action_controller/metal/params_wrapper.rb:259:in `process_action' 
activerecord-7.0.7/lib/active_record/railties/controller_runtime.rb:27:in `process_action' 
actionpack-7.0.7/lib/abstract_controller/base.rb:151:in `process' 
actionview-7.0.7/lib/action_view/rendering.rb:39:in `process' 
rack-mini-profiler-3.1.1/lib/mini_profiler/profiling_methods.rb:111:in `block in profile_method' 
actionpack-7.0.7/lib/action_controller/metal.rb:188:in `dispatch' 
actionpack-7.0.7/lib/action_controller/metal.rb:251:in `dispatch' 
actionpack-7.0.7/lib/action_dispatch/routing/route_set.rb:49:in `dispatch' 
actionpack-7.0.7/lib/action_dispatch/routing/route_set.rb:32:in `serve' 
actionpack-7.0.7/lib/action_dispatch/journey/router.rb:50:in `block in serve' 
actionpack-7.0.7/lib/action_dispatch/journey/router.rb:32:in `each' 
actionpack-7.0.7/lib/action_dispatch/journey/router.rb:32:in `serve' 
actionpack-7.0.7/lib/action_dispatch/routing/route_set.rb:852:in `call' 
railties-7.0.7/lib/rails/engine.rb:530:in `call' 
railties-7.0.7/lib/rails/railtie.rb:226:in `public_send' 
railties-7.0.7/lib/rails/railtie.rb:226:in `method_missing' 
actionpack-7.0.7/lib/action_dispatch/routing/mapper.rb:19:in `block in <class:Constraints>' 
actionpack-7.0.7/lib/action_dispatch/routing/mapper.rb:48:in `serve' 
actionpack-7.0.7/lib/action_dispatch/journey/router.rb:50:in `block in serve' 
actionpack-7.0.7/lib/action_dispatch/journey/router.rb:32:in `each' 
actionpack-7.0.7/lib/action_dispatch/journey/router.rb:32:in `serve' 
actionpack-7.0.7/lib/action_dispatch/routing/route_set.rb:852:in `call' 
/var/www/discourse/lib/middleware/omniauth_bypass_middleware.rb:74:in `call' 
rack-2.2.8/lib/rack/tempfile_reaper.rb:15:in `call' 
rack-2.2.8/lib/rack/conditional_get.rb:40:in `call' 
rack-2.2.8/lib/rack/head.rb:12:in `call' 
actionpack-7.0.7/lib/action_dispatch/http/permissions_policy.rb:38:in `call' 
/var/www/discourse/lib/content_security_policy/middleware.rb:12:in `call' 
/var/www/discourse/lib/middleware/anonymous_cache.rb:389:in `call' 
/var/www/discourse/lib/middleware/gtm_script_nonce_injector.rb:10:in `call' 
rack-2.2.8/lib/rack/session/abstract/id.rb:266:in `context' 
rack-2.2.8/lib/rack/session/abstract/id.rb:260:in `call' 
actionpack-7.0.7/lib/action_dispatch/middleware/cookies.rb:704:in `call' 
actionpack-7.0.7/lib/action_dispatch/middleware/callbacks.rb:27:in `block in call' 
activesupport-7.0.7/lib/active_support/callbacks.rb:99:in `run_callbacks' 
actionpack-7.0.7/lib/action_dispatch/middleware/callbacks.rb:26:in `call' 
actionpack-7.0.7/lib/action_dispatch/middleware/debug_exceptions.rb:28:in `call' 
actionpack-7.0.7/lib/action_dispatch/middleware/show_exceptions.rb:29:in `call' 
logster-2.13.0/lib/logster/middleware/reporter.rb:40:in `call' 
railties-7.0.7/lib/rails/rack/logger.rb:40:in `call_app' 
railties-7.0.7/lib/rails/rack/logger.rb:27:in `call' 
/var/www/discourse/config/initializers/100-quiet_logger.rb:20:in `call' 
/var/www/discourse/config/initializers/100-silence_logger.rb:29:in `call' 
actionpack-7.0.7/lib/action_dispatch/middleware/remote_ip.rb:93:in `call' 
actionpack-7.0.7/lib/action_dispatch/middleware/request_id.rb:26:in `call' 
/var/www/discourse/lib/middleware/enforce_hostname.rb:24:in `call' 
rack-2.2.8/lib/rack/method_override.rb:24:in `call' 
actionpack-7.0.7/lib/action_dispatch/middleware/executor.rb:14:in `call' 
rack-2.2.8/lib/rack/sendfile.rb:110:in `call' 
actionpack-7.0.7/lib/action_dispatch/middleware/host_authorization.rb:131:in `call' 
rack-mini-profiler-3.1.1/lib/mini_profiler.rb:413:in `call' 
message_bus-4.3.8/lib/message_bus/rack/middleware.rb:60:in `call' 
/var/www/discourse/lib/middleware/request_tracker.rb:233:in `call' 
railties-7.0.7/lib/rails/engine.rb:530:in `call' 
railties-7.0.7/lib/rails/railtie.rb:226:in `public_send' 
railties-7.0.7/lib/rails/railtie.rb:226:in `method_missing' 
rack-2.2.8/lib/rack/urlmap.rb:74:in `block in call' 
rack-2.2.8/lib/rack/urlmap.rb:58:in `each' 
rack-2.2.8/lib/rack/urlmap.rb:58:in `call' 
unicorn-6.1.0/lib/unicorn/http_server.rb:634:in `process_client'
unicorn-6.1.0/lib/unicorn/http_server.rb:739:in `worker_loop'
unicorn-6.1.0/lib/unicorn/http_server.rb:547:in `spawn_missing_workers'
unicorn-6.1.0/lib/unicorn/http_server.rb:143:in `start'
unicorn-6.1.0/bin/unicorn:128:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/3.2.0/bin/unicorn:25:in `load' 
/var/www/discourse/vendor/bundle/ruby/3.2.0/bin/unicorn:25:in `<main>' 

또한, Mastodon에서 설정한 계정을 찾을 수 없습니다.

이 문제에 대한 해결책이 있을까요?

카테고리에 팔로워가 하나도 없어서 해당 경고가 표시됩니다. 전송이 이루어지려면 최소 1명의 팔로워가 필요합니다.

  1. 카테고리 설정에서 핸들을 복사합니다.
  2. 마스토돈에서 해당 핸들을 검색합니다(검색 결과에 표시되어야 합니다).
  3. 마스토돈 계정으로 팔로우합니다.

문제는 제가 검색을 해봤는데 큰 404 오류가 떴다는 겁니다.
반영되는데 시간이 좀 걸리기 때문일까요?

요약


ActivityPub 카테고리 설정은 어떤 모습인가요? 스크린샷을 공유해 주실 수 있을까요(특히 상태 배지 부분)? 이 주제를 장악하지 않도록 비공개 메시지로 보내 주시면 좋겠습니다.

2개의 좋아요

과거의 주제들을 페디버스에도 게시할 수 있는 방법(또는 앞으로 그런 방법이 생길 가능성)이 있을까요? 수천 개의 답변이 있는 주제들이 있는데, 현재는 페더레이션이 되지 않고 있습니다. 해당 주제들을 페더레이션하려면 어떻게 해야 하는지 잘 모르겠습니다.

관리자는 이제 설정된 카테고리 내의 개별 주제를 게시할 수 있습니다. 이는 게시물의 렌치 메뉴에서 사용할 수 있습니다:

그러나 과거의 주제들을 일괄적으로 게시할 수 있는 시스템은 마련되어 있지 않으며, 이는 현재 우선순위 목록에 포함되어 있지 않습니다. 소셜 미디어의 일시적인 특성을 고려할 때, 과거 게시물을 ActivityPub에 게시하는 데 큰 관심이 있을 것이라고 생각하지는 않습니다. 그럼에도 불구하고, 이는 rake 작업을 통해 구현할 수 있을 것입니다.

6개의 좋아요

Mastodon에서 Discourse로 되돌아가는 방법이 있을까요?

우리는 릴리스 노트를 자동으로 Mastodon에 게시하고 있으니, 이를 Discourse에도 미러링할 수 있다면 정말 좋겠습니다.

3개의 좋아요

현재 이 기능은 지원되지 않지만, 로드맵에 포함되어 있으며 향후 2~3개월 내에 작업을 진행할 예정입니다.

4개의 좋아요

이러한 로드맵은 GitHub처럼 공개적으로 접근할 수 있나요?

2개의 좋아요

네, 곧 여기에 업데이트를 올리겠습니다. (지금까지 추가된 기능에 대한 로드맵은 이 토픽에서 수십 개의 게시물 위에 있습니다.)

4개의 좋아요

네, 플러그인에 대해 향후 2~3개월간 계획한 사항은 다음과 같습니다:

  • 플러그인 성능 개선 (사용자에게 노출되는 변경 사항 없음)
  • ActivityPub가 활성화된 Discourse 카테고리에 더 나은 UI 요소 추가
    • 이는 카테고리별 ActivityPub 통계에 대한 세부 정보를 더 많이 포함하고, 사용자가 자신의 ActivityPub 클라이언트에서 해당 카테고리를 팔로우하기 위한 더 쉬운 흐름을 제공하는 것을 의미합니다.
  • Discourse 카테고리가 외부 액터를 팔로우할 수 있도록 허용
    • 이를 통해 ActivityPub 콘텐츠를 Discourse 카테고리로 동기화할 수 있습니다. 여기에는 ActivityPub를 통한 Discourse-to-Discourse 동기화도 포함됩니다. 즉, Discourse 사이트 A의 카테고리가 Discourse 사이트 B의 카테고리를 팔로우할 수 있습니다(양쪽 사이트 모두 플러그인이 활성화되고 적절하게 구성된 경우).
  • 버그 수정 및 기존 기능 개선
    • 아바타 동기화 문제 및 다른 사용자(스태프 등)에 의한 AP 활성화된 게시물의 편집 처리
    • 가능하면 저자 변경 및 위키에 대한 현재 제한 사항 해결
17개의 좋아요

이것은 놀라운 발전이 될 수 있습니다(아니면 적어도 놀라운 것의 시작이 될 수 있죠 :-). 현재 디스코URS 인스턴스는 인터넷에서 가장 고품질의 온라인 모임 및 토론 장소이지만, 모두 고립된 섬과 같습니다. 이들 인스턴스 간, 그리고 경우에 따라 다른 유형의 서버와의 연동은 새로운 가능성을 열어줄 것입니다. 기대감으로 지켜보고 있습니다!

8개의 좋아요

여러분께 알려드리고 싶은 게 있어요. 방금 Fediverse의 어떤 액터든, 다른 Discourse 카테고리도 포함해서, Discourse 카테고리가 팔로우할 수 있도록 하는 PR을 병합했습니다. 네, 이 말은 두 개(또는 세 개, 혹은 그 이상)의 Discourse 간에 카테고리를 연동(federate)할 수 있다는 뜻입니다. 이 단계의 일환으로 파이프라인에 몇 개의 PR이 더 남아 있지만, 이번은 꽤 큰 업데이트였습니다.

제 컴퓨터에서 실행 중인 두 개의 Discourse 인스턴스와 Mastodon 인스턴스 간에 연동하는 모습을 담은 영상이에요.

29개의 좋아요

태그를 기준으로 ActivityPub 액터를 할당하는 방식에 대해 기대가 큽니다. 카테고리 대신 태그를 사용한다면 채팅 통합 플러그인 지원에서도 작동할 것 같고, 이를 통해 추가적인 콘텐츠 필터링도 가능해질 것입니다.

또 다른 흥미로운 아이디어는 ActivityPub 게시물을 라이브로 게시하기 전에 관리자 및 모더레이터의 승인을 위한 큐에 넣는 것입니다. 이를 통해 해당 주제가 크로스포스팅에 적합한지 그룹이 확인할 수 있다면 매우 좋을 것입니다.同样的 방식은 피드버스에서 포럼으로 자동 게시되는 답글에도 적용할 수 있습니다.

어쨌든 이 멋진 플러그인을 개발해 주셔서 감사합니다.

7개의 좋아요

이 게시글이 ActivityPub 소프트웨어에 대한 것이므로, Meta에서 이 소프트웨어와 연동할 수 있는 카테고리가 있을 것 같습니다: Discourse - SocialHub :slight_smile:

4개의 좋아요

플러그인을 잘 사용하고 있지만, 현재 버전에서 발췌 최대 길이(excerpt maxlength)와 포럼 링크 사이에 버그가 있습니다. 발췌 최대 길이가 링크 중간에서 잘릴 경우, “우리 포럼에서 이 주제에 대해 토론하기” 링크의 대상이 이상하게 표시됩니다.

예를 들어:

이 경우 최종 포럼 링크가 다음과 같이 됩니다:
https://jcheminf.biomedcentral.com/a%E2%80%A6%3Cbr%3E%3Cbr%3E%3Ca%20href=

저는 Ruby에 익숙하지는 않지만, maxlength에서 게시글을 자르는 코드는 "포럼으로의 링크"를 추가하기 전에 링크 중간이 아닌지 확인해야 한다고 추측합니다.

4개의 좋아요

커밋 fb83e554fd 시점 itibari로 위키 제한이 제거된 것으로 보이며, 현재 연동된 카테고리에서 게시글 소유자를 변경하는 제한은 여전히 유지되고 있습니다.

저는 게시글 소유자를 변경하는 일이 자주 일어나지는 않지만, 카테고리 설명 게시글은 저에게 중요한 사례입니다. 소유자가 변경되면 가장 활동적인 카테고리 관리자를 소유자로 설정하고, 그 시점에 적절한 시점에 내용을 업데이트하도록 권고합니다. 이것이 제가 인지하고 있는 이 기능을 구현하는 것을 가로막는 가장 큰 제한 사항입니다.

이 문제를 야기하는 Discourse와 ActivityPub 간의 모델 불일치를 이해하고 있습니다. 연동된 게시글에 대해 삭제 활동을 전송하고, 이후 연동되지 않도록 표시한 뒤 소유자 변경을 허용하는 "이 게시글 연동 해제(defederate this post)"와 같은 특권(관리자?) 작업을 구현하는 것이 타당할까요?

5개의 좋아요

해당 사용 사례를 이해합니다. 하지만 현재로서는 이것이 매우 높은 우선순위라고 보지는 않습니다. 당분간은 Discourse-to-Discourse 동기화 기능의 세부 조정(fine-tuning)에 집중하고 싶습니다. 앞으로 몇 주 동안 상당한 주의를 기울여야 할 것 같습니다.

좋은 지적입니다. 문제를 보고해 주셔서 감사합니다. 조사해 보겠습니다.

1개의 좋아요

이 "백필"이 링크된 ActivityPub 액터에서 수행될까요?

사용 사례:
Mastodon에 이미 게시된 공지사항으로 Discourse 카테고리를 채우는 것.

3개의 좋아요

현재 백필링(Backfilling)은 아직 지원되지 않습니다. 특히 Discourse-to-Discourse 연동 시나리오에서는 이를 지원하고 싶습니다. 질문자님이 설명하신 사용 사례에서는 구현이 다소 복잡할 수 있습니다.

8개의 좋아요