Plugin ActivityPub

Olá :wave:
Primeiramente, obrigado pelo impressionante trabalho que foi feito para tornar isso possível. Não poderia estar mais feliz com a decisão de migrar nossa comunidade para o Discourse graças a isso.

Adicionei o plugin à nossa instância e configurei um ator. No entanto, quando posto em uma categoria com um ator associado, recebo um “Internal Server Error”. Não consegui encontrar muito nos logs além do fato de que a solicitação falhou com um erro 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

Qual é o caminho recomendado para depurar esse problema?

O próximo passo é ir para /logs no seu fórum, encontrar a linha de log correspondente e postar o stack trace aqui.

3 curtidas

Aqui está o erro:

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

Olá pessoal, sou o administrador do lemmy.dbzer0.com e adoraria ver uma maior interação entre lemmy e discourse, pois sinto que essas duas peças se encaixam de forma muito mais nativa do que discourse e mastodon.

Estou principalmente interessado em uma maneira para que os usuários do lemmy possam ver e interagir com tópicos sem ter que criar novas contas para cada fórum discourse.

Pelo que entendi, o maior problema é que o plugin apub não representa as categorias do discourse como grupos apub, o que impede o lemmy de vê-los, certo?

De qualquer forma, quero me colocar à disposição, caso queiram ter acesso a uma instância lemmy e a um administrador para testar. Minha conta no lemmy é https://lemmy.dbzer0.com/u/db0

5 curtidas

Olá pessoal, estarei de volta fornecendo suporte regular a este plugin a partir de agora até pelo menos março do próximo ano. Se você tem usado este plugin e está com dificuldades de alguma forma, por favor me avise! Responderei ao maior número possível de perguntas pendentes.

Todo usuário no Discourse está em um Ator. O processo de seguir no Discourse funciona da mesma forma que no Lemmy, e como detalhado em FEP-1b12. O motivo pelo qual você ainda não pode seguir Atores do Discourse (ou seja, o foco principal tem sido seguir categorias) é porque os fóruns são inerentemente centrados em tópicos, ou seja, discussões que envolvem inerentemente vários usuários. De fato, essa é a abordagem que tem sido adotada por outros aplicativos ActivityPub no estilo fórum, e é o que temos trabalhado na força-tarefa do W3C Forum and Threaded Discussion (junto com NodeBB e softwares semelhantes).

O que você está descrevendo é a diferença entre federação “Apenas Primeira Postagem” e “Tópico Completo”. O que você espera é como a federação “Tópico Completo” funciona. Por favor, veja a documentação e os vídeos instrutivos sobre isso aqui.

Este erro significa que você não está executando uma versão atualizada do Discourse. O plugin ActivityPub atualmente requer a versão mais recente do Discourse para funcionar.

Não, o plugin ActivityPub está em total conformidade com o FEP-1b12, que foi escrito por Nutomic (o criador do Lemmy) para descrever a federação baseada em Grupos. Você tentou federar entre Lemmy e Discourse?

2 curtidas

Você é capaz de investigar por que o meta não está mostrando meu domínio corretamente e não está mostrando nenhum conteúdo do meta?

1 curtida

Existe um servidor Discourse com este plugin com o qual podemos testar? Assumo que este fórum não o utiliza, certo?

1 curtida

O Meta usa activitypub, por exemplo, este tópico não foi federado:

E este foi:

Onde posso ver esta informação? Além disso, o segundo link não está disponível para mim

O URL (em oposição ao URI AP) para essa página é

Você pode ver as informações AP clicando no ícone AP.

1 curtida

Estou com dificuldades para encontrar até mesmo um único tópico Apub. Na maioria das vezes, o ícone não existe

E se existir, está desativado.

No entanto, segui o link que você postou e pesquisei o URL no lemmy (que é como se recuperariam links que não haviam sido previamente assinados) e ele não pode ser encontrado. Também não consigo encontrar o fórum de anúncios para poder assinar.

1 curtida

OK, consegui encontrá-lo pesquisando como announcements@meta.discourse.org e me inscrevi. Vou tentar me inscrever em alguns outros tópicos para ver se consigo ver novas postagens no lemmy.

