ActivityPub-Plugin

@hellekin Danke für den Bericht. Bei einem ActivityPub-Dienst wird es immer zu einer bestimmten Anzahl fehlgeschlagener Anfragen kommen, da Akteure im Fediverse kommen und gehen. Zum Beispiel sieht es so aus:

Die Ausführlichkeit der Logs dient der Fehlersuche. Wenn sie jedoch Ihre Logs überladen, können Sie sie über die Website-Einstellung activity pub verbose logging umschalten. Standardmäßig ist sie deaktiviert.

Wir werden uns gegebenenfalls in Phase zwei um Verbesserungen bei der Fehlerbehandlung kümmern, aber bisher scheinen die von Ihnen geposteten Snippets erwartungsgemäß zu sein, d.h. die Akteure sind tatsächlich nicht mehr im Fediverse vorhanden.

Derzeit verfolgt das Plugin Lieferfehler auf die gleiche Weise wie Mastodon: Wenn es 7 Tage lang zu Fehlern an einem Endpunkt kommt, wird dieser als “nicht verfügbar” markiert und es werden keine weiteren Anfragen mehr versucht.

3 „Gefällt mir“

Ja, wie in der Zeile davor angegeben.

In der Tat, aber der Statuscode ist 410, was bedeutet, dass das Konto möglicherweise verschoben wurde (wenn es einen Tombstone gibt – wird diese Bedingung geprüft?)

1 „Gefällt mir“

Nein. Es ist der Fehler 410 Gone und bedeutet, dass die Ressource gelöscht wurde. Was übersehe ich jetzt?

1 „Gefällt mir“

Du hast das hier übersehen:

Hallo @angus,

ich habe gerade ein brandneues selbstgehostetes Discourse mit Ihrem AP-Plugin unter https://federation.cafe eingerichtet und sehe einige 403-Fehler in den Discourse-Fehlerprotokollen (und die Beiträge werden nicht geteilt).

Ich frage mich, ob es vielleicht daran liegt, dass Bindestriche vorhanden sind?

[Discourse Activity Pub] GET request to https://bofh.social/internal/fetch failed: Expected([200, 201, 202, 301, 302, 307, 308]) <=> Actual(403 Forbidden)

/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:50:in `perform'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/request.rb:34:in `get_json_ld'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/request.rb:106:in `get_json_ld'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/json_ld.rb:52:in `request_object'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/json_ld.rb:48:in `resolve_object'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/ap/actor.rb:103:in `resolve_and_store'
/var/www/discourse/plugins/discourse-activity-pub/app/controllers/concerns/discourse_activity_pub/signature_verification.rb:192:in `actor_from_key_id'
/var/www/discourse/plugins/discourse-activity-pub/app/controllers/concerns/discourse_activity_pub/signature_verification.rb:57:in `signed_request_actor'
/var/www/discourse/plugins/discourse-activity-pub/app/controllers/concerns/discourse_activity_pub/signature_verification.rb:27:in `ensure_verified_signature'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:400:in `block in make_lambda'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:180:in `block (2 levels) in halting_and_conditional'
actionpack-7.0.4.3/lib/abstract_controller/callbacks.rb:34:in `block (2 levels) in <module:Callbacks>'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:181:in `block in halting_and_conditional'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:595:in `block in invoke_before'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:595:in `each'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:595:in `invoke_before'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:116:in `block in run_callbacks'
/var/www/discourse/app/controllers/application_controller.rb:418: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:418:in `with_resolved_locale'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:127:in `block in run_callbacks'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:138:in `run_callbacks'
actionpack-7.0.4.3/lib/abstract_controller/callbacks.rb:233:in `process_action'
actionpack-7.0.4.3/lib/action_controller/metal/rescue.rb:22:in `process_action'
actionpack-7.0.4.3/lib/action_controller/metal/instrumentation.rb:67:in `block in process_action'
activesupport-7.0.4.3/lib/active_support/notifications.rb:206:in `block in instrument'
activesupport-7.0.4.3/lib/active_support/notifications/instrumenter.rb:24:in `instrument'
activesupport-7.0.4.3/lib/active_support/notifications.rb:206:in `instrument'
actionpack-7.0.4.3/lib/action_controller/metal/instrumentation.rb:66:in `process_action'
actionpack-7.0.4.3/lib/action_controller/metal/params_wrapper.rb:259:in `process_action'
activerecord-7.0.4.3/lib/active_record/railties/controller_runtime.rb:27:in `process_action'
actionpack-7.0.4.3/lib/abstract_controller/base.rb:151:in `process'
actionview-7.0.4.3/lib/action_view/rendering.rb:39:in `process'
rack-mini-profiler-3.1.0/lib/mini_profiler/profiling_methods.rb:85:in `block in profile_method'
actionpack-7.0.4.3/lib/action_controller/metal.rb:188:in `dispatch'
actionpack-7.0.4.3/lib/action_controller/metal.rb:251:in `dispatch'
actionpack-7.0.4.3/lib/action_dispatch/routing/route_set.rb:49:in `dispatch'
actionpack-7.0.4.3/lib/action_dispatch/routing/route_set.rb:32:in `serve'
actionpack-7.0.4.3/lib/action_dispatch/journey/router.rb:50:in `block in serve'
actionpack-7.0.4.3/lib/action_dispatch/journey/router.rb:32:in `each'
actionpack-7.0.4.3/lib/action_dispatch/journey/router.rb:32:in `serve'
actionpack-7.0.4.3/lib/action_dispatch/routing/route_set.rb:852:in `call'
railties-7.0.4.3/lib/rails/engine.rb:530:in `call'
railties-7.0.4.3/lib/rails/railtie.rb:226:in `public_send'
railties-7.0.4.3/lib/rails/railtie.rb:226:in `method_missing'
actionpack-7.0.4.3/lib/action_dispatch/routing/mapper.rb:19:in `block in <class:Constraints>'
actionpack-7.0.4.3/lib/action_dispatch/routing/mapper.rb:48:in `serve'
actionpack-7.0.4.3/lib/action_dispatch/journey/router.rb:50:in `block in serve'
actionpack-7.0.4.3/lib/action_dispatch/journey/router.rb:32:in `each'
actionpack-7.0.4.3/lib/action_dispatch/journey/router.rb:32:in `serve'
actionpack-7.0.4.3/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.7/lib/rack/tempfile_reaper.rb:15:in `call'
rack-2.2.7/lib/rack/conditional_get.rb:27:in `call'
rack-2.2.7/lib/rack/head.rb:12:in `call'
actionpack-7.0.4.3/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:367:in `call'
rack-2.2.7/lib/rack/session/abstract/id.rb:266:in `context'
rack-2.2.7/lib/rack/session/abstract/id.rb:260:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/cookies.rb:704:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:99:in `run_callbacks'
actionpack-7.0.4.3/lib/action_dispatch/middleware/callbacks.rb:26:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/debug_exceptions.rb:28:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/show_exceptions.rb:26:in `call'
logster-2.12.2/lib/logster/middleware/reporter.rb:43:in `call'
railties-7.0.4.3/lib/rails/rack/logger.rb:40:in `call_app'
railties-7.0.4.3/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.4.3/lib/action_dispatch/middleware/remote_ip.rb:93:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/request_id.rb:26:in `call'
/var/www/discourse/lib/middleware/enforce_hostname.rb:24:in `call'
rack-2.2.7/lib/rack/method_override.rb:24:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/executor.rb:14:in `call'
rack-2.2.7/lib/rack/sendfile.rb:110:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/host_authorization.rb:131:in `call'
rack-mini-profiler-3.1.0/lib/mini_profiler.rb:260:in `call'
message_bus-4.3.2/lib/message_bus/rack/middleware.rb:60:in `call'
/var/www/discourse/lib/middleware/request_tracker.rb:228:in `call'
railties-7.0.4.3/lib/rails/engine.rb:530:in `call'
railties-7.0.4.3/lib/rails/railtie.rb:226:in `public_send'
railties-7.0.4.3/lib/rails/railtie.rb:226:in `method_missing'
rack-2.2.7/lib/rack/urlmap.rb:74:in `block in call'
rack-2.2.7/lib/rack/urlmap.rb:58:in `each'
rack-2.2.7/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>'

hostname	LILEJAP07-app
process_id	658
application_version	1abfe2e61d12b1b559aab0132ec3fb7cc8b87232
HTTP_HOST	federation.cafe
REQUEST_URI	/ap/actor/5ce52c043e670476a1426f9a66472c07
REQUEST_METHOD	GET
HTTP_USER_AGENT	Akkoma 3.8.0-0-gccae7ef; https://bofh.social <admin@bofh.social>
HTTP_ACCEPT	application/activity+json
HTTP_X_FORWARDED_FOR	91.107.215.39, 172.71.250.70
HTTP_X_REAL_IP	172.71.250.70
time	2:16 pm

Gedanken?

Ich wäre auch an vollständigen Beiträgen interessiert. In diesem Fall sollte der Typ „Artikel“ anstelle von „Notiz“ verwendet werden.

Tatsächlich sind Ankündigungen für mich weitaus weniger interessant als föderierte Forumfunktionen.

Gibt es eine Roadmap und/oder einen Ort, an dem Spenden für solche Funktionen gesendet werden können?

Hallo @gme, danke, dass du das Plugin ausprobiert hast

Ein paar Dinge, die hier zunächst zu beachten sind:

  1. Das MVP-Plugin wird gegen Mastodon getestet. Ich sehe, dass du dort Pleroma verwendest. Ich weiß, dass Pleroma ActivityPub-konform ist und mit Mastodon funktioniert. Wir haben uns jedoch noch nicht genau angesehen, welche Anpassungen (falls überhaupt) erforderlich sind, um die Unterstützung dafür zu gewährleisten. Aber ich bin trotzdem daran interessiert zu sehen, was hier vor sich geht.

  2. Es sieht so aus, als ob die Anfragen aufgrund eines Authentifizierungsfehlers auf deinem Pleroma-Server fehlgeschlagen sind (das bedeutet ein 403-Fehler). Da ich diesen Endpunkt mit einer nicht authentifizierten cURL-Anfrage abrufen kann, vermute ich, dass die HTTP-Authentifizierung am Pleroma-Ende fehlschlägt.

Um Letzteres (d. h. 2) zu testen, könntest du dir deine Pleroma-Protokolle ansehen (du bist anscheinend auch der Administrator dieses Servers?), um zu sehen, ob du dort weitere Details dazu finden kannst?

Danke für das Feedback, @bmann. Könntest du den Anwendungsfall, den du hier im Sinn hast, näher erläutern? Wenn möglich mit einem Beispiel.

Dieses Thema ist der beste Ort, um über Entwicklungen auf dem Laufenden zu bleiben. Sobald wir einen Plan für Phase 2 festgelegt haben, werde ich ihn hier teilen. In der Zwischenzeit ist der beste Weg zu helfen, spezifische Anwendungsfälle zu teilen, die du mit dem Plugin verwendest oder verwenden möchtest.

5 „Gefällt mir“

Der Anwendungsfall ist die Verwendung von Discourse als vollständigeren AP-Knoten. Es gibt viele einfachere Möglichkeiten, Inhalte an AP zu posten (z. B. Kategorie-RSS-Feeds und Zapier oder Buffer) – aber die Entwicklung umfassenderer AP-Funktionen kann nur als Plugin/Integration erfolgen.

Article ist der ActivityStream-Typ, der für vollständige Artikel gedacht ist. Je nach Client-Oberfläche wird eine Vorschau angezeigt und dann ein Klick, um den gesamten Artikel inline anzuzeigen (ähnlich wie Inhaltswarnungen, aber mit “Weiterlesen”).

Note ist der Microblogging-Typ.

Durch vollständige Artikelbeiträge können Personen direkt in ihren AP-Clients lesen / boosten / antworten.

Und natürlich wäre es interessant, etwas über Ihre Roadmap zu erfahren, wenn Sie einen Microblogging-AP-Instanz-Ansatz verfolgen oder in Richtung eines föderierten Forums wie Lemmy oder Kbin gehen, insbesondere angesichts der jüngsten Reddit-Nachrichten.

1 „Gefällt mir“

@angus, @pmusaraj habt ihr den offenen Aufruf für Fördermittel von NGI Sargasso gesehen? Das ist eine ziemlich kurze Ankündigung, aber es könnte nützlich sein, um die Entwicklung dieses Plugins weiter voranzutreiben (es sei denn, ihr habt bereits andere Pläne).

1 „Gefällt mir“

Hallo Leute, ich freue mich, sagen zu können, dass die zweite Phase der Arbeiten an diesem Plugin genehmigt wurde. Daran haben wir bereits mit der Arbeit begonnen, mit dem Ziel, es in etwa 3,5 Monaten zu veröffentlichen.

Unterstützung der Bearbeitung von Notizen nach der Veröffentlichung

Unterstützung der Wiederherstellung von Notizen

Unterstützung der Veröffentlichung von Beiträgen sowohl öffentlich als auch nur für Follower

  • Einstellung auf Kategorieebene
  • Siehe weitere Audience Targeting und die Dokumentation von Mastodon zu to/cc
  • Umstellung auf öffentliche Beiträge als Standard

Verbesserung der Inhaltsanalyse von Notizen

  • Sonderzeichen behandeln (vielleicht einen anderen Parser verwenden). Mehr dazu.

Unterstützung der Verwendung von Article anstelle von Note als Objekt für einen Beitrag.

  • Einstellung auf Kategorieebene

Unterstützung der Annahme von Aktivitäten als Antwort auf eine Notiz, die auf entfernten Servern erstellt wurde, und der Veröffentlichung von Aktivitäten als Antwort auf eine Notiz, die in Discourse erstellt wurde.

  • Veröffentlichung von Aktivitäten bezüglich Antworten, die in Discourse erstellt wurden
    • Zulassen, dass Discourse-Benutzer als Akteure fungieren
    • Erstellen von Notizobjekten für Discourse-Antworten (Beiträge)
    • Veröffentlichen zugehöriger Create/Delete/Update/Undo-Aktivitäten für ihre entsprechenden Discourse-Aktionen
  • Annahme von Aktivitäten bezüglich Antworten, die auf entfernten Servern erstellt wurden
    • Staging der Akteure von Aktivitäten von entfernten Servern als Discourse-Benutzer
    • Erstellen von Discourse-Antworten (Beiträgen) aus Notizobjekten
    • Konvertieren zugehöriger Create/Delete/Update/Undo-Aktivitäten in ihre entsprechenden Discourse-Aktionen
  • Hinzufügen einer Kategorieeinstellung zum Umschalten zwischen nur dem ersten Beitrag (aktuell) und “Vollständiges Thema”, das Antwortaktivitäten unterstützt.

Unterstützung der Like Activity

Unterstützung für Discourse-Benutzer, ihre Identität auf Mastodon zu verifizieren, damit von ihren Toots erstellte Discourse-Beiträge mit ihrem Discourse-Benutzerkonto verknüpft werden.

  • Ermöglichen Sie einem Benutzer, den Mastodon OAuth Authorization Flow mit dem Mastodon-Server durchzuführen, auf dem sein Konto gespeichert ist. Dies wird über die Discourse-Kontoeinstellungen des Benutzers initiiert.
  • Verwenden Sie das Mastodon-Zugriffstoken des Discourse-Benutzers, um die AP-ID seines Mastodon-Kontos abzurufen und zu speichern und es mit seinem Discourse-Konto zu speichern.
  • Verknüpfen Sie alle Discourse-Aktivitäten, die mit AP-Aktivitäten von einem Akteur mit der AP-ID eines Discourse-Benutzers verbunden sind, mit diesem Discourse-Benutzer, unabhängig davon, ob sie vor oder nach der Identitätsprüfung des Benutzers durchgeführt wurden.
15 „Gefällt mir“

Das ist wirklich aufregend zu sehen – ein wirklich hohes Maß an Föderation und Interaktivität. :tada:

Planen Sie, Zwischenversionen zu veröffentlichen, oder wird dies eine große Veröffentlichung in etwa 3,5 Monaten sein?

Es kann einige Zwischenversionen geben, aber ich kann diesbezüglich noch nichts versprechen. Ich werde Sie auf dem Laufenden halten, während wir Fortschritte machen.

2 „Gefällt mir“

Ich stimme zu 110 % zu – das beinhaltet viele großartige Aspekte. :tada:

Gibt es eine Chance, dass es in dieser Hinsicht zumindest eine Zwischenveröffentlichung geben kann?

Ehrlich gesagt, wäre eine Zwischenveröffentlichung mit „öffentlichen Beiträgen als Standard“ sofort willkommen.

2 „Gefällt mir“

Beachten Sie, dass die öffentliche Veröffentlichung von der Föderation von Bearbeitungsaktionen abhängt (der erste aufgeführte Punkt), glaube ich.

1 „Gefällt mir“

Ich kann zu diesem Zeitpunkt keine Versprechungen machen, aber es könnte durchaus Zwischen-Updates für die Föderation und die Zielgruppenansprache (öffentliche Veröffentlichung) geben.

4 „Gefällt mir“

:eyes:

1 „Gefällt mir“

Das ist eine bekannte Einschränkung. Bis die Föderation von Bearbeitungen unterstützt wird, blockiert das Plugin Bearbeitungen an föderierten Inhalten, und es gibt keine Konfiguration, um dies zu deaktivieren.

2 „Gefällt mir“

Um es klar zu sagen, ich habe versucht, einen Beitrag hier auf Meta zu bearbeiten und diese Fehlermeldung erhalten.

3 „Gefällt mir“

Es tut mir leid, dass ich das missverstanden habe. @feature@meta.discourse.org und @announcements@meta.discourse.org werden zumindest von hier aus föderiert, und diese Wahl ist der Hauptgrund, warum ich dies für Maker Forums nicht aktiviert habe …

2 „Gefällt mir“

Ja, das ist der erste Punkt in Phase 2, an dem ich gearbeitet habe. Tatsächlich gibt es dafür bereits einen PR, sodass Sie diesbezüglich bald Erleichterung erfahren werden.

2 „Gefällt mir“