ActivityPub 플러그인

:discourse2: 요약 Discourse ActivityPub 플러그인을 사용하면 ActivityPub를 지원하는 서비스(예: Mastodon)에서 읽을 수 있도록 ActivityPub를 통해 Discourse 게시물을 게시할 수 있습니다.
:hammer_and_wrench: 저장소 링크 GitHub - discourse/discourse-activity-pub: Adds ActivityPub support to Discourse. · GitHub
:open_book: 설치 가이드 Discourse에 플러그인 설치 방법

ActivityPub에 익숙하지 않다면 다음 짧은 영상을 시청해 보세요:

플러그인 설정을 시작할 준비가 되었다면, 다음 activitypub Documentation > Integrations 토픽을 확인해 보세요:

66개의 좋아요
Publishing posts to Mastodon
Federation support for Discourse
Is diversity of opinion of benefit to community health?
Unable to change category
Getting ActivityPub error when trying to edit a post?
2024: The Year in Review
Federate private categories via ActivityPub
Synchronising/Crossposting topics across different Discourse sites
Introducing Discourse Discover
How could a CI workflow for unofficial plugins be implemented?
Using forum researcher to help organize and split large topics
When goes to a category /latest doesn’t show the actual latest
Using forum researcher to help organize and split large topics
Duplicating an entire topic
Changing ownership of a topic doesn’t work
Cross-Discourse Quoting
Incoming synchronization between Fediverse publications and Discourse category?
Creating topic will also creates topic into another forum
Multi-instance activity backup + unified multi-site Discourse reader
Anyone has discovered/ build a site as multisite (SSO), would like to see the possibilities for inspiration!
Sync topic content in Wordpress and Discourse (feature request)
2023: The Year in Review
How to sync posts between two different Discourse sites, and only for specific users
Federation support for Discourse
Discourse Chat Integrations
ActivityPub between two Discourse instances
Cross platform Discourse aggregator app
Federation support for Discourse
Following an ActivityPub Actor
Matrix protocol for chat
Unicode export problems in activitypub plugin
Mailing Lists providers
Can I import replies to posts using RSS Polling and how do I set it up?
Setting up an ActivityPub Actor
Code-level performance testing

여기에서의 작업에 감사드립니다! 이 기능이 활성화되는 것을 정말 기대하고 있으며, 테스트용으로 공개해 주셔서 다양한 환경의 사용자들이 더 넓은 범위의 시나리오에서 테스트에 기여할 수 있게 되어 감사합니다.

내 사이트에서 이 기능을 언제 활성화할지 생각하면서, 어떤 것들이 되돌릴 수 없는 선택(one-way doors)이 될 수 있을지 고민하고 있습니다.

하위 카테고리

저는 8개의 최상위 카테고리가 있지만, 추가로 21개의 공개 하위 카테고리가 있습니다. 모든 공개 사이트 활동을 따라가려면 29개의 액터를 팔로우해야 하는 것은 꽤 부담이 됩니다. 또한, 카테고리를 팔로우한다고 하위 카테고리까지 자동으로 팔로우되지 않는다는 점은 사용자들에게 의외의 결과가 될 수 있습니다.

카테고리 ActivityPub 설정에서 "공개 하위 카테고리도 함께 연동(federate)하기"라는 옵션을 선택할 수 있다면 그렇게 할 것입니다. 하위 카테고리를 별도로 연동할지 여부는 사용자 관점에서 거의 되돌릴 수 없는 선택(one-way door)이라고 생각합니다. 따라서 "하위 카테고리도 함께 연동"이라는 옵션을 고려해 주신다면, 제 계획에 도움이 될 것입니다. 저희 사이트의 기본 사이드바에는 최상위 카테고리만 표시되고, Discourse에서 이들을 볼 때의 기본 동작은 최상위 카테고리와 하위 카테고리의 콘텐츠가 함께 표시되는 것이므로, 이는 Discourse의 일반적인 기대치와 꽤 일관성이 있다고 생각합니다.

모든 것을 연동하자!

사이트 전체의 모든 공개 게시물을 연동하는 ActivityPub 액터를 위한 사이트 전체 설정을 추가하는 것도 흥미로울 것 같습니다. 저라면 이를 사용할 것입니다. 하지만 이것을 되돌릴 수 없는 선택(one-way door)으로 보지는 않습니다. 나중에 “all@” 액터를 추가하여 모든 것을 연동하더라도, 다른 준비가 되는 대로 카테고리 연동을 설정할 것이기 때문입니다.

