ActivityPub 插件

你好 :wave:
首先,感谢您为实现这一目标所付出的辛勤工作。我很高兴能将我们的社区迁移到 Discourse,这要归功于此。

我已将插件添加到我们的实例并配置了一个 actor。但是,当我发布到与 actor 关联的类别时,会收到“内部服务器错误”。我在日志中找不到太多信息,除了请求失败并出现 500 错误:

[no timestamp]  by PostsController#create as JSON
[no timestamp]  Parameters: {"raw"=>"This is just a test test test", "title"=>"This is just a test test test", "unlist_topic"=>"false", "category"=>"10", "is_warning"=>"false", "archetype"=>"regular", "typing_duration_msecs"=>"200", "composer_open_duration_msecs"=>"3160", "shared_draft"=>"false", "draft_key"=>"new_topic", "activity_pub_visibility"=>"public", "nested_post"=>"true"}
Sep 25 15:06:38 - Processing by PostsController#create as JSON
Sep 25 15:06:38 - Parameters: {"raw"=>"This is just a test test test", "title"=>"This is just a test test test", "unlist_topic"=>"false", "category"=>"10", "is_warning"=>"false", "archetype"=>"regular", "typing_duration_msecs"=>"200", "composer_open_duration_msecs"=>"3160", "shared_draft"=>"false", "draft_key"=>"new_topic", "activity_pub_visibility"=>"public", "nested_post"=>"true"}
Sep 25 15:06:38 - 172.18.0.1 - - [25/Sep/2024:13:06:38 +0000] "POST /message-bus/3e2e0add2e9a41cc9ce7041980fe4f81/poll HTTP/1.1" 200 2438 "https://community.tuist.io/c/announcements/10" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:130.0) Gecko/20100101 Firefox/130.0"
Sep 25 15:06:38 - 172.18.0.1 - - [25/Sep/2024:13:06:38 +0000] "POST /message-bus/3e2e0add2e9a41cc9ce7041980fe4f81/poll HTTP/1.1" 200 115 "https://community.tuist.io/c/announcements/10" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:130.0) Gecko/20100101 Firefox/130.0"
[no timestamp]  2024-09-25T13:06:38Z cloudron 37a832f8-20ab-41d7-9d4d-82052354c0eb 1101 37a832f8-20ab-41d7-9d4d-82052354c0eb - 172.18.0.1 - - [25/Sep/2024:13:06:38 +0000] "POST /message-bus/3e2e0add2e9a41cc9ce7041980fe4f81/poll HTTP/1.1" 200 115 "https://community.tuist.io/c/announcements/10" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:130.0) Gecko/20100101 Firefox/130.0"
[no timestamp]  start
Sep 25 15:06:39 - start
[no timestamp]  start
Sep 25 15:06:39 - start
[no timestamp]  done
Sep 25 15:06:39 - done
[no timestamp]  start
Sep 25 15:06:39 - start
[no timestamp]  start
[no timestamp]  start
Sep 25 15:06:39 - start
Sep 25 15:06:39 - start
[no timestamp]  done
Sep 25 15:06:39 - done
[no timestamp]  done
Sep 25 15:06:39 - done
[no timestamp]  500 Internal Server Error in 476ms (ActiveRecord: 0.0ms | Allocations: 56364)
[no timestamp]  done
Sep 25 15:06:39 - Completed 500 Internal Server Error in 476ms (ActiveRecord: 0.0ms | Allocations: 56364)
Sep 25 15:06:39 - done
Sep 25 15:06:39 - 172.18.0.1 - - [25/Sep/2024:13:06:39 +0000] "POST /posts HTTP/1.1" 500 46 "https://community.tuist.io/c/announcements/10" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:130.0) Gecko/20100101 Firefox/130.0"
[no timestamp]  start
Sep 25 15:06:39 - start
[no timestamp]  done
Sep 25 15:06:39 - done
[no timestamp]  done
Sep 25 15:06:39 - done

调试此问题的推荐方法是什么?

下一步是转到论坛上的 /logs,找到相应的日志行,然后在此处发布堆栈跟踪。

3 个赞

错误如下:

Message

