LoginSignup
2
2

Bluesky PDSでアカウントデータをセルフホストする

Last updated at Posted at 2024-03-20

まとめ

・BlueskyがPDSパッケージを公開。これを使って独自のサーバーでアカウントを管理できます。
・今回僕も試しにサーバーを立ててみたので備忘録として記録に残します。

概要

昨月2月末ごろにBlueskyがGithubにてPDS(パーソナルデータサーバー)パッケージを公開しました。

PDSパッケージを使用すれば、各人が独自のサーバーでBlueSkyのアカウントを管理し、他のサーバーと連携して通信を確立することができます。

現在のBlueskyの通信形態

BlueskyはATプロトコルという通信方式を採用しています。

ATプロトコルの主要な構成として、主に今回公開されたパーソナルデータサーバー(PDS)に加え、リレー、アプリビュー、カスタムフィードといった構成になっています。

PDS

パーソナルデータサーバー(PDS)が担う役割はユーザーの情報管理等です。

PDSサーバー内にアカウントのログイン情報や個人設定、署名キー、アカウント識別キー等を補完し、通信する役割を持っています。

PDSサーバー上であらゆるリクエストに対して通信を処理し、自分や他人の投稿を閲覧することができるようになります。

Relay

リレーは各PDSで発信された情報が世界中に閲覧出来るようにクローリングを行ったり、相互に情報を連携したりする役割を持ちます。

リレーサーバー上では出来るだけ多くの情報を収集し、巨大なストリームに公開する役割を持っているため、PDSよりもより頑強なスペックのサーバーで管理されることとなります。

アプリビュー

アプリビューではPDSやリレーから取得してきた情報をタイムラインやトレンドとして組立てる役割を持っています。

したがってタイムラインの構築やフォロー、フォロワー数の勘定はアプリビューの段階で行われています。

厳密にはフィード(カスタムフィード)とラベラーという細かな構成がありますが、大まかに括るとアプリビューの中に収斂されていくのではないかと捉えております。

Blueskyは個人データや様々なユーザーの趣味や興味関心を元に、ユーザーが興味関心を示すであろうトレンドニュースや、共通の趣味や話題を持ったユーザーを見つけやすくするために、独自の複雑なアルゴリズムを使って投稿表示内容を最適化しています。

PDSやリレーまでから収集される情報はあくまで生の通信データですが、アプリビューを通すことによってよりユーザーに最適化された投稿を表示する事ができるようになります。

以上を踏まえるとざっくりこんな感じの構成になります。

11.png

今回は図の最下部にある、PDSを自分で管理してみようぜという趣旨になります。

アクティビティパブとの違い

アクティビティパブとの違いは深く考えると様々な点が考えられますが、決定的な違いは連合(federation)の在り方とタイムラインの取得方法にあると思います。

Blueskyの場合、リレーサーバーで集約することによって通信を確立しますが、アクティビティパブ系の場合はサーバー自体が各自連合する形でお互いの通信を確立しております。

33.png

また、タイムラインに関してもBlueskyはアプリビューの段階で生成し、クライアントに送信しているのに対して、アクティビティパブ系のサーバーは各サーバーごとにタイムラインを構築しています。

これによって生じる違いは、アカウントがおかれた場所のサーバー管理者による裁量がどこまでユーザーに響くかという部分に強く影響を及ぼします。

Blueskyの場合はもでレーションはアプリビューの段階で行われるため、PDS上で保管されているのはユーザーの情報等に限定されます。一方でアクティビティパブ系のサーバーはモデレーションがサーバー各自で行われるため、管理者のモデレーション行為がユーザー体験に強く影響し、サーバーごとのキャラクターもそれに応じて変化します。

独自ドメイン登録との違い

現段階ではあんまり無いです。先述の通りATプロトコルではアプリビューがタイムラインを構成しているため、どこのサーバーに自分のアカウントがあるかという事はユーザー体験を大きく左右することはありません。現段階ではPDSは「とりあえずセルフホストしてみたい」という願いをかなえるツールです。

BlueskyはPDSを建てなくても「カスタムドメイン」という形で独自ドメインでユーザーアカウントを発行することが可能です。

これは主に企業やインフルエンサーが自信を証明するために自社のドメインを使って運営したり、自分のドメインを使ってオリジナリティを出すといった部分で活躍する機能です。

では、PDSパッケージはどのような役割を持つのかを検討します。

Blueskyが今後展開する方針として、アプリビューやリレーにバラエティを持たせるといった要素が考えられます。

アプリビューとPDSが分離されていることによって、どちらかが何らかの政治的、宗教的、社会的な制約を受けて閲覧できない状況が発生したとしても、他のアプリビューから参照することで投稿を取得することができるため、リスクヘッジに加えアカウントがある場所に依存しない選択肢の拡張が期待できます。

22.png

PDSを構築してみる

現段階では、「とりあえずセルフホストってどない?」ぐらいの感覚なのだなという部分を把握したので、とりあえず建ててみましょう。

※CloudflareTunnnelを使用する場合はサブドメインにワイルドカードを使えない問題がある点からアカウント個別で認証を通す必要があるため注意が必要です。

