Плагин ActivityPub

Привет :wave:
Прежде всего, спасибо за впечатляющую работу, которая была проделана, чтобы всё это стало возможным. Я не мог бы быть счастливее от решения перенести наше сообщество на Discourse благодаря этому.

Я добавил плагин в наш экземпляр и настроил одного актора. Однако при публикации в категории, связанной с актором, я получаю ошибку «Internal Server Error». В логах я не нашёл ничего, кроме сообщения о том, что запрос завершился ошибкой 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 лайка

Вот ошибка:

Сообщение

NoMethodError (не определен метод `moderating_groups` для #<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: "Эта категория используется для объявлений от 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...

Трассировка стека

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

Окружение

HTTP HOSTS: community.tuist.io

Привет! Я администратор lemmy.dbzer0.com и был бы рад увидеть более тесное взаимодействие между Lemmy и Discourse, так как мне кажется, что эти две платформы сочетаются гораздо естественнее, чем Discourse и Mastodon.

Меня в первую очередь интересует возможность для пользователей Lemmy просматривать и взаимодействовать с темами без необходимости создавать отдельные учётные записи для каждого форума Discourse.

Насколько я понимаю, главная проблема заключается в том, что плагин APub не представляет категории Discourse как группы APub, из-за чего Lemmy не может их видеть, верно?

В любом случае, я готов предоставить доступ к своему экземпляру Lemmy и к своей учётной записи администратора для тестирования, если это потребуется. Моя учётная запись на Lemmy: I Challenge Thee

5 лайков

Привет, ребята! С этого момента и как минимум до марта следующего года я снова буду регулярно поддерживать этот плагин. Если вы используете этот плагин и столкнулись с какими-то трудностями, пожалуйста, дайте мне знать! Я постараюсь ответить на как можно больше оставшихся вопросов.

Каждый пользователь в Discourse является актором. Процесс подписки в Discourse работает так же, как и в Lemmy, и подробнее описан в FEP-1b12. Причина, по которой вы пока не можете подписываться на акторов Discourse (то есть основное внимание уделялось подписке на категории), заключается в том, что форумы по своей природе ориентированы на темы, то есть на обсуждения, которые по определению включают нескольких пользователей. Действительно, именно такой подход был выбран другими приложениями в стиле форумов для ActivityPub, и именно над этим мы работаем в целевой группе W3C по форумам и обсуждению в виде веток (вместе с NodeBB и аналогичным программным обеспечением).

То, что вы описываете, — это разница между федерацией «только первое сообщение» и «полная тема». То, чего вы ожидаете, — это как раз то, как работает федерация «полная тема». Пожалуйста, ознакомьтесь с документацией и обучающими видео по этой теме здесь:

Эта ошибка означает, что вы используете устаревшую версию Discourse. Плагин ActivityPub в настоящее время требует последней версии Discourse для работы.

Нет, плагин ActivityPub полностью соответствует FEP-1b12, который был написан Nutomic (создателем Lemmy) для описания федерации на основе групп. Вы пробовали установить федерацию между Lemmy и Discourse?

2 лайка

Вы можете проверить, почему мета-теги не показывают правильно мой домен и не отображают какой-либо контент из мета-тегов?

1 лайк

Есть ли сервер Discourse с этим плагином, с которым мы могли бы протестировать? Я предполагаю, что этот форум его не использует, верно?

1 лайк

Meta использует ActivityPub, например, эта тема не была федерирована:

А эта была:

Где я могу увидеть эту информацию? Также вторая ссылка для меня недоступна

URL этой страницы (в отличие от URI AP) — это

Информацию об AP можно увидеть, нажав на значок AP.

1 лайк

Мне не удаётся найти ни одной темы Apub. Чаще всего иконка просто отсутствует.

А если она есть, то отключена.

Тем не менее, я перешёл по ссылке, которую вы опубликовали, и поискал URL в Lemmy (так обычно находят ссылки, на которые ещё не подписаны), но её не удалось найти. Я также вообще не могу найти форум с объявлениями, чтобы подписаться на него.

1 лайк

Хорошо, мне удалось найти его, поискав как announcements@meta.discourse.org, и я подписался. Я попробую подписаться ещё на несколько тем, чтобы посмотреть, смогу ли я видеть новые посты в Lemmy.

РЕДАКТИРОВАНИЕ: Некоторые сообщества, такие как «Feature» и «Announcements», можно найти, но «Support», «Plugin» и «Bug» — нет. I Challenge Thee

2 лайка

Это потому, что у них нет Акторов. Пожалуйста, ознакомьтесь с документацией и обучающими видео. Вы увидите, что каждой Категории нужно назначить Актора, прежде чем она станет обнаруживаемой.

На Meta, я думаю, Акторы были созданы только для #announcements и #feature.

4 лайка

Но я внешний экземпляр, пытающийся получить федеративный контент от вас. У меня нет к этому доступа, верно?

РЕДАКТИРОВАНИЕ: О, теперь я вижу вкладку федерации, но только иногда. В остальное время она не появляется

2 лайка

Да, это скоро будет исправлено. Если вы её не видите, просто обновите страницу, и она появится. Дайте знать, как получится.

Просто примите к сведению, что @mcdanlj и я обсуждаем это в частном порядке. Скорее всего, это проблема, связанная с историей аккаунта (то есть потому, что Майкл был одним из первых пользователей).

4 лайка

Да, два вопроса:

  1. Что насчёт невозможности найти существующий федеративный тред, например https://meta.discourse.org/ap/object/235d597a789c305cef86318ef84d8762? Я пытался найти его в Lemmy, но он не отображается.
  2. Почему некоторые треки в теме федеративные, а другие нет? Как это определить?

В любом случае, возможно, Following an ActivityPub Actor тоже можно обновить, добавив информацию, связанную с Lemmy?

1 лайк

Вы можете обратиться к разработчикам Lemmy и к @angus по адресу Lemmy - SocialHub, чтобы они могли лучше координировать свои действия. Совместимость с Lemmy была бы замечательной! :tada:


@angus, в недавней статье Mastodon в блоге есть идея, которую стоит реализовать, например, для выделенной темы в профиле пользователя, если эту тему создал сам пользователь:

Мы решили создать новый тип тега OpenGraph — тот же тип тегов, который используется на вашем сайте для определения миниатюры, отображаемой в превью при публикации страницы в Discord, iMessage или Mastodon. Это выглядит так: <meta name="fediverse:creator" content="@Gargron@mastodon.social" />.

Такой мета-тег можно размещать на теме, чтобы Mastodon мог ссылаться на профиль пользователя. Я знаю, что в Discourse нет сущности «пользователь-актор», но если актор ActivityPub, например, издательская компания, а тема касается её каталога, то такой сценарий использования вполне логичен. :wink:

1 лайк

Да, как предлагает @hellekin, я считаю, что более глубокое обсуждение Lemmy / Discourse лучше провести здесь:

Поскольку я возобновляю работу над этим плагином, пожалуйста, задавайте свои более подробные вопросы о Lemmy там, и я скоро отвечу.

Спасибо, я подумаю над этим.

В Discourse акторы пользователей существуют. Просто вы не можете подписываться на них (пока). Поскольку это заблуждение уже три раза прозвучало сегодня, я думаю о том, чтобы разместить эту информацию где-нибудь в интерфейсе. Чтобы ответить на последующий вопрос «Почему нельзя подписываться на акторов пользователей, если они существуют?», сначала нужно ответить на предыдущий вопрос: «Зачем вообще подписываться на акторов пользователей в Discourse?» (то есть каков реальный случай использования).

(Я знаю, что существует Discourse Follow — я его разработал, однако есть разница между подпиской на пользователя внутри инстанса для уведомлений/обнаружения и подпиской на актора пользователя в фединверсе).

4 лайка

Это будет исправлено после слияния.

Обратите также внимание, что скоро я напишу здесь на мета-форуме тему-инструкцию «как сделать» о федерации между Lemmy и Discourse с обучающим видео. Если вы используете или хотите использовать Lemmy для федерации с Discourse, пожалуйста, поделитесь здесь своими мыслями и опытом, и я обязательно учту их в инструкции.

2 лайка

О, отличное обновление, которое только что появилось:

:tada:

3 лайка