NoMethodError (undefined method `moderating_groups' for #<Category id: 10, name: "Announcements", color: "652D90", topic_id: 55, topic_count: 5, created_at: "2024-09-25 09:23:28.181772000 +0000", updated_at: "2024-09-27 11:53:47.131692000 +0000", user_id: 3, topics_year: 4, topics_month: 4, topics_week: 4, slug: "announcements", description: "This category is used for announcements by the mai...", text_color: "FFFFFF", read_restricted: false, auto_close_hours: nil, post_count: 4, latest_post_id: 108, latest_topic_id: 83, position: 7, parent_category_id: nil, posts_year: 4, posts_month: 4, posts_week: 4, email_in: nil, email_in_allow_strangers: false, topics_day: 0, posts_day: 0, allow_badges: true, name_lower: "announcements", auto_close_based_on_last_post: false, topic_template: nil, contains_messages: nil, sort_order: nil, sort_ascending: nil, uploaded_logo_id: nil, uploaded_background_id: nil, topic_featured_link_allowed: true, all_topics_wiki: false, show_subcategory_list: false, num_featured_topics: 3, default_view: nil, subcategory_list_style: "rows_with_featured_topics", default_top_period: "all", mailinglist_mirror: false, minimum_required_tags: 0, navigate_to_first_post_after_read: false, search_priority: 0, allow_global_tags: false, reviewable_by_group_id: nil, read_only_banner: nil, default_list_filter: "all", allow_unlimited_owner_edits_on_first_post: false, default_slow_mode_seconds: nil, uploaded_logo_dark_id: nil, uploaded_background_dark_id: nil>)
lib/plugin/instance.rb:376:in `public_send'
lib/plugin/instance.rb:376:in `block (2 levels) in add_to_class'
lib/plugin/instance.rb:376:in `public_send'
lib/plugin/instance.rb:376:in `block (2 levels) in add_to_class'
lib/plugin/instance.rb:376:in `public_send'
lib/plugin/instance.rb:376:in `block (2 levels) in add_to_class'
lib/plugin/instance.rb:376:in `public_send'
lib/plugin/instance.rb:376:in `block (2 levels) in add_to_class'
lib/plugin/instance.rb:576:in `block in on'
lib/discourse_event.rb:12:in `bl...

Backtrace

activemodel (7.1.3.4) lib/active_model/attribute_methods.rb:489:in `method_missing'
plugins/discourse-activity-pub/plugin.rb:367:in `block (2 levels) in activate!'
lib/plugin/instance.rb:376:in `public_send'
lib/plugin/instance.rb:376:in `block (2 levels) in add_to_class'
plugins/discourse-activity-pub/plugin.rb:331:in `block (2 levels) in activate!'
lib/plugin/instance.rb:376:in `public_send'
lib/plugin/instance.rb:376:in `block (2 levels) in add_to_class'
plugins/discourse-activity-pub/plugin.rb:337:in `block (2 levels) in activate!'
lib/plugin/instance.rb:376:in `public_send'
lib/plugin/instance.rb:376:in `block (2 levels) in add_to_class'
plugins/discourse-activity-pub/app/models/discourse_activity_pub_object.rb:99:in `after_scheduled'
plugins/discourse-activity-pub/app/models/discourse_activity_pub_activity.rb:109:in `after_scheduled'
plugins/discourse-activity-pub/lib/discourse_activity_pub/delivery_handler.rb:89:in `after_scheduled'
plugins/discourse-activity-pub/lib/discourse_activity_pub/delivery_handler.rb:15:in `perform'
plugins/discourse-activity-pub/lib/discourse_activity_pub/delivery_handler.rb:27:in `perform'
plugins/discourse-activity-pub/app/models/concerns/discourse_activity_pub/ap/model_callbacks.rb:160:in `block in activity_pub_deliver_activity'
plugins/discourse-activity-pub/app/models/concerns/discourse_activity_pub/ap/model_callbacks.rb:159:in `each'
plugins/discourse-activity-pub/app/models/concerns/discourse_activity_pub/ap/model_callbacks.rb:159:in `activity_pub_deliver_activity'
plugins/discourse-activity-pub/app/models/concerns/discourse_activity_pub/ap/model_callbacks.rb:41:in `perform_activity_pub_activity'
plugins/discourse-activity-pub/plugin.rb:455:in `block (2 levels) in activate!'
lib/plugin/instance.rb:376:in `public_send'
lib/plugin/instance.rb:376:in `block (2 levels) in add_to_class'
plugins/discourse-activity-pub/plugin.rb:661:in `block (2 levels) in activate!'
lib/plugin/instance.rb:576:in `block in on'
lib/discourse_event.rb:12:in `block in trigger'
/home/cloudron/rbenv/versions/3.2.2/lib/ruby/3.2.0/set.rb:511:in `each_key'
/home/cloudron/rbenv/versions/3.2.2/lib/ruby/3.2.0/set.rb:511:in `each'
lib/discourse_event.rb:12:in `trigger'
lib/post_creator.rb:258:in `trigger_after_events'
lib/post_creator.rb:220:in `create'
lib/new_post_manager.rb:318:in `perform_create_post'
lib/new_post_manager.rb:252:in `perform'
app/controllers/posts_controller.rb:215:in `create'
actionpack (7.1.3.4) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
actionpack (7.1.3.4) lib/abstract_controller/base.rb:224:in `process_action'
actionpack (7.1.3.4) lib/action_controller/metal/rendering.rb:165:in `process_action'
actionpack (7.1.3.4) lib/abstract_controller/callbacks.rb:259:in `block in process_action'
activesupport (7.1.3.4) lib/active_support/callbacks.rb:121:in `block in run_callbacks'
app/controllers/application_controller.rb:424:in `block in with_resolved_locale'
i18n (1.14.5) lib/i18n.rb:351:in `with_locale'
app/controllers/application_controller.rb:424:in `with_resolved_locale'
activesupport (7.1.3.4) lib/active_support/callbacks.rb:130:in `block in run_callbacks'
activesupport (7.1.3.4) lib/active_support/callbacks.rb:141:in `run_callbacks'
actionpack (7.1.3.4) lib/abstract_controller/callbacks.rb:258:in `process_action'
actionpack (7.1.3.4) lib/action_controller/metal/rescue.rb:25:in `process_action'
actionpack (7.1.3.4) lib/action_controller/metal/instrumentation.rb:74:in `block in process_action'
activesupport (7.1.3.4) lib/active_support/notifications.rb:206:in `block in instrument'
activesupport (7.1.3.4) lib/active_support/notifications/instrumenter.rb:58:in `instrument'
activesupport (7.1.3.4) lib/active_support/notifications.rb:206:in `instrument'
actionpack (7.1.3.4) lib/action_controller/metal/instrumentation.rb:73:in `process_action'
actionpack (7.1.3.4) lib/action_controller/metal/params_wrapper.rb:261:in `process_action'
activerecord (7.1.3.4) lib/active_record/railties/controller_runtime.rb:32:in `process_action'
actionpack (7.1.3.4) lib/abstract_controller/base.rb:160:in `process'
actionview (7.1.3.4) lib/action_view/rendering.rb:40:in `process'
rack-mini-profiler (3.3.1) lib/mini_profiler/profiling_methods.rb:89:in `block in profile_method'
actionpack (7.1.3.4) lib/action_controller/metal.rb:227:in `dispatch'
actionpack (7.1.3.4) lib/action_controller/metal.rb:309:in `dispatch'
actionpack (7.1.3.4) lib/action_dispatch/routing/route_set.rb:49:in `dispatch'
actionpack (7.1.3.4) lib/action_dispatch/routing/route_set.rb:32:in `serve'
actionpack (7.1.3.4) lib/action_dispatch/journey/router.rb:51:in `block in serve'
actionpack (7.1.3.4) lib/action_dispatch/journey/router.rb:131:in `block in find_routes'
actionpack (7.1.3.4) lib/action_dispatch/journey/router.rb:124:in `each'
actionpack (7.1.3.4) lib/action_dispatch/journey/router.rb:124:in `find_routes'
actionpack (7.1.3.4) lib/action_dispatch/journey/router.rb:32:in `serve'
actionpack (7.1.3.4) lib/action_dispatch/routing/route_set.rb:882:in `call'
lib/middleware/omniauth_bypass_middleware.rb:64:in `call'
rack (2.2.9) lib/rack/tempfile_reaper.rb:15:in `call'
rack (2.2.9) lib/rack/conditional_get.rb:40:in `call'
rack (2.2.9) lib/rack/head.rb:12:in `call'
actionpack (7.1.3.4) lib/action_dispatch/http/permissions_policy.rb:36:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:393:in `call'
lib/middleware/csp_script_nonce_injector.rb:12:in `call'
config/initializers/008-rack-cors.rb:14:in `call'
rack (2.2.9) lib/rack/session/abstract/id.rb:266:in `context'
rack (2.2.9) lib/rack/session/abstract/id.rb:260:in `call'
actionpack (7.1.3.4) lib/action_dispatch/middleware/cookies.rb:689:in `call'
actionpack (7.1.3.4) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
activesupport (7.1.3.4) lib/active_support/callbacks.rb:101:in `run_callbacks'
actionpack (7.1.3.4) lib/action_dispatch/middleware/callbacks.rb:28:in `call'
actionpack (7.1.3.4) lib/action_dispatch/middleware/debug_exceptions.rb:29:in `call'
actionpack (7.1.3.4) lib/action_dispatch/middleware/show_exceptions.rb:31:in `call'
logster (2.20.0) lib/logster/middleware/reporter.rb:40:in `call'
lib/freedom_patches/rails_rack_logger_from_rails_7_2.rb:35:in `call_app'
lib/freedom_patches/rails_rack_logger_from_rails_7_2.rb:22:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
actionpack (7.1.3.4) lib/action_dispatch/middleware/request_id.rb:28:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
rack (2.2.9) lib/rack/method_override.rb:24:in `call'
actionpack (7.1.3.4) lib/action_dispatch/middleware/executor.rb:14:in `call'
actionpack (7.1.3.4) lib/action_dispatch/middleware/static.rb:25:in `call'
rack (2.2.9) lib/rack/sendfile.rb:110:in `call'
rack-mini-profiler (3.3.1) lib/mini_profiler.rb:191:in `call'
message_bus (4.3.8) lib/message_bus/rack/middleware.rb:60:in `call'
lib/middleware/request_tracker.rb:360:in `call'
actionpack (7.1.3.4) lib/action_dispatch/middleware/remote_ip.rb:92:in `call'
railties (7.1.3.4) lib/rails/engine.rb:536:in `call'
railties (7.1.3.4) lib/rails/railtie.rb:226:in `public_send'
railties (7.1.3.4) lib/rails/railtie.rb:226:in `method_missing'
rack (2.2.9) lib/rack/urlmap.rb:74:in `block in call'
rack (2.2.9) lib/rack/urlmap.rb:58:in `each'
rack (2.2.9) 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_ser

Env

HTTP HOSTS: community.tuist.io

嘿,我是 lemmy.dbzer0.com 的管理员,我希望看到 lemmy 和 discourse 之间有更多的互动,因为我觉得这两者比 discourse 和 mastodon 结合得更自然。

我主要感兴趣的是让 lemmy 用户能够在不为每个 discourse 论坛创建新账户的情况下查看和互动话题。

据我所知,最大的问题是 apub 插件没有将 discourse 分类表示为 apub 组,这导致 lemmy 无法看到它们,对吗?

无论如何,如果你想访问一个 lemmy 实例和一个管理员进行测试,我很乐意提供帮助。我在 lemmy 上的账户是 https://lemmy.dbzer0.com/u/db0

5 个赞

大家好,我将从现在开始一直到明年三月,定期为这个插件提供支持。如果您一直在使用此插件并且在某些方面遇到困难,请告诉我!我会尽力回答所有未解决的问题。

Discourse 中的每个用户都在一个 Actor 中。Discourse 中的关注流程与 Lemmy 中的相同,并且在 FEP-1b12 中有更详细的说明。您还不能关注 Discourse Actor(即主要关注点一直是关注类别)的原因是,论坛本质上是围绕主题的,即涉及多个用户的讨论。事实上,其他论坛式 ActivityPub 应用程序也采用了这种方法,这也是我们在 W3C 论坛和主题讨论工作组(以及 NodeBB 和类似软件)中一直在努力的方向。

您所描述的是“仅首帖”和“完整主题”联合之间的区别。您期望的是“完整主题”联合的工作方式。请参阅此处的文档和教学视频。

此错误意味着您运行的 Discourse 版本不是最新的。ActivityPub 插件目前需要最新版本的 Discourse 才能工作。

不,ActivityPub 插件完全符合 FEP-1b12,该标准由 Nutomic(Lemmy 的创建者)编写,用于描述基于群组的联合。您是否尝试过在 Lemmy 和 Discourse 之间进行联合?

2 个赞

您能否调查一下为什么 meta 没有正确显示我的域名,也没有显示我的任何 meta 内容?

1 个赞

是否有支持此插件的 Discourse 服务器可供我们测试?我猜这个论坛不使用它,对吗?

1 个赞

Meta确实使用activitypub,例如,这个主题没有联合:

这个主题则联合了:

我在哪里可以看到此信息?另外,第二个链接对我来说不可用

该页面的 URL(而非 AP uri)是:

您可以通过点击 AP 图标来查看 AP 信息。

1 个赞

我很难找到任何 Apub 主题。大多数情况下,图标不存在

即使存在,它也是禁用的。

不过,我还是按照您发布的链接,在 lemmy 中搜索了该网址(这是检索之前未订阅的链接的方式),但找不到。我也找不到公告论坛,因此无法订阅它。

1 个赞

好的,我通过搜索 announcements@meta.discourse.org 找到了它并订阅了。我将尝试订阅其他几个话题,看看是否能在 lemmy 中看到新帖子。

编辑:一些社区可以找到,例如 Feature 和 Announcements,但 Support、Plugin 和 Bug 找不到 https://lemmy.dbzer0.com/search?q=!plugin%40meta.discourse.org&type=Communities&listingType=All&page=1&sort=TopAll

2 个赞

这是因为它们没有 Actor。请查看文档和教学视频。您会发现每个 Category 都需要指定一个 Actor 才能被找到。

在 meta 上,我认为只有 AnnouncementsFeature 被创建了 Actor。

4 个赞

但我是一个外部实例,试图从你那里获取联合内容。我无法看到那个,对吧?

编辑:哦,我现在看到了联合选项卡,但只是有时。其他时候它不出现

2 个赞

是的,这个问题很快就会得到解决。如果您看不到它,只需刷新页面即可出现。请告诉我您的进展。

请注意,我和 @mcdanlj 正在私下讨论此事。这很可能是一个历史遗留问题(即因为 Michael 是早期采用者)。

4 个赞

是的,有两个问题:

  1. 无法找到现有的联合线程,例如 https://meta.discourse.org/ap/object/235d597a789c305cef86318ef84d8762?我在 lemmy 上搜索过它,但它没有出现。
  2. 为什么一个主题中的某些线程是联合的,而其他线程不是?我该如何判断?

另外,也许 Following an ActivityPub Actor 也可以更新一些与 lemmy 相关的信息?

1 个赞

您可以同时询问 Lemmy 开发者和 @angus(地址:https://socialhub.activitypub.rocks/c/software/lemmy/46),以便他们更好地协调。与 Lemmy 的互操作将是 :tada:


@angus,在 最近的一篇 Mastodon 博客文章 中,有一个值得实现的功能,例如,用于用户个人资料中的特色主题,如果该主题是由该用户发起的:

我们决定创建一种新的 OpenGraph 标签——与您网站上用于确定在 Discord、iMessage 或 Mastodon 上共享页面时预览缩略图的标签类型相同。它看起来像这样:<meta name="fediverse:creator" content="@Gargron@mastodon.social" />

元标签将出现在主题上,以便 Mastodon 可以链接到用户的个人资料。我知道 Discourse 中没有用户 actor,但如果 ActivityPub actor 是一个出版公司,而该主题是关于他们的目录的,那么用例就说得通了。 :wink:

1 个赞

是的,正如 @hellekin 所建议的,我认为更深入的 Lemmy / Discourse 讨论最好在这里进行:

随着我恢复此插件的工作,请在那里发布您更详细的 Lemmy 问题,我将很快跟进。

谢谢,我会考虑一下。

Discourse 中存在用户 Actor。您只是无法关注它们(目前)。由于这个误解今天已经出现三次了,我正在考虑在 UI 的某个地方显示它。回答后续问题“为什么不能关注用户 Actor,如果它们存在的话?”,首先需要回答之前的问题“为什么要在 Discourse 中关注用户 Actor?”(即,真正的用例是什么)。

(我知道 Discourse Follow 存在 - 我构建了它 - 但是在实例内关注用户以用于通知/发现目的与在联邦宇宙中关注用户 Actor 之间存在差异)

4 个赞

一旦合并,这个问题就会得到修复。

另外请注意,我很快就会在 meta 上写一篇关于 Lemmy ↔ Discourse 的“如何做”主题,并附带教学视频。如果您正在使用或想使用 Lemmy 与 Discourse 进行联合,请在此处添加您的想法/经验,我将确保在说明中解决它们。

2 个赞

太棒了,刚刚上线了一个很棒的改动:

:tada:

3 个赞