※ややトリッキーな構成にはなりますが、サブドメインなしで構築された方とサブドメインありで構築された方が両方いらっしゃり、非常に分かりやすく詳細なご説明をされているので、自宅サーバーで構築される方は以下の記事をもとにご検討ください
サブドメインなしの場合 -MszProさん著
サブドメインありの場合 -Matsuuraさん著

必要となるサーバーのスペックはラズパイよりも小さな構成で問題ないようで、公式からの抜粋にはなりますが、このような構成で十分動きます。

Name Spec
Operating System Ubuntu 22.04
Memory (RAM) 1 GB
CPU Cores 1
Storage 20 GB SSD
Architectures amd64, arm64
Number of users 1-20

一つのPDSサーバーで最大20人参加することができます。

DNSの設定

Name Type Value TTL
example.com A 12.34.56.78 600
*.example.com A 12.34.56.78 600

ドメインを管理しているコントロールパネルのDNS設定やCloudflareのDNS設定の項目で、サーバーのIPとドメインを紐づけます。

PDSのインストールスクリプトの中にはCaddyが含まれており、そちらでSSL化させるため、Cloudflareにネームサーバーを移行している場合は、プロキシやSSLの項目をオフにしておかないと通信が確立できない点にご注意ください。

本体の導入

公式サーバーからインストーラーをコピーし、

wget https://raw.githubusercontent.com/bluesky-social/pds/main/installer.sh

インストールスクリプトを起動し、管理者アドレスと使用するホスト名を入力すれば自動でDockerが構成されます。

sudo bash installer.sh

SystemdによるDaemon化まで自動で行ってもらえるので、

sudo systemctl start pds
sudo systemctl restart pds
sudo systemctl stop pds
sudo systemctl status pds

これらの操作が可能になります。

その他、詳細なコマンドに関してはこのページの頭に貼りましたリポジトリのReadmeファイルに詳説されています。是非ご活用ください。

追加設定

インストールスクリプトでほぼ全ての工程が自動化されていますが、PDSサーバーとして完璧に動作させるためにメールサーバーの設定を行う必要があります。

これはBlueskyのユーザーの認証にメールによる認証を使用するためです。
メールを追加するためにはpdsサーバーの環境設定のファイルに情報を追記していきます。

sudo nano /pds/pds.env

ユーザー名、パスワード、ホストを適宜書き換えて入力してください。

# Mail Settings
_SMTP_USERNAME=smtp_user
_SMTP_PASSWORD=smtp_password
_SMTP_HOST=smtp.example.com
PDS_EMAIL_SMTP_URL=smtps://${_SMTP_USERNAME}:${_SMTP_PASSWORD}@${_SMTP_HOST}

リレーに参加する申請を行う

PDSを立て名前解決を行った段階でも、まだ接続が確立されておらず、アカウントが利用できないといったケースになる可能性がございます。

そのため、独自サーバーで通信を開始するためにBlueskyPDSの公式Discordサーバーにて、リレーに参加する必要がございます。

こちらのPDS公式Discordサーバーの#Supportにてリレー参加のチケットを発行すると、管理人や開発者の方に手動で権限を付与して頂けます。

https://discord.gg/UWS6FFdhMe

もしURLが失効している場合、公式リポジトリにも記載がございますのでそちらをご利用いただけると幸いです。

⚠️Invalid Account となり通信できない場合の対策

無事PDSサーバーが建ったのに⚠️Invalid Accountと表示されて投稿すらできません!といった場合は連合に参加してください。

PDSサーバーが起動しており、ドメインを直で叩いたらしっかりメッセージが出ている場合、Blueskyとの連合が上手くいっていないといったケースが考えられます。

サーバー側の問題か否かを確認する手段としてデバッグツールを使用するのも有効ですが、より確実な方法として、直接ユーザーを確認する手法がございます。

https://example.tld/xrpc/com.atproto.sync.listRepos

のように直接アカウントを参照してみて、そこで表示されるDIDを確認し、

https://plc.directory/<DIDをここに入力>

こちらのアドレスでアクセスした際にユーザー情報が表示される場合、アカウント作成がうまくいっておりますので、Discordにてリレーに参加するとよいでしょう。

やったぜ。

いろいろトラブって紆余曲折を経た形となりますが、無事僕もBlueskyPDSを建てることができました。

公式と同様のスペックでサーバーを構成しましたがとても快調に動作しています。
PDSサーバーの管理人のJazさん並びに皆様には大変お世話になりました。

313.png

ありがとうございました。

参考記事

https://github.com/bluesky-social/pds/blob/main/README.md
公式リポジトリページです。

https://docs.bsky.app/docs/advanced-guides/federation-architecture
通信方式の仕組みを理解できる公式ドキュメントです。

https://gist.github.com/yamarten/3a3e6a6aada3d9030e53019dad8a830c
yamartenさんによるATプロトコル解説ページです。
公式ドキュメントを理解するために参考にしました。

https://zenn.dev/anon/articles/ed1448e8ed5257
anonさんによるとても詳細な解説がなされている記事です。

https://garden.matsuuratomoya.com/Bluesky
Matsuuraさんによる構築紹介ページです。
Cloudflareでも建ててみたのでその際に参考にしました。

https://mszpro.com/blog/bluesky-self-hosted/
MszProさんによる構築紹介ページです。
サブドメインなしでのCFでの取り扱いの理解で参考にしました。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2