EDIT: Algumas comunidades são encontráveis como Feature e Announcements, mas Support, Plugin e Bug não podem ser encontradas https://lemmy.dbzer0.com/search?q=!plugin%40meta.discourse.org&type=Communities&listingType=All&page=1&sort=TopAll

2 curtidas

É porque eles não têm Atores. Por favor, confira a documentação e os vídeos instrutivos. Você verá que cada Categoria precisa receber um Ator antes de ser encontrável.

No meta, acho que apenas Announcements e Feature tiveram Atores criados para eles.

4 curtidas

Mas eu sou uma instância externa tentando obter conteúdo federado de você. Eu não tenho visibilidade para isso, tenho?

EDIT: Ah, eu vejo a aba de federação agora, mas só às vezes. Outras vezes ela não aparece

2 curtidas

Sim, isso será resolvido em breve. Se você não a vir, basta atualizar a página e ela aparecerá. Me diga como você se sai.

Só para constar que @mcdanlj e eu estamos discutindo isso em particular. É provável que seja um problema histórico (ou seja, porque Michael foi um dos primeiros a adotar).

4 curtidas

Sim, duas perguntas:

  1. E sobre não conseguir encontrar um tópico federado existente como New and improved About page at /about is live - Announcements - Discourse Meta? Tentei procurá-lo no lemmy, mas ele não aparece.
  2. Por que alguns tópicos em um assunto são federados, mas outros não? Como posso saber?

De qualquer forma, talvez Following an ActivityPub Actor também possa ser atualizado com algumas informações relacionadas ao lemmy?

1 curtida

Você poderia perguntar aos desenvolvedores do Lemmy e ao @angus em Lemmy - SocialHub para que eles possam coordenar melhor. Interoperabilidade com Lemmy seria :tada:


@angus, em um artigo recente do blog do Mastodon há algo que vale a pena implementar, por exemplo, para o tópico em destaque no perfil de um usuário, se esse tópico foi iniciado por este usuário:

Decidimos criar um novo tipo de tag OpenGraph — o mesmo tipo de tags que você tem em seu site para determinar qual imagem em miniatura aparecerá na pré-visualização da página ao ser compartilhada no Discord, iMessage ou Mastodon. Parece com isto: <meta name="fediverse:creator" content="@Gargron@mastodon.social" />.

A meta tag apareceria no tópico, para que o Mastodon possa vincular ao perfil do usuário. Sei que não há um ator de usuário no Discourse, mas se o ator do ActivityPub for, digamos, uma editora, e o tópico for sobre o catálogo deles, então o caso de uso faz sentido. :wink:

1 curtida

Sim, como @hellekin sugere, acho que uma discussão mais aprofundada sobre Lemmy / Discourse seria melhor tratada aqui

Como estou retomando o trabalho neste plugin, por favor, poste suas perguntas mais detalhadas sobre Lemmy lá e responderei em breve.

Obrigado, vou pensar sobre isso.

Existem Atores de Usuário no Discourse. Você simplesmente não pode segui-los (atualmente). Como essa concepção errônea já surgiu três vezes hoje, estou pensando em destacar isso em algum lugar na interface do usuário. Em resposta à pergunta de acompanhamento “Por que você não pode seguir atores de usuário se eles existem?”, a pergunta anterior “Por que você gostaria de seguir atores de usuário no Discourse?” precisa ser respondida primeiro (ou seja, qual é um caso de uso real).

(Estou ciente de que Discourse Follow existe - eu o construí - no entanto, há uma diferença entre seguir um usuário dentro de uma instância para fins de notificação/descoberta e seguir um Ator de Usuário no fediverso)

4 curtidas

Isso será corrigido assim que for mesclado.

Note também que escreverei um tópico “como fazer” sobre Lemmy <> Discourse aqui no meta com um vídeo instrutivo em breve. Se você está usando, ou quer usar, Lemmy para federar com Discourse, por favor, adicione seus pensamentos / experiências aqui e eu garantirei que sejam abordados nas instruções.

2 curtidas

Oh, ótima mudança que acabou de chegar:

:tada:

3 curtidas