Локальные акторы ActivityPub создаются без ключевых пар

Я не могу понять, как заставить посты federate в Mastodon; актеров я могу отслеживать без проблем. В логах при попытке Discourse доставить пост я получаю следующие ошибки:

[Discourse Activity Pub] https://discuss.privacyguides.net/ap/actor/a93549c3c7883784eda700f30de0c96b не удалось доставить по адресу https://mstdn.party/users/staff/inbox --- !ruby/hash:ActiveSupport::HashWithIn
[Discourse Activity Pub] POST-запрос к https://mastodon.neat.computer/users/jonah/inbox не удался: Ожидалось([200, 201, 202]) <==> Фактически(401 Unauthorized)
[Discourse Activity Pub] https://discuss.privacyguides.net/ap/actor/227cc2ddaa4ded69c2a58214031da3ce не удалось доставить по адресу https://mastodon.neat.computer/users/jonah/inbox --- !ruby/hash:ActiveSupport:
[Discourse Activity Pub] POST-запрос к https://mstdn.party/users/staff/inbox не удался: Ожидалось([200, 201, 202]) <==> Фактически(401 Unauthorized)

Я отключил настройку «Activity pub требует подписанных запросов» и включил ведение журнала в настройках; все остальные настройки остаются по умолчанию. Эти экземпляры Mastodon находятся за Cloudflare, но я вижу, что Cloudflare не блокирует запросы, а логи сервиса mastodon-web показывают, что сам Mastodon возвращает коды 401 (хотя я не знаю, как увеличить детализацию логов Mastodon, чтобы понять причину этого).

Есть ли какая-то причина, по которой это происходит?

Редактирование: Mastodon не принимает HTTP-подписи, хотя на этом экземпляре не включена функция «Authorized Fetch»:

Mar 08 16:47:07 neat-mastodon bundle[3119591]: D, [2025-03-08T16:47:07.963455 #3119591] DEBUG -- : [e6b2bc50-09e1-464e-a937-4c43ef32bd99] Signature verification failed: Request not signed
Mar 08 16:47:07 neat-mastodon bundle[3119591]: I, [2025-03-08T16:47:07.964520 #3119591]  INFO -- : [e6b2bc50-09e1-464e-a937-4c43ef32bd99] method=POST path=/users/jonah/inbox format=html controller=ActivityPub::InboxesController action=create status=401 allocations=1256 duration=9.15 view=0.69 db=1.86

Редактирование 2: Похоже, что почтовые ящики для моих пользователей Discourse недоступны: https://verify.funfedi.dev/?actor_uri=jonah%40discuss.privacyguides.net

    "Resolving acct:jonah@discuss.privacyguides.net using webfinger",
    "Resolved to https://discuss.privacyguides.net/ap/actor/227cc2ddaa4ded69c2a58214031da3ce",
    "Running verification for alice",
    "Got inbox None", [...]

Это работает как ожидалось для актера группы: https://verify.funfedi.dev/?actor_uri=articles%40discuss.privacyguides.net :thinking:

Редактирование 3: для GET-запроса к https://discuss.privacyguides.net/ap/actor/227cc2ddaa4ded69c2a58214031da3ce

{
    "id": "https://discuss.privacyguides.net/ap/actor/227cc2ddaa4ded69c2a58214031da3ce",
    "type": "Person",
    "updated": "2025-03-08T06:34:19Z",
    "url": "https://discuss.privacyguides.net/u/jonah",
    "name": "Jonah Aragon",
    "inbox": null,
    "outbox": null,
    "sharedInbox": "https://discuss.privacyguides.net/ap/users/inbox",
    "followers": "https://discuss.privacyguides.net/ap/actor/227cc2ddaa4ded69c2a58214031da3ce/followers",
    "preferredUsername": "jonah",
    "icon": {
        "type": "Image",
        "mediaType": "image/png",
        "url": "https://forum-cdn.privacyguides.net/user_avatar/discuss.privacyguides.net/jonah/96/8151_2.png"
    },
    "@context": "https://www.w3.org/ns/activitystreams"
}

Привет, @JonahAragon1, давайте попробуем разобраться.

Вы отключили это до или после тестирования? Если до, попробуйте включить.

В более широком смысле, я планирую добавить более подробное логирование сообщений об ошибках, чтобы упростить диагностику различных случаев. С этой целью я создал PR:

Если вы сможете попробовать ещё раз после его слияния и поделиться теми же логами.

У меня эта настройка снова включена, так как я выяснил, что проблема в том, что почтовые ящики пользователей не создаются. Сейчас я обновлю плагин :+1:

Личные аккаунты пользователей в настоящее время не имеют индивидуальных входящих. Mastodon использует и поддерживает sharedInbox. Здесь происходит что-то ещё.

Помимо логирования, все настройки возвращены к значениям по умолчанию:

[Discourse Activity Pub] POST-запрос к https://mastodon.neat.computer/users/jonah/inbox не удался: {"error":"Request not signed"}
stack trace
activesupport-7.2.2.1/lib/active_support/broadcast_logger.rb:130:in `block in warn'

activesupport-7.2.2.1/lib/active_support/broadcast_logger.rb:231:in `block in dispatch'

activesupport-7.2.2.1/lib/active_support/broadcast_logger.rb:231:in `each'

activesupport-7.2.2.1/lib/active_support/broadcast_logger.rb:231:in `dispatch'

activesupport-7.2.2.1/lib/active_support/broadcast_logger.rb:130:in `warn'

/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/logger.rb:26:in `log'

/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/logger.rb:63:in `warn'

/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/request.rb:66:in `rescue in perform'

/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/request.rb:48:in `perform'

/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/request.rb:44:in `post_json_ld'

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

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

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

rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `with_connection'
/var/www/discourse/app/jobs/base.rb:303:in `block in perform'

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

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

sidekiq-7.3.9/lib/sidekiq/processor.rb:220:in `execute_job'

sidekiq-7.3.9/lib/sidekiq/processor.rb:185:in `block (4 levels) in process'

sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:180:in `traverse'

sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'

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

sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'

sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'

sidekiq-7.3.9/lib/sidekiq/job/interrupt_handler.rb:9:in `call'

sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'

sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'

sidekiq-7.3.9/lib/sidekiq/metrics/tracking.rb:26:in `track'

sidekiq-7.3.9/lib/sidekiq/metrics/tracking.rb:134:in `call'

sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'

sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:173:in `invoke'

sidekiq-7.3.9/lib/sidekiq/processor.rb:184:in `block (3 levels) in process'

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

sidekiq-7.3.9/lib/sidekiq/job_retry.rb:118:in `local'

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

sidekiq-7.3.9/lib/sidekiq/config.rb:39:in `block in <class:Config>'

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

sidekiq-7.3.9/lib/sidekiq/processor.rb:281:in `stats'

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

sidekiq-7.3.9/lib/sidekiq/job_logger.rb:15:in `call'

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

sidekiq-7.3.9/lib/sidekiq/job_retry.rb:85:in `global'

sidekiq-7.3.9/lib/sidekiq/processor.rb:132:in `block in dispatch'

sidekiq-7.3.9/lib/sidekiq/job_logger.rb:40:in `prepare'

sidekiq-7.3.9/lib/sidekiq/processor.rb:131:in `dispatch'

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

sidekiq-7.3.9/lib/sidekiq/processor.rb:182:in `handle_interrupt'

sidekiq-7.3.9/lib/sidekiq/processor.rb:182:in `block in process'

sidekiq-7.3.9/lib/sidekiq/processor.rb:181:in `handle_interrupt'

sidekiq-7.3.9/lib/sidekiq/processor.rb:181:in `process'

sidekiq-7.3.9/lib/sidekiq/processor.rb:86:in `process_one'

sidekiq-7.3.9/lib/sidekiq/processor.rb:76:in `run'

sidekiq-7.3.9/lib/sidekiq/component.rb:10:in `watchdog'

sidekiq-7.3.9/lib/sidekiq/component.rb:19:in `block in safe_thread'

Привет, похоже, проблема Mastodon в том, что запрос не подписан.

Вы уверены, что запись в журнале была создана после повторного включения Activity pub require signed requests?

Да, это верно.

Извините, что настаиваю, однако Mastodon возвращает эту ошибку, когда в заголовках запроса вообще нет подписи, поэтому маловероятно, что опция «ActivityPub требует подписанных запросов» была включена при отправке запроса. Не могли бы вы инициировать совершенно новый запрос POST?

Ага, думаю, проблема в том, что Cloudflare удаляет заголовки из запроса.

Да, это ошибка при настройках по умолчанию с включённой данной опцией.

[Discourse Activity Pub] POST-запрос к https://mstdn.party/users/staff/inbox не удался: {"error":"Request not signed"}
10:40
[Discourse Activity Pub] https://discuss.privacyguides.net/ap/actor/227cc2ddaa4ded69c2a58214031da3ce не удалось доставить на https://mstdn.party/users/staff/inbox --- !ruby/hash:ActiveSupport::HashWithIn
10:40
[Discourse Activity Pub] POST-запрос к https://mastodon.neat.computer/users/jonah/inbox не удался: {"error":"Request not signed"}
10:40
[Discourse Activity Pub] https://discuss.privacyguides.net/ap/actor/227cc2ddaa4ded69c2a58214031da3ce не удалось доставить на https://mastodon.neat.computer/users/jonah/inbox --- !ruby/hash:ActiveSupport:
10:40
[Discourse Activity Pub] POST-запрос к https://social.lol/users/jonah/inbox не удался: {"error":"Request not signed"}
10:40
[Discourse Activity Pub] https://discuss.privacyguides.net/ap/actor/227cc2ddaa4ded69c2a58214031da3ce не удалось доставить на https://social.lol/users/jonah/inbox --- !ruby/hash:ActiveSupport::HashWithInd

(Отмечу, что social.lol не находится за Cloudflare, как и сам форум).

Редактирование: если вы хотите подписаться на @videos@discuss.privacyguides.net с работающего аккаунта Mastodon, дайте знать, и я могу повторно отправить пост с форума.

Хорошо, пожалуйста, создайте новый пост с этим актером.

Получили ли вы посты корректно? Похоже, что да.

2
[Discourse Activity Pub] POST-запрос к https://angus.ngrok.io/ap/actor/0eafb34c67153d61db44234de294a98d/inbox не удался: {"errors":["Request not signed"]}
10:56
2
[Discourse Activity Pub] Не удалось доставить https://discuss.privacyguides.net/ap/actor/227cc2ddaa4ded69c2a58214031da3ce в https://angus.ngrok.io/ap/actor/0eafb34c67153d61db44234de294a98d/inbox --- !ru
10:56
[Discourse Activity Pub] https://discuss.privacyguides.net/ap/actor/705b7513d0446e001d7f750115e6395f успешно доставлен в https://mstdn.party/users/staff/inbox --- !ruby/hash:ActiveSupport::HashW
11:00
[Discourse Activity Pub] https://discuss.privacyguides.net/ap/actor/705b7513d0446e001d7f750115e6395f успешно доставлен в https://social.lol/users/jonah/inbox --- !ruby/hash:ActiveSupport::HashWi
11:00
[Discourse Activity Pub] https://discuss.privacyguides.net/ap/actor/705b7513d0446e001d7f750115e6395f успешно доставлен в https://mastodon.neat.computer/users/jonah/inbox --- !ruby/hash:ActiveSup
11:00
3
[Discourse Activity Pub] Не удалось доставить https://discuss.privacyguides.net/ap/actor/227cc2ddaa4ded69c2a58214031da3ce в https://mstdn.party/users/staff/inbox --- !ruby/hash:ActiveSupport::HashWithIn
11:01
3
[Discourse Activity Pub] Не удалось доставить https://discuss.privacyguides.net/ap/actor/227cc2ddaa4ded69c2a58214031da3ce в https://social.lol/users/jonah/inbox --- !ruby/hash:ActiveSupport::HashWithInd
11:01
3
[Discourse Activity Pub] Не удалось доставить https://discuss.privacyguides.net/ap/actor/227cc2ddaa4ded69c2a58214031da3ce в https://mastodon.neat.computer/users/jonah/inbox --- !ruby/hash:ActiveSupport:
11:01
2
[Discourse Activity Pub] Не удалось доставить https://discuss.privacyguides.net/ap/actor/227cc2ddaa4ded69c2a58214031da3ce в https://mstdn.party/users/staff/inbox --- !ruby/hash:ActiveSupport::HashWithIn
11:01
2
[Discourse Activity Pub] Не удалось доставить https://discuss.privacyguides.net/ap/actor/227cc2ddaa4ded69c2a58214031da3ce в https://mastodon.neat.computer/users/jonah/inbox --- !ruby/hash:ActiveSupport:
11:01
2
[Discourse Activity Pub] Не удалось доставить https://discuss.privacyguides.net/ap/actor/227cc2ddaa4ded69c2a58214031da3ce в https://social.lol/users/jonah/inbox --- !ruby/hash:ActiveSupport::HashWithInd
11:01
[Discourse Activity Pub] https://discuss.privacyguides.net/ap/actor/227cc2ddaa4ded69c2a58214031da3ce успешно доставлен в https://angus.ngrok.io/ap/actor/0eafb34c67153d61db44234de294a98d/inbox --
11:01
[Discourse Activity Pub] https://discuss.privacyguides.net/ap/actor/227cc2ddaa4ded69c2a58214031da3ce успешно доставлен в https://angus.ngrok.io/ap/actor/0eafb34c67153d61db44234de294a98d/inbox --
11:01
[Discourse Activity Pub] https://discuss.privacyguides.net/ap/actor/705b7513d0446e001d7f750115e6395f успешно доставлен в https://angus.ngrok.io/ap/actor/0eafb34c67153d61db44234de294a98d/inbox --
11:01
[Discourse Activity Pub] https://discuss.privacyguides.net/ap/actor/a93549c3c7883784eda700f30de0c96b успешно доставлен в https://angus.ngrok.io/ap/actor/0eafb34c67153d61db44234de294a98d/inbox --
11:02
2
[Discourse Activity Pub] Не удалось доставить https://discuss.privacyguides.net/ap/actor/a93549c3c7883784eda700f30de0c96b в https://mstdn.party/users/staff/inbox --- !ruby/hash:ActiveSupport::HashWithIn
11:02
2
[Discourse Activity Pub] Не удалось доставить https://discuss.privacyguides.net/ap/actor/a93549c3c7883784eda700f30de0c96b в https://mastodon.neat.computer/users/jonah/inbox --- !ruby/hash:ActiveSupport:
11:02
2
[Discourse Activity Pub] Не удалось доставить https://discuss.privacyguides.net/ap/actor/a93549c3c7883784eda700f30de0c96b в https://social.lol/users/jonah/inbox --- !ruby/hash:ActiveSupport::HashWithInd
11:02
15
[Discourse Activity Pub] POST-запрос к https://mastodon.neat.computer/users/jonah/inbox не удался: {"error":"Request not signed"}
11:02
12
[Discourse Activity Pub] POST-запрос к https://social.lol/users/jonah/inbox не удался: {"error":"Request not signed"}
11:02
[Discourse Activity Pub] Не удалось доставить https://discuss.privacyguides.net/ap/actor/227cc2ddaa4ded69c2a58214031da3ce в https://mastodon.neat.computer/users/jonah/inbox --- !ruby/hash:ActiveSupport:
11:02
[Discourse Activity Pub] Не удалось доставить https://discuss.privacyguides.net/ap/actor/227cc2ddaa4ded69c2a58214031da3ce в https://social.lol/users/jonah/inbox --- !ruby/hash:ActiveSupport::HashWithInd
11:02
[Discourse Activity Pub] POST-запрос к https://angus.ngrok.io/ap/actor/0eafb34c67153d61db44234de294a98d/inbox не удался: Конечная точка angus.ngrok.io недоступна. ERR_NGROK_3200
11:02
[Discourse Activity Pub] Не удалось доставить https://discuss.privacyguides.net/ap/actor/227cc2ddaa4ded69c2a58214031da3ce в https://angus.ngrok.io/ap/actor/0eafb34c67153d61db44234de294a98d/inbox --- !ru
11:02
16
[Discourse Activity Pub] POST-запрос к https://mstdn.party/users/staff/inbox не удался: {"error":"Request not signed"}
11:02
2
[Discourse Activity Pub] Не удалось доставить https://discuss.privacyguides.net/ap/actor/227cc2ddaa4ded69c2a58214031da3ce в https://mstdn.party/users/staff/inbox --- !ruby/hash:ActiveSupport::HashWithIn
11:02

Обратите внимание, что @JonahAragon1 и я обсудили это в чате, и проблема заключается в том, что локальные актеры пользователей каким-то образом создаются без пар ключей.

@JonahAragon1 я протестирую несколько вещей и вернусь к вам.

Привет @JonahAragon1,

Есть ли какие-либо различия между этими пользователями на вашем форуме, что-то приходит вам в голову?

Ключи были созданы для аккаунтов Shampoo и Bhaelros, но не для basenote и jonah. Есть ли какие-либо общие различия между этими двумя группами пользователей на вашем сайте?

Хм, нет. Я не могу придумать причину этого. Хотя jonah является администратором, остальные — обычные пользователи.

misc.

Bhaelros и basenote оба имеют уровень доверия 3 (Regulars), поэтому должны быть одинаковыми.

Странно, что у Shampoo также сгенерированы inbox/outbox, в то время как у basenote и jonah их нет. Значит, ни ensure_keys, ни ensure_inbox_and_outbox не работают?:

GET https://discuss.privacyguides.net/ap/actor/310a0986b6bf613b61ca5e85a8521ecb

{
    "id": "https://discuss.privacyguides.net/ap/actor/310a0986b6bf613b61ca5e85a8521ecb",
    "type": "Person",
    "updated": "2025-03-11T17:58:08Z",
    "url": "https://discuss.privacyguides.net/u/Shampoo",
    "inbox": "https://discuss.privacyguides.net/ap/actor/310a0986b6bf613b61ca5e85a8521ecb/inbox",
    "outbox": "https://discuss.privacyguides.net/ap/actor/310a0986b6bf613b61ca5e85a8521ecb/outbox",
    "sharedInbox": "https://discuss.privacyguides.net/ap/users/inbox",
    "followers": "https://discuss.privacyguides.net/ap/actor/310a0986b6bf613b61ca5e85a8521ecb/followers",
    "preferredUsername": "Shampoo",
    "publicKey": {
        "id": "https://discuss.privacyguides.net/ap/actor/310a0986b6bf613b61ca5e85a8521ecb#main-key",
        "owner": "https://discuss.privacyguides.net/ap/actor/310a0986b6bf613b61ca5e85a8521ecb",
        "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAleqeCRZW1utTN/L5GjkY\n+2Baron4FnSKRMKW70IWfqI4rs8dfh2xhKW5qXxaBPhXf13FAOJvQvFhQ90eqRrn\nKkuMsntZN0dfpDUZ3E0iIp8fuUEVk2PmquLziiy9+zu8n5ak65lJKDYnKVtFth5G\nFJyUt6GYicY8UlUh6dPxafJ/gw6YTlvT3hO0X0H0L+hYwqHJpppl6niSDi6WQzME\nWM1hyBpv2Y2NspEexrkSVh+SIR3nJ8J1R+o+2bLJ4Hl34nYhtNyTy9AOddoQYDMw\nICZAkCLQDweid50fGakWmRB5EXfL6s2EdzEh8MOE7cyCOXgFrxTJYUTwg5TiLEQY\npQIDAQAB\n-----END PUBLIC KEY-----\n"
    },
    "icon": {
        "type": "Image",
        "mediaType": "image/png",
        "url": "https://forum-cdn.privacyguides.net/user_avatar/discuss.privacyguides.net/shampoo/96/4073_2.png"
    },
    "@context": "https://www.w3.org/ns/activitystreams"
}

GET https://discuss.privacyguides.net/ap/actor/a93549c3c7883784eda700f30de0c96b

{
    "id": "https://discuss.privacyguides.net/ap/actor/a93549c3c7883784eda700f30de0c96b",
    "type": "Person",
    "updated": "2025-03-08T06:34:19Z",
    "url": "https://discuss.privacyguides.net/u/basenote",
    "inbox": null,
    "outbox": null,
    "sharedInbox": "https://discuss.privacyguides.net/ap/users/inbox",
    "followers": "https://discuss.privacyguides.net/ap/actor/a93549c3c7883784eda700f30de0c96b/followers",
    "preferredUsername": "basenote",
    "icon": {
        "type": "Image",
        "mediaType": "image/png",
        "url": "https://forum-cdn.privacyguides.net/user_avatar/discuss.privacyguides.net/basenote/96/15_2.png"
    },
    "@context": "https://www.w3.org/ns/activitystreams"
}

Я до сих пор не уверен, как эти акторы оказались в таком состоянии. Это специфично для вашего сайта. В общем случае создание ключа актора и входящей/исходящей почты работает как ожидается. Тем не менее, это обновление должно гарантировать, что такая ситуация будет решена при необходимости:

@JonahAragon1 PR принят. Не могли бы вы обновиться и сообщить, как всё прошло?

Похоже, что эта конкретная проблема уже исправлена, хотя я всё ещё сталкиваюсь с общими трудностями при отображении постов в Mastodon.

Не могли бы вы поделиться ещё немного подробностями?

Да, я отвечу или создам новую публикацию на этой неделе, просто сейчас я в отъезде.

Основные проблемы, которые я наблюдаю: посты не отображаются как репосты от актора категории (иногда я могу найти их в Mastodon, вручную поискав актора пользователя), а посты форума вообще не публикуются в AP. Также у меня возникли трудности с подпиской на новых акторов категорий, чего раньше не было. Если посмотреть здесь, там указано, что подписчиков не найдено.

Я заметил, что многие посты здесь на Meta в категориях с поддержкой AP отображаются с индикаторами того, что они не опубликованы в AP (как этот пост), так что, возможно, я просто не понимаю, как это должно работать…

В логах нет явных ошибок по всем этим вопросам, можно было бы подумать, что всё работает нормально, судя по успешным уведомлениям в логах. Всё это мне предстоит изучить подробнее, когда у меня будет больше времени.