Плагин ActivityPub

Я попытался установить этот плагин, но в /logs всегда появляется следующее предупреждение:

[Discourse Activity Pub] https://futarino.online/ap/actor/a3838865a250342cf09f7907b653b9d1 не удалось запланировать доставку https://futarino.online/ap/activity/2628ea98d33a52fd2412f9d59541bb91: нет получателей

трейсбэк:

/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. Скопируйте имя пользователя из настроек категории.
  2. Найдите его в Mastodon (оно должно отобразиться).
  3. Подпишитесь на него со своего аккаунта Mastodon.

Так вот в чём проблема: я поискал, но получил большую ошибку 404.
Может быть, это потому, что изменения вступают в силу не сразу?

Сводка


Как выглядят настройки категории ActivityPub? Можете ли вы поделиться скриншотом (особенно значком статуса)? Возможно, отправьте его мне в личные сообщения, чтобы мы не засоряли эту тему.

2 лайка

Существует ли (или будет) способ публиковать старые темы в Fediverse? У меня есть темы с тысячами ответов, которые не федерированы. Не уверен, как можно начать их федерировать?

Администраторы теперь могут запускать публикацию отдельной темы в настроенной категории. Эта функция доступна в меню гаечного ключа поста:

Однако у нас пока нет системы для массовой публикации старых тем, и это не входит в наш приоритетный список. Учитывая эфемерную природу социальных сетей, я не уверен, что существует большой интерес к публикации исторических постов в ActivityPub. Тем не менее, это, скорее всего, можно реализовать с помощью задачи rake.

6 лайков

Есть ли способ сделать наоборот, например, перенести данные из Mastodon обратно в Discourse?

У нас есть автоматизированные заметки о выпуске, которые публикуются в Mastodon, поэтому было бы здорово иметь их зеркальное отображение в Discourse.

3 лайка

В настоящее время это не поддерживается, но это есть в нашем плане работ, и мы планируем заняться этим в течение следующих 2–3 месяцев.

4 лайка

Можно ли получить открытый доступ к этим дорожным картам, например, на GitHub?

2 лайка

Да, я скоро опубликую здесь обновление. (Дорожная карта функций, добавленных на данный момент, находится в нескольких десятках сообщений выше в этой теме.)

4 лайка

Хорошо, вот что мы планируем реализовать для плагина в ближайшие 2–3 месяца:

  • Улучшение производительности плагина (без изменений для пользователей)
  • Добавление более качественных элементов интерфейса для категорий с поддержкой ActivityPub в Discourse
    • это включает отображение дополнительной информации о статистике ActivityPub категории, а также упрощение процесса подписки на категорию через клиенты ActivityPub
  • Возможность подписки категорий Discourse на внешних акторов
    • это позволит синхронизировать контент ActivityPub с категориями Discourse, включая синхронизацию между платформами Discourse через ActivityPub (то есть категория на сайте Discourse A может подписаться на категорию на сайте Discourse B, при условии, что на обоих сайтах плагин установлен и правильно настроен)
  • Исправление ошибок и доработка существующего функционала
    • решение проблем с синхронизацией аватаров и редактированием постов с поддержкой AP другими пользователями (сотрудниками и т. д.)
    • при возможности — устранение текущих ограничений, связанных с изменением авторов и функцией вики
17 лайков

Это может стать невероятным прорывом (или, по крайней мере, началом чего-то невероятного :-). В данный момент экземпляры Discourse, возможно, являются местами для онлайн-встреч и обсуждений наивысшего качества в интернете, но они представляют собой изолированные острова. Некий вид федерации между ними и, возможно, с другими типами серверов (когда это имеет смысл), открыл бы новое окно возможностей. С некоторым волнением следим за этим!

8 лайков

Хочу сообщить вам, что мы только что объединили PR, который позволяет категории Discourse следить за любым аккаунтом в фидиверсе, включая другие категории Discourse. Да, это значит, что теперь вы можете федерировать категорию между двумя (или тремя, или более) инстансами Discourse. В рамках этого этапа в очереди ещё несколько PR, но это был один из самых важных.

Вот видео, где я демонстрирую федерацию между двумя инстансами Discourse и инстансом Mastodon, запущенным на моём компьютере:

29 лайков

Я надеюсь на возможность назначать акторов ActivityPub по тегу, а не по категории. Я думаю, что это также можно реализовать через поддержку плагина интеграции с чатом, что, в свою очередь, позволит проводить дополнительную фильтрацию контента.

Ещё одна интересная идея — помещать каждое сообщение ActivityPub в очередь на утверждение администраторами и модераторами перед публикацией. Это было бы отлично, если бы это позволяло группе подтвердить, готова ли тема к кросс-постингу. То же самое можно применить и к ответам, вместо их автоматической публикации из федиверса обратно на форум.

В любом случае спасибо за работу над этим замечательным плагином.

7 лайков

Поскольку этот призыв адресован программному обеспечению ActivityPub, возможно, здесь есть категория на Meta, с которой мы могли бы взаимодействовать: Discourse - SocialHub :slight_smile:

4 лайка

Нам очень нравится плагин, но в текущей версии есть ошибка, связанная с ограничением длины отрывка и ссылкой на форум. Если ограничение длины отрывка попадает посередине ссылки, то ссылка «Обсудить это на нашем форуме» получает некорректный адрес:

Например:

В результате получается такая итоговая ссылка на форум:
https://jcheminf.biomedcentral.com/a%E2%80%A6%3Cbr%3E%3Cbr%3E%3Ca%20href=

Я не очень хорошо разбираюсь в Ruby, но предполагаю, что код, который обрезает пост по параметру maxlength, должен проверять, не попадает ли он посередине ссылки, прежде чем добавлять финальную ссылку «перейти на форум».

4 лайка

Я отмечаю, что начиная с коммита fb83e554fd ограничение на вики, похоже, снято, но ограничение на смену владельца поста в федеративных категориях остаётся.

Я не меняю владельца поста часто, но посты с описанием категории — пример, который важен для меня. Когда это требуется, я назначаю самого активного модератора категории владельцем, после чего рекомендую ему обновлять эту информацию при необходимости. Сейчас это самое значительное ограничение, которое, насколько мне известно, мешает мне внедрить эту функциональность.

Я осознаю несовместимость моделей Discourse и ActivityPub, порождающую эту проблему. Имеет ли смысл реализовать привилегированное действие (например, для администратора) «отключить федерацию этого поста», которое отправит активность удаления для поста, если он был федерирован, пометит его как никогда не подлежащий федерации, а затем позволит изменить владельца?

5 лайков

Я понимаю ваш сценарий использования, но в данный момент это не является приоритетом высшего уровня. На данный момент я хотел бы сосредоточить наши усилия на доработке функции синхронизации Discourse-to-Discourse, так как, думаю, это потребует значительного внимания в ближайшие несколько недель.

Отличное обнаружение, спасибо за сообщение об ошибке. Мы займемся её изучением.

1 лайк

Будет ли выполнена эта «заполняющая» синхронизация из связанного актора ActivityPub?

Сценарий использования:
Заполнение категории Discourse советами и уведомлениями, которые уже были опубликованы в Mastodon.

3 лайка

Обратная загрузка пока не поддерживается. Я хотел бы добавить эту возможность, особенно для сценария федерации между инстансами Discourse. Для описанного вами случая реализация может оказаться немного сложнее.

8 лайков