수정 제한

작성하신 게시물에서 명확하지 않은 점 중 하나는, 실제로는 [note]...[/note] 섹션만 수정할 수 없다는 의미로 읽힐 수 있다는 것입니다. 여기 있는 다른 사용자들에게, 이것이 실제로 의미하는 바는 다음과 같습니다: 연동(federate)된 경우, 게시물이 연동되는 즉시 모든 게시물에서 수정 기능이 비활성화됩니다(문자 그대로 [note]...[/note] 섹션이 있는 게시물을 제외하고). 이 메시지는 수정을 저장하려고 할 때만 표시됩니다:

저희 사이트는 의도적으로 충분히 신뢰할 수 있는 사용자에게 무제한 수정을 허용하고 있으므로, 이 제어를 비활성화할 수 있는 기능(또는 수정이 연동되므로 제어가 제거되는 것)이 없다면 이 기능을 활성화할 수 없습니다. 이러한 신뢰 기반 사이트를 넘어 일반적인 예로, 위키 모드(wiki-mode) 게시물이 있는 카테고리는 해당 카테고리에 연동을 설정하면 깨질 것입니다.

위키로 만든 연동된 게시물을 삭제하려고 시도했는데, 다음과 같은 결과가 나왔습니다:

하지만 게시물은 삭제되었고, 삭제 작업은 연동되었습니다.

개성(Personality)

지정된 각 액터에 프로필 사진을 제공하면 좋겠습니다. Mastodon에서는 각 카테고리 액터가 회색 코끼리 이미지로만 표시되는데, 여기에 조금의 개성을 더하고 싶습니다. :smiling_face:

오류 로그

activitypub 플러그인으로부터 지금까지 두 가지 유형의 오류가 로그에 기록되었습니다:

Message (3 copies reported)

NoMethodError (undefined method `ap_type' for nil:NilClass)
(eval):7:in `_fast_attributes'
app/controllers/application_controller.rb:418:in `block in with_resolved_locale'
app/controllers/application_controller.rb:418:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:74:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:367:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:228:in `call'

Backtrace

plugins/discourse-activity-pub/lib/discourse_activity_pub/ap/activity.rb:18:in `object'
plugins/discourse-activity-pub/app/serializers/discourse_activity_pub/ap/activity_serializer.rb:18:in `_object'
plugins/discourse-activity-pub/app/serializers/discourse_activity_pub/ap/activity_serializer.rb:9:in `attributes'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:480:in `_serializable_hash'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:359:in `serializable_hash'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:347:in `as_json'
plugins/discourse-activity-pub/lib/discourse_activity_pub/ap/object.rb:50:in `json'
plugins/discourse-activity-pub/app/serializers/discourse_activity_pub/ap/collection/ordered_collection_serializer.rb:7:in `map'
plugins/discourse-activity-pub/app/serializers/discourse_activity_pub/ap/collection/ordered_collection_serializer.rb:7:in `ordered_items'
(eval):7:in `_fast_attributes'
Message

Job exception: undefined method `model' for #<DiscourseActivityPubActivity id: 2, ap_id: "https://social.makerforums.info/cf2e1e8d-83e3-447e...", ap_key: nil, ap_type: "Follow", local: nil, actor_id: 3, object_id: "1", object_type: "DiscourseActivityPubActor", summary: nil, published_at: nil, created_at: "2023-06-01 02:23:13.798564000 +0000", updated_at: "2023-06-01 02:23:13.798564000 +0000">


Backtrace

/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activemodel-7.0.4.3/lib/active_model/attribute_methods.rb:458:in `method_missing'
/var/www/discourse/plugins/discourse-activity-pub/app/models/discourse_activity_pub_activity.rb:79:in `after_deliver'
/var/www/discourse/plugins/discourse-activity-pub/app/jobs/discourse_activity_pub_deliver.rb:42:in `perform_request'
/var/www/discourse/plugins/discourse-activity-pub/app/jobs/discourse_activity_pub_deliver.rb:13:in `execute'
/var/www/discourse/app/jobs/base.rb:249:in `block (2 levels) in perform'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rails_multisite-5.0.0/lib/rails_multisite/connection_management.rb:82:in `with_connection'
/var/www/discourse/app/jobs/base.rb:236:in `block in perform'
/var/www/discourse/app/jobs/base.rb:232:in `each'
/var/www/discourse/app/jobs/base.rb:232:in `perform'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/sidekiq-6.5.9/lib/sidekiq/processor.rb:202:in `execute_job'

다시 한번 이 작업에 감사드립니다!

8개의 좋아요

기쁜 마음으로 말씀드리건대, SocialHub는 이미 실행 중입니다:

… 탭, 탭, 탭…

지금쯤이면 Fediverse에 표시되었어야 하는데… 로그를 확인해 보겠습니다…

아, 액터를 팔로우하는 첫 번째 시도에서 문제가 있습니다:

  • Job exception: undefined method model’ for #<DiscourseActivityPubActivity id: 2, ap_id: “https://ps.s10y.eu/820e6bf2-ec02-49f8-ab5e-e3cefbb…”, ap_key: nil, ap_type: “Follow”, local: nil, actor_id: 4, object_id: “2”, object_type: “DiscourseActivityPubActor”, summary: nil, published_at: nil, created_at: “2023-06-01 13:30:16.131136000 +0000”, updated_at: “2023-06-01 13:30:16.131136000 +0000”>`
  • Job exception: undefined method model’ for #<DiscourseActivityPubActivity id: 8, ap_id: “https://mastodon.social/ce62fd77-fe03-4060-a951-79…”, ap_key: nil, ap_type: “Follow”, local: nil, actor_id: 8, object_id: “2”, object_type: “DiscourseActivityPubActor”, summary: nil, published_at: nil, created_at: “2023-06-01 13:39:14.512966000 +0000”, updated_at: “2023-06-01 13:39:14.512966000 +0000”>`
  • Job exception: undefined method model’ for #<DiscourseActivityPubActivity id: 6, ap_id: “https://social.coop/4236c87a-0d22-402d-8546-e37a21…”, ap_key: nil, ap_type: “Follow”, local: nil, actor_id: 6, object_id: “2”, object_type: “DiscourseActivityPubActor”, summary: nil, published_at: nil, created_at: “2023-06-01 13:38:54.493118000 +0000”, updated_at: “2023-06-01 13:38:54.493118000 +0000”>`
마지막 항목에 대한 백트레이스는 다음과 같습니다
ctivemodel-7.0.4.3/lib/active_model/attribute_methods.rb:458:in `method_missing'

/var/www/discourse/plugins/discourse-activity-pub/app/models/discourse_activity_pub_activity.rb:79:in `after_deliver'

/var/www/discourse/plugins/discourse-activity-pub/app/jobs/discourse_activity_pub_deliver.rb:42:in `perform_request'

/var/www/discourse/plugins/discourse-activity-pub/app/jobs/discourse_activity_pub_deliver.rb:13:in `execute'

/var/www/discourse/app/jobs/base.rb:249:in `block (2 levels) in perform'

rails_multisite-5.0.0/lib/rails_multisite/connection_management.rb:82:in `with_connection'
/var/www/discourse/app/jobs/base.rb:236:in `block in perform'

/var/www/discourse/app/jobs/base.rb:232:in `each'

/var/www/discourse/app/jobs/base.rb:232:in `perform'

sidekiq-6.5.9/lib/sidekiq/processor.rb:202:in `execute_job'

sidekiq-6.5.9/lib/sidekiq/processor.rb:170:in `block (2 levels) in process'

sidekiq-6.5.9/lib/sidekiq/middleware/chain.rb:177:in `block in invoke'

/var/www/discourse/lib/sidekiq/pausable.rb:134:in `call'

sidekiq-6.5.9/lib/sidekiq/middleware/chain.rb:179:in `block in invoke'

sidekiq-6.5.9/lib/sidekiq/middleware/chain.rb:182:in `invoke'

sidekiq-6.5.9/lib/sidekiq/processor.rb:169:in `block in process'

sidekiq-6.5.9/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch'

sidekiq-6.5.9/lib/sidekiq/job_retry.rb:113:in `local'

sidekiq-6.5.9/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch'

sidekiq-6.5.9/lib/sidekiq.rb:44:in `block in <module:Sidekiq>'

sidekiq-6.5.9/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch'

sidekiq-6.5.9/lib/sidekiq/processor.rb:263:in `stats'

sidekiq-6.5.9/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch'

sidekiq-6.5.9/lib/sidekiq/job_logger.rb:13:in `call'

sidekiq-6.5.9/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch'

sidekiq-6.5.9/lib/sidekiq/job_retry.rb:80:in `global'

sidekiq-6.5.9/lib/sidekiq/processor.rb:124:in `block in dispatch'

sidekiq-6.5.9/lib/sidekiq/job_logger.rb:39:in `prepare'

sidekiq-6.5.9/lib/sidekiq/processor.rb:123:in `dispatch'

sidekiq-6.5.9/lib/sidekiq/processor.rb:168:in `process'

sidekiq-6.5.9/lib/sidekiq/processor.rb:78:in `process_one'

sidekiq-6.5.9/lib/sidekiq/processor.rb:68:in `run'

sidekiq-6.5.9/lib/sidekiq/component.rb:8:in `watchdog'

sidekiq-6.5.9/lib/sidekiq/component.rb:17:in `block in safe_thread'

노트가 내 피드에 표시되지 않는 것 같습니다 :cry:

(더 적절한 곳으로 이 메시지를 옮기셔도 됩니다)

8개의 좋아요

장기적으로는 동의하며, 이는 액터별로 구체적이고 설정 가능해야 합니다. 하지만 현재로서는 사이트 로고 _should_가 가져와져야 합니다. 제 경우 @feature@meta.discourse.org에서는 잘 가져와집니다:

4개의 좋아요

음, 아마 제가 본 오류 중 하나와 관련이 있었던 것 같습니다. 사이트 로고라는 건 제게 꽤 논리적으로 느껴집니다.

이 부분을 생각해보니… 거기서 카테고리 색상을 사용할 수 있는 옵션이 있다면 정말 멋질 텐데, 그럴 자리가 있을지는 모르겠습니다.

4개의 좋아요

다시 시도해 보았더니…

부분적으로 작동합니다: 노트가 원래 텍스트보다 약간 너무 많이(71자) 줄었습니다.

기다리고 있었습니다: 이제 Angus McLeod와 pavilion 팀, 그리고 #Discourse를 개발한 회사인 CDCK, Inc. 덕분에 #SocialHub가 이제 연동(federated)되었습니다! 일반 공지사항은 @fediverse@socialhub.activitypub.rocks를, Fediverse Enhancement Proposals는 @feps@socialhub.activitypub.rocks를 팔로우하세요.
:hugs:

4개의 좋아요

일반적인 권장 사항:

Activitypub 통합을 활성화하기 전에 며칠 동안 고려해 보세요.이러한 계정은 소셜 네트워크의 페디버스(fediverse) 내에 영구적으로 목록에 표시되며, 나중에 계정/카테고리 이름을 변경해야 한다는 것을 깨닫게 되면 혼란을 야기할 수 있습니다. :heart:

2개의 좋아요

개인적으로 장기적으로 보면, 카테고리별 액터를 이름 변경할 수 있도록 계정 이동 기능을 추가로 구현하는 것이 가능하다고 생각합니다. 다만, 이는 누군가가 그 작업을 수행할 만큼 가치가 있어야만 이루어지는 추가적인 일이기 때문에, 단기적으로 이루어지기는 어려울 것 같습니다. :smiling_face: 적어도, 더 가치 있는 다른 작업들보다 늦게 이루어지기를 바랍니다! :grin:

그렇다고 해서 당신의 의견이 틀린 것은 전혀 아닙니다.

3개의 좋아요

피드백 감사합니다 :slight_smile:

@hellekin 이 변경 사항으로 보고해 주신 예외가 해결될 것입니다. @mcdanlj 보고해 주신 두 번째 예외(같은 문제)도 함께 해결됩니다.

@mcdanlj 보고해 주신 첫 번째 문제는 좀 더 이례적인 상황인데, 얼마나 자주 발생하고 계신가요? 좀 더 자세한 정보를 공유해 주실 수 있을까요?

이에 대한 피드백 감사합니다. 작업의 2단계에서 반드시 고려해 보겠습니다 :+1:

이 부분은 2단계에서 실현되기는 어려울 것 같지만, 참고했습니다 :+1:

편집은 노트(Note)를 구성하는 게시물의 콘텐츠 부분에 대해서만 비활성화됩니다. 노트 태그를 사용하지 않는 경우, 기본값인 500자 또는 activity pub note excerpt maxlength에 설정한 값까지가 해당됩니다. 2단계에서 확실히 고려하고 있는 것 중 하나는 [note][/note] 태그를 노트에 의무화하는 것입니다. 이 부분에서 혼란이 생길 수 있음을 알 수 있기 때문입니다.

[note][/note] 태그를 사용하여 노트를 다른 콘텐츠와 분리하면 이 문제를 해결할 수 있습니다.

참고했습니다! 위키 게시물에 대해 이를 명시적으로 테스트해 보지는 않았습니다. 지금까지 위키 게시물 삭제와 관련된 문제를 재현하지 못했습니다. 일관되게 재현이 가능한가요? 이 PR에서 해당 시나리오에 대한 몇 가지 스펙을 추가했는데 모두 통과하고 있지만, 이 문제를 반드시 파고들고 싶습니다.

현재 발췌 분석은 디스커스(Discourse)의 주제 목록을 위해 사용되는 주제 발췌 분석 시스템과 동일한 시스템으로 처리되고 있으며, 이것이 아마도 상당 부분이 잘린 이유일 것입니다(주제 목록 발췌도 마찬가지였을 것입니다). 이 문제가 몇 가지 문제를 일으킬 수 있다고 예상되므로 별도의 파서를 사용해야 할 것 같습니다. 이 부분은 잠시 기다려 주시면, 2단계에서 반드시 해결하겠습니다.

표시 이름은 원하시는 만큼 자유롭게 변경할 수 있으며, 사용자 이름 변경에 대한 제한은 이 플러그인만의 특징이 아님을 유념해 주세요. 따라서 말씀하신 내용은 사실이지만, 페디버스의 상당 부분에서 마찬가지입니다.

또한, 향후 사용자 이름 변경 기능을 추가할 가능성을 열어두기 위해 일부러 사용자 이름을 액터의 ID에 포함시키지 않았습니다.

플러그인의 ActivityPub 데이터는 디스커스의 데이터와 분리되어 추상화되어 있습니다. 액터가 관련되어 있는 디스커스 모델(즉, 어떤 카테고리인지)을 변경하는 데에는 본질적인 제한이 없습니다. 미래에는 액터를 디스커스 모델의 다른 유형과 연관시킬 수도 있으며, 예를 들어 카테고리를 위해 만든 액터를 대신 사용자와 연관시키는 것도 가능합니다(액터와 디스커스 모델 간의 관계는 다형적(polymorphic)입니다). 이러한 것들이 명시적으로 기능으로 추가될 것이라고 말하려는 것은 아니지만, 이 부분에 대해 하드한 제한이 없음을 강조하려는 것입니다.

일반적으로, 어떤 카테고리를 액터로 사용할지 고려하는 것은 가치가 있습니다. 하지만 전반적으로 이 구현은 상대적으로 높은 수준의 유연성을 갖추고 있으므로, 우려의 정도는 이러한 맥락에 비례해야 합니다. 플러그인 내 데이터 흐름의 성격에 대해 이 점을 더 명확히 설명한 내용은 여기에서 확인하실 수 있습니다.

다시 한번 모두 감사합니다! 적극적인 사용자들이 있어 정말 좋습니다.

5개의 좋아요

게시글을 삭제할 때 발생하는 문제인 것 같습니다. 테스트용 게시글 3개를 삭제했는데, 오류가 3번 발생했거든요.

그렇게 하면 제 사이트에서는 완전히 사용할 수 없게 됩니다. 저는 Discourse를 Mastodon에서 직접 작성하는 것보다 더 어려운 방식으로 Fediverse에 게시글을 작성하는 도구로 사용하려는 것이 아닙니다. 제 커뮤니티 전체, 특히 도움이 필요한 신규 사용자를 포함하여 [note]...[/note] bbcode 주석을 사용하도록 강요하는 것은 불가능합니다.

아니요, 저는 분명히 그렇게 할 수 없습니다. 이건 제 문제가 아닙니다. 제 사이트 사용자들의 문제입니다. 그들은 Discourse 사용자이지, discourse/discourse-activity-pub.git 사용자가 아닙니다.

그냥 수정(edit) 기능입니다.

수정 사항을 연동(federate)하는 것은 일반적인 일입니다. 제가 아는 한, 널리 사용되는 대부분의 ActivityPub 구현체들은 오랫동안 수정을 허용해 왔습니다. Mastodon은 인기 있는 구현체들 중 유일한 예외였지만, 지난해 마침내 수정을 허용했습니다.

수정 기능이 MVP 릴리스에 포함되지 않았다는 것은 알고 있지만, 수정을 연동하거나 노트를 수정할 수 없도록 설정하는 옵션을 제공하기 전까지는 제 사이트에서 이 기능을 활성화할 수 없습니다. 제 사용 사례가 특이한지 일반적인지는 모르겠습니다.

제가 ActivityPub 플러그인을 사용하는 목적은 Discourse를 사용하는 커뮤니티 포럼 멤버들이 콘텐츠를 생성하는 동안 더 쉽게 팔로우하고 공유할 수 있도록 하는 것입니다. Mastodon을 대체하는 이상하고 수정 불가능한 게시 전용 도구로 Discourse를 사용하려는 것이 아닙니다. :smiling_face:

오류 메시지에 "현재 지원되지 않음"이라고 표시되어 있으므로, 궁극적으로 수정 연동을 지원할 의도가 있다는 제 이해가 맞나요? 그렇다면 이건 모두 일시적인 제한 사항일 뿐이며, 사용 사례의 차이는 중요하지 않을 것입니다. 하지만 수정을 보호하는 데 에너지를 쓰는 것이 수정 연동을 지원하는 것보다 나은지 궁금해집니다.

프로덕션 사이트에서 retort 플러그인을 제거할 때 샌드박스 사이트에서 제거하는 것을 잊고 있었습니다. retort를 제거하니 이상한 오류 로그와 이상한 오류 메시지가 모두 해결되었습니다. 제 실수였습니다!

이것은 플러그인의 현재 상태에서는 여러 카테고리에 동일한 액터를 사용할 수 있다는 뜻인가요? 아니면 데이터 모델이 매우 유연하고 구현 세부 사항은 쉽게 변경할 수 있다는 뜻인가요?

참고로 제 사용 사례에서는 제한 없이 전체를 게시하는 것이 좋습니다. 다른 사람들이 그렇게 설정하지는 않을 수 있지만, 결국 제 Discourse 게시글 최대 크기와 동일한 최대 크기로 설정할 것 같습니다. 제 Discourse 게시글 최대 크기는… 큽니다! :smiling_face:

2개의 좋아요

알겠습니다. 곧 더 자세히 조사해 보겠습니다.

이해했습니다. 제 코멘트는 현재 게시된 후에도 노트가 아닌 콘텐츠의 편집이 실제로는 가능하다는 것이었습니다. 일반 사용자가 사용할 때 이 첫 번째 버전에는 UX 문제가 없을 수 없다는 지적은 맞습니다. 하지만 연동(퍼더레이션) 공지 같은 다른 용도에는 꽤 잘 지원됩니다.

네, 2단계에서 게시 후 노트 콘텐츠 편집 지원 기능을 추가할 예정입니다. 참고로 현재는 노트가 게시되기 전에 편집하는 것은 지원됩니다. 이러한 것을 구축할 때는 가능한 한 많은 이동 부품을 줄여야 합니다.

아니요, 아직은 아닙니다. 여기서 무슨 뜻인지 조금 더 설명해 주시겠습니까? 사이트 전체의 액터를 생각 중이신가요, 아니면 하위 카테고리 문제를 더 염두에 두고 계신가요?

네, 그렇습니다. 다만 "쉽다"는 표현을 꼭 쓰지는 않겠습니다. :wink:

무제한 콘텐츠를 어디에서 연동할 것으로 예상하시는지 궁금합니다. 진지한 질문입니다. 여기에서 어떤 맥락에서 말씀하시는지 조금 더 이해하고 싶습니다.

2개의 좋아요

retort를 그대로 두는 실수가 오류의 원인이었다는 것을 발견한 후, 이를 편집해서 제거하는 것을 잊어버렸네요. :flushed:

아, 실수했네요.

충분합니다! :pray:

더 이상 걱정하지 않겠습니다. 2단계에서는 그 기능을 테스트하는 데 도움을 드리겠습니다.

둘 다 막연하게 궁금했었지만, 그다지 중요한 질문은 아니었습니다. 제 스테이징 사이트로 실험을 얼마나 멀리까지 진행할 수 있는지 궁금했을 뿐이었고, 이미 불가능한 것으로 알려진 것들을 시도하고 싶지는 않았습니다. :+1:

설명해 드리겠습니다.

배경 설명: Mastodon은 사용자가 작성할 수 있는 게시글의 길이를 제한하지만, 표시할 수 있는 게시글의 길이는 제한하지 않습니다. 저는 2,000자 제한으로 설정된 Mastodon-glitch 서버를 운영합니다. 31,337자 제한으로 설정하는 방법에 대해 여러 사람이 게시글을 올린 것을 본 적이 있습니다(물론이죠). 저는 플레로마(Pleroma), 아코마(Akkoma) 등을 사용하는 사람들의 긴 게시글을 제 피드에서 보고 있습니다.

Maker Forums(제 Discourse)에는 가끔 정말 멋진 콘텐츠가 올라옵니다(제 생각에요!), 그리고 이를 Fediverse 전반에서 홍보하여 더 넓은 독자들이 접근할 수 있게 하고 싶습니다. 저는 Mastodon이 마이크로블로그의 마법 같은 길이는 500자라고 단정하고 있다는 것을 알고 있습니다 — 하지만 ActivityPub는 마이크로블로그로만 제한되지 않습니다. 이는 마이크로블로그를 포함하지만 이에 국한되지 않는 연동(federation)입니다. 제 Mastodon 계정에서 ActivityPub 액터를 팔로우할 때, 짧은 게시글로만 제한되지 않습니다. 긴 게시글도 읽고, 댓글을 달고, 부스트(재공유)할 수 있습니다.

따라서 "어디에서 연동될 것으로 예상하시는지"라는 질문은 저에게 다소 혼란스럽습니다.

  • 저는 제 Mastodon-glitch 서버에서 콘텐츠를 부스트할 것입니다. 부스트는 표준 Mastodon에서도 게시글 작성 시 적용되는 글자 수 제한을 적용하지 않습니다.
  • 커뮤니티 구성원들이 ActivityPub 서버(적어도 당장은 다른 서버보다 Mastodon이 더 많을 것입니다)에서 팔로우할 것으로 기대하며, 그들은 ActivityPub 노트가 얼마나 길어야 하는지에 대해 동일한 견해를 가질 필요가 없습니다.

결국, 서버 관리자로서 저는 이 콘텐츠가 어디로 연동되는지를 통제하지 않습니다. 이는 모든 팔로어의 결정입니다. Mastodon의 팔로어는 물론, Fediverse 전반에 걸쳐 Discourse 게시글 전체를 ActivityPub 노트로 연동하는 것이 왜 기본값이어야 하는지, 예외를 두는 것보다 더 자연스러운 이유를 저는 명확히 이해하지 못하겠습니다.

이것이 질문을 제대로 답했는지 확실하지 않습니다. 하지만 저도 질문을 잘 이해하지 못하는 것 같습니다. :grin: 원하시면 이 주제에 대해 더 깊이 논의하겠습니다.

2개의 좋아요

괜찮아요! 지금은 예외 사항을 처리했다고 해서 다행입니다. 더 이상 문제가 보이면 알려주세요. @hellekin 마찬가지로, 다른 문제나 이상한 동작이 보이면 알려주세요.

좋아요! 감사합니다.

네, 답이 됩니다! 감사합니다. 2단계 계획 수립에 유용한 맥락이 됩니다.

5개의 좋아요

곧 최신 버전으로 업그레이드할 예정입니다. 유용할 것 같은 기능 중 하나는 대상 선택 기능입니다. 게시물이 공개될지, 팔로워만 볼 수 있을지 선택할 수 있으면 좋겠습니다. 현재는 후자(팔로워 전용)라서 부스트(광고)를 할 수 없고, 알림을 받으려면 계정을 팔로우해야 합니다. 실험 단계이므로 이해는 하지만, 이 기능을 더 널리 알릴 수 있도록 공개 게시 옵션이 반드시 추가되어야 한다고 생각합니다. 페디즌(Fedizens) 여러분께도 :slight_smile:

5개의 좋아요

네, 2단계에서 이를 고려해 보겠습니다. :+1:

6개의 좋아요

개발 단계에 대한 공개 로드맵이 있나요?

3개의 좋아요

공개된 로드맵은 없지만, 구체적인 사항이 결정되면 알려드리겠습니다. 로드맵에 포함되었으면 하는 합리적인 제안은 언제나 환영입니다! @mcdanlj님의 사례와 같은 구체적인 사용 사례도 항상 도움이 됩니다.

6개의 좋아요

SocialHub에서 이미 여기에서 꽤 전에 제안했던 몇 가지 제안을 올렸습니다…

2개의 좋아요

스테이징 서버에서 테스트를 진행하던 중 아직 이 점을 인지하지 못했지만, 부스트 기능이 제 사용 사례에도 핵심적인 요소라는 점에 동의합니다.

6개의 좋아요

410 Gone 처리

로그에 (changed URL)이 많이 나옵니다:

[Discourse Activity Pub] GET request to https://activitypub.example/users/missing-account failed: Expected([200, 201, 202, 301, 302, 307, 308]) <=> Actual(410 Gone)

이것은 다음과 관련이 있다고 생각합니다: 응답 본문에 Tombstone이 포함된 경우 객체 검색은 410 Gone 상태 코드로 응답해야 하며, 그렇지 않으면 404 Not Found로 응답합니다 (server:object-retrieval:deleted-object:410-status): 해당 계정이 다른 인스턴스로 이동했습니다.


또한 몇 가지 오류가 더 발생합니다:



[Discourse Activity Pub] update_stored_from_json failed to save actor. AR errors: Ap has already been taken. Actor JSON: {"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"manuallyApprovesFollowers":"as:manuallyApprovesFollowers","toot":"http://joinmastodon.org/ns#","featured":{"@id":"toot:featured","@type":"@id"},"featuredTags":{"@id":"toot:featuredTags","@type":"@id"},"alsoKnownAs":{"@id":"as:alsoKnownAs","@type":"@id"},"movedTo":{"@id":"as:movedTo","@type":"@id"},"schema":"http://schema.org#","PropertyValue":"schema:PropertyValue","value":"schema:value","discoverable":"toot:discoverable","Device":"toot:Device","Ed25519Signature":"toot:Ed25519Signature","Ed25519Key":"toot:Ed25519Key","Curve25519Key":"toot:Curve25519Key","EncryptedMessage":"toot:EncryptedMessage","publicKeyBase64":"toot:publicKeyBase64","deviceId":"toot:deviceId","claim":{"@type":"@id","@id":"toot:claim"},"fingerprintKey":{"@type":"@id","@id":"toot:fingerprintKey"},"identityKey":{"@type":"@id","@id":"toot:identityKey"},"devices":{"@type":"@id","@id":"toot:devices"},"messageFranking":"toot:messageFranking","messageType":"toot:messageType","cipherText":"toot:cipherText","suspended":"toot:suspended"}],"id":"https://mas.to/users/rikvipcode","type":"Person","following":"https://mas.to/users/rikvipcode/following","followers":"https://mas.to/users/rikvipcode/followers","inbox":"https://mas.to/users/rikvipcode/inbox","outbox":"https://mas.to/users/rikvipcode/outbox","featured":"https://mas.to/users/rikvipcode/collections/featured","featuredTags":"https://mas.to/users/rikvipcode/collections/tags","preferredUsername":"rikvipcode","name":"","summary":"","url":"https://mas.to/@rikvipcode","manuallyApprovesFollowers":false,"discoverable":false,"published":"2023-05-04T00:00:00Z","devices":"https://mas.to/users/rikvipcode/collections/devices","suspended":true,"publicKey":{"id":"https://mas.to/users/rikvipcode#main-key","owner":"https://mas.to/users/rikvipcode","publicKeyPem":"--...


그리고

[Discourse Activity Pub] GET request to https://mastodon.social/users/ejovoni46709 failed: Expected([200, 201, 202, 301, 302, 307, 308]) <=> Actual(410 Gone)
[Discourse Activity Pub] Failed to process https://mastodon.social/users/ejovoni46709: Could not resolve actor
[Discourse Activity Pub] Failed to process https://mastodon.social/users/ejovoni46709#delete: Could not create actor
[Discourse Activity Pub] Failed to process https://mastodon.social/users/epybisezax9438#delete: Could not find object
3개의 좋아요