ActivityPub 액터 구현

Status: Experiment
  • 도입됨 GitLab 16.5에서 activity_pubactivity_pub_project라는 두 개의 플래그와 함께 제공됩니다. 기본적으로 비활성화되어 있습니다. 이 기능은 실험입니다.

자체 관리되는 GitLab에서는 기본적으로 이 기능이 제공되지 않습니다. 사용 가능하도록 만들기 위해
관리자는 activity_pubactivity_pub_project라는 기능 플래그
활성화할 수 있습니다.
GitLab.com 및 GitLab 전용에서는 이 기능을 사용할 수 없습니다.
이 기능은 프로덕션 사용에 적합하지 않습니다.

이 기능은 두 개의 기능 플래그를 요구합니다:

  • activity_pub: 모든 ActivityPub 관련 기능을 활성화 또는 비활성화합니다.
  • activity_pub_project: 프로젝트에 특정한 ActivityPub 기능을 활성화 및 비활성화합니다.
    activity_pub 플래그도 활성화되어야 합니다.

ActivityPub는 세 가지 표준 문서를 기반으로 합니다:

  • ActivityPub는 연합을 구현하는 데 발생하는 HTTP 요청을 정의합니다.
  • ActivityStreams는 프로토콜 사용자 간에 교환되는 JSON 메시지의 형식을 정의합니다.
  • Activity Vocabulary는 기본적으로 인식되는 다양한 메시지를 정의합니다.

첫 번째는 일반적으로 컨트롤러에서 처리되고, 나머지 두 개는
직렬 변환기에 관련되어 있습니다.

ActivityPub 액터를 구현하기 위해서는 다음을 수행해야 합니다:

  • 리소스의 프로필 페이지를 구현합니다.
  • 아울박스 페이지를 구현합니다.
  • 수신 요청을 인박스에서 처리합니다.

모든 요청은 다음을 사용하여 이루어집니다.
application/ld+json; profile="https://www.w3.org/ns/activitystreams"Accept HTTP 헤더로 합니다.

우리가 소셜 기능을 위해 구현한 액터:

계획된 액터에 대한 자세한 정보는 에픽 11247를 참조하세요.

프로필 페이지

프로필 페이지를 쿼리하는 것은 다음을 검색하는 데 사용됩니다:

  • 이름 및 설명과 같은 일반 정보.
  • 인박스 및 아울박스의 URL.

프로필 페이지를 구현하기 위해 app/serializers/activity_pub/에 ActivityStreams
직렬 변환기를 생성하고, ActivityStreamsSerializer에서 상속받도록 합니다.
아래 직렬 변환기 섹션에서 필수 필드에 대해 참조하세요.

컨트롤러에서 직렬 변환기를 호출하려면:

opts = {
  inbox: nil,
  outbox: outbox_project_releases_url(project)
}

render json: ActivityPub::ReleasesActorSerializer.new.represent(project, opts)
  • outbox는 이 액터에 대한 활동 피드를 찾을 수 있는 엔드포인트입니다.
  • inbox는 피드를 구독하기 위해 POST할 곳입니다. 아직 구현되지 않았으므로 nil을 전달합니다.

아울박스 페이지

아울박스는 리소스에 대한 활동 목록입니다. 이는 리소스에 대한 피드이며,
ActivityPub 클라이언트가 아직 구독하지 않은 이 액터에 대한 공개 활동을 표시할 수 있게 합니다.

아울박스 페이지를 구현하기 위해 app/serializers/activity_pub/에 ActivityStreams
직렬 변환기를 생성하고, ActivityStreamsSerializer에서 상속받도록 합니다.
아래 직렬 변환기 섹션에서 필수 필드에 대해 참조하세요.

컨트롤러에서 직렬 변환기를 다음과 같이 호출합니다:

serializer = ActivityPub::ReleasesOutboxSerializer.new.with_pagination(request, response)
render json: serializer.represent(releases)

이것은 응답을 OrderedCollection ActivityPub 유형으로 변환하며, 모든 올바른 필드를 포함합니다.

수신함

아직 구현되지 않았습니다.

수신함은 ActivityPub 호환 타사에서 actor를 구독하거나 메시지를 보내기 위한 요청을 하는 곳입니다.

ActivityStreams 직렬 변환기

직렬 변환기는 ActivityPub 지원의 핵심 중 절반을 구현합니다: 이들은 모두 ActivityStreams와 관련이 있으며, ActivityPub에서 사용하는 메시지 형식입니다.

서식 지정의 대부분을 처리하는 기능을 활용하려면, 직렬 변환기는 ActivityPub::ActivityStreamsSerializer에서 상속받아야 합니다.

사용하려면 #represent 메서드를 호출하세요. 액터 프로필 페이지인 경우 inboxoutbox 옵션을 제공해야 합니다(위에서 언급한 대로). 사용자가 연락처 정보를 나타내는 객체와 같이 액터의 일부로 포함될 객체를 표현하는 경우에는 필요하지 않습니다.

직렬화된 각 리소스(액터에 포함된 다른 객체 포함)는 idtype 필드를 제공해야 합니다.

id는 URL입니다. 리소스에 대한 고유 식별자로 사용되며, 기존 페이지(이상적으로는 액터)를 가리켜야 합니다. 그렇지 않으면 가장 가까운 액터를 참조하고 앵커를 사용할 수 있습니다. 예:

https://gitlab.com/user/project/-/releases#release-1

type은 ActivityStreams 핵심 어휘에서 가져와야 합니다:

사용할 수 있는 속성은 모두 ActivityStreams 어휘 문서에 문서화되어 있습니다. 리소스에 대해 선택한 유형에 따라, 사용 가능한 모든 속성을 알려주는 properties 목록을 찾으세요 (직접 또는 상속된).

Mastodon이 preferredName이라는 속성을 추가한 것은 주목할 만합니다. Mastodon은 모든 액터에 대해 설정되기를 기대하며, 그렇지 않으면 해당 액터를 인식하지 못합니다.