🤝

PDSを建ててBlueskyの連合に参加する (0.4.0-beta)

2024/02/26に公開

2024年2月23日頃より、BlueskyのPDS (Personal Data Server)を誰でも自分で作成し、Blueskyのネットワークに繋がる(いわゆるFederation、連合)事ができるようになりました。

本記事はこれまで整理されたドキュメントおよび、先人たちがドキュメントや仕様を読み解いて勉強会やブログ記事で共有していただいた知識を基に、著者が記載しています。多くの先人たちの情報と、公開されている各種ドキュメント感謝します。

が、もし誤った記載をしている場所がありましたらご指摘ください。

PDSとは

Personal Data Server の略で、アカウントに紐付くデータが読み書き、主に保存される場所です。

MastodonやMisskeyなどで言うところのインスタンスがこれに近いです。が、Blueskyが採用しているAT Protocolではそのインスタンスとも役割がやや異なっています。

大まかに説明すると、このPDSから投稿データやアカウントプロフィールがリレーサーバーが収集し、AppViewと呼ばれるサーバーで集約、タイムラインやフィードが作られます。

連合(Federation)とは

複数あるPDSという別々のサーバーにある投稿やリアクションを集約し、ほかのPDSの投稿やリアクションを受信したり、相互に会話やフォローなど、コミュニケーションができる仕組みを指します。

BlueskyではAT Protocolという仕様、概念を用いて接続します。公式ドキュメントから引用している以下の図では下の方にあるのがPDSです。

federation-architecture-diagram-5e4cb957a16f8d5d90325b53133ed0bf.png
(出典: Federation Architecture | Bluesky)

詳しい説明は出典のリンク先(英語)をご覧下さい。

これまではPDSはBluesky Socialが提供している .bsky.social というPDSのみがありました。(実際には内部で分割されています)

今回は .bsky.social 以外のPDSを、個人や組織が自分たちで準備し、これをBlueskyのネットワークに接続してほかのPDS間と相互にコミュニケーションできるようになりました。

さらに詳しいアーキテクチャの全体像の解説は、山貂さんのスライドや考察も参考にしてみてください。解像度が上がると思います。

PDSでできること

PDS自体は投稿やリアクション、フォロー関係などのアカウント情報保管場所でしかなく、タイムラインやフィード上の投稿を制御したりすることはできません。(アカウントや投稿の削除はできます)

代わりに .bsky.social と同じように、PDS固有のドメインを割り当て、ユーザーはそのサブドメインをハンドルとして利用する事ができます。

例えば、ある報道機関A社があります。
A社は media.example というドメインを持ち、普段は https://www3.media.example というURLでニュース記事を配信していたと仮定します。
media.example はA社が所有、運用するドメインなのでA社以外は通常使用できません。

A社が .media.example というPDSを設置します。
A社は .media.example で終わるハンドルを使用し、アカウントを運用、投稿することで、このA社自身あるいはA社に所属する者が発信した情報であることが保証されます。

A社はニュースのカテゴリ毎にアカウントを作成し記事を投稿したとします。

  • 総合ニュース news.media.example
  • 速報 breaking.media.example
  • 政治 economy.media.example
  • 経済 biz.media.example
  • 文化 culture.media.example
  • スポーツ sports.media.example

これらはすべて同じドメインで運用されており、どのアカウントもA社のものである事が一目で分かります。
記者やアナウンサーなど組織に所属する個人が情報発信を行う際も、A社ドメインのアカウントから行う事で、身元がはっきりし、第三者によるフェイク情報の拡散を防ぐことができます。 メールアドレスと同じですね。

また仮に、そのアカウントを閉鎖した場合も、あとで第三者が同じハンドルを取得してなりすまし、ほかの利用者を欺くといったアカウントスワッピングも防ぐことができます。

ただしここまでは既存の .bsky.social 上にカスタムハンドルでアカウントを運用したときと同じです。

となると、PDSで運用するメリットは現在はあまり感じられませんが、今後、上記図のRelaysやAppViewに相当する部分が複数運用されるようになった時、Bluesky以外の別のネットワークにも投稿を配信することができるようになっていきます。

この場合、Blueskyが運用するAppViewに変更が生じたり、特定の国や運営する組織の政治問題に影響されたとしても、別のAppViewを経由することでその影響を受けない、分散型SNSとしてのメリットが出てきます。

PDSを設置する

前置きが長くなりましたが、PDSを設置していきましょう。

まず、サーバーを準備します。公式ドキュメントによると、現在のところLinuxサーバーである必要があります。

以下のスペックを推奨環境としています。

項目 要件
OS Ubuntu 22.04
メモリ (RAM) 2GB以上
CPUコア 2コア以上
保存領域 40GB以上の空きを持つSSD
CPUアーキテクチャ amd64 または arm64

また、443/TCPポート(TLS通信可能である事)、80/TCPポート(ハンドル用サブドメインの解決時に、SSL証明書発行するために使用します)の解放が必要です。

事前にドメインを決めておく

PDSで使用するドメインを決めておきます。

Blueskyではカスタムハンドル用にドメインのアフィリエイトもしていますが、こちらで購入したドメインは現時点(2024年2月)では、カスタムハンドル以外での利用、設定が難しいため、ほかのドメインレジストラから購入し、DNSを設定できるようにしてください。

DNSの設定をする

ドメインを準備したらDNSを設定します。
ここでは pds.example というドメインを使用する想定とします。

PDSをインストール

サーバーにログインし、以下のインストーラーコマンドを実行します。

以下にあるように sudo を使用し、root権限で実行する必要があります。

curl -fsSL https://raw.githubusercontent.com/bluesky-social/pds/main/installer.sh >installer.sh
sudo bash ./installer.sh

実行すると、事前に設定が必要なDNSの設定方法が出てくるので、参考にしながら設定を行います。

Enter your public DNS address (e.g. example.com):
Enter an admin email address (e.g. you@example.com):

つづいてPDSで使用するドメインや管理者のメールアドレスを設定します。管理者のメールアドレスは、PDS自体やPDSのハンドル( yourname.pds.example のような部分)検証時にSSL証明書の自動発行で使用するためにのものです。

入力後、自動的に必要なソフトウェア(Docker、SQLiteなど)のインストールや初期設定を行います。動作に必要なポート(80および443)を解放するファイアウォールの設定などもここで行われます。

========================================================================
PDS installation successful!
------------------------------------------------------------------------

Check service status      : sudo systemctl status pds
Watch service logs        : sudo docker logs -f pds
Backup service data       : /pds
PDS Admin command         : pdsadmin

Required Firewall Ports
------------------------------------------------------------------------
Service                Direction  Port   Protocol  Source
-------                ---------  ----   --------  ----------------------
HTTP TLS verification  Inbound    80     TCP       Any
HTTP Control Panel     Inbound    443    TCP       Any

Required DNS entries
------------------------------------------------------------------------
Name                         Type       Value
-------                      ---------  ---------------
example.com              A          Server's IP
*.example.com            A          Server's IP

Detected public IP of this server: Server's IP

To see pdsadmin commands, run "pdsadmin help"

========================================================================

インストールが完了すると、上記の様なメッセージが表示されます。実際はもっと設置環境や設定に即した結果が表示されます。
稼働時に必要な設定や管理者コマンド、ログの確認方法などが書かれているので確認しておきます。

ここまで完了すると、最初のアカウント作成をするかどうか確認されるので、必要に応じて作成してください。
アカウントはこのタイミングで作成せずとも、同時にインストールされる管理者向けコマンドを使用して任意のタイミングで作成する事ができます。

システムサービス

またシステムサービスとして /etc/systemd/system/pds.service というサービスが作成されます。
これによってサーバーの1つのサービスとしてPDSを起動、停止することができるようになります。

# 起動
sudo systemctl start pds

# 停止
sudo systemctl start pds

# ステータス確認
sudo systemctl status pds

上記のコマンドを使用せずとも、Dockerコンテナとして起動しているため、 docker compose でコンテナを再起動するだけでもOKです。

インストール先

/pds にディレクトリが作成されています。この中にPDSの設定アカウントのデータが配置されます。

設定ファイル

PDS実行時の設定は /pds/pds.env で行います。ここに実行時の環境変数としてパラメータを設定することで、適用させることができます。

PDS_HOSTNAME=pds.example
PDS_JWT_SECRET=0123456789abcdef0123456789abcdef
PDS_ADMIN_PASSWORD=abcdef0123456789abcdef0123456789
PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX=9a8b7c6d5e4f3219a8b7c6d5e4f3219a8b7c6d5e4f3219a8b7c6d5e4f3219a8b
PDS_DATA_DIRECTORY=/pds
PDS_BLOBSTORE_DISK_LOCATION=/pds/blocks
PDS_DID_PLC_URL=https://plc.directory
PDS_BSKY_APP_VIEW_URL=https://api.bsky.app
PDS_BSKY_APP_VIEW_DID=did:web:api.bsky.app
PDS_REPORT_SERVICE_URL=https://mod.bsky.app
PDS_REPORT_SERVICE_DID=did:plc:ar7c4by46qjdydhdevvrndac
PDS_CRAWLERS=https://bsky.network
LOG_ENABLED=true

デフォルトでは以上の様になっています。[1]
上位4行はPDS固有のもの、機密情報になるのでご注意ください。
それ以外はPDSがどのリレーやAppViewとやり取りするかが書かれています。これらは現在のところ変更の必要はありません。

変更適用するには pds.service またはコンテナの再起動が必要です。

メールサーバーの設定

設定しなくても動作しますが、アカウント登録時のメールアドレスの確認、またアカウント所有者がパスワードを変更する際には必要になります。

以下の設定を /pds/pds.env に追加することでメール通知が必要な機能を利用できるようになります。

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

メールプロバイダは任意のものを利用できます。 GmailSendGridMailgunMailJetMailtrapなどのサービスを利用すると便利です。

_SMTP_HOST_SMTP_USERNAME_SMTP_PASSWORD の値はそれぞれ利用するものに置き換えてください。
上記の書式でうまく動作しない場合は PDS_EMAIL_SMTP_URL に直接 smtps:// から始まるURI形式で指定してみてください。

またURI形式で記述しなければならないため、メールプロバイダからSMTP接続ユーザー名を smtpuser@example.com のようなIDで払い出された場合、smtpuser%40example.com のようにURLエンコードした値で記述する必要があります。

例: PDS_EMAIL_SMTP_URL=smtps://smtpuser%40example.com:smtp_password@smtp.example.com

pdsadmin

インストールが完了すると pdsadmin というPDS管理者向けコマンドが使用できるようになります。
このコマンドは /usr/local/bin にあります。

実行は root 権限を必要とするため、一般ユーザーで実行する際は sudo pdsadmin として実行します。

pdsadmin では以下の操作が行えます。

アカウント操作

アカウントの一覧

sudo pdsadmin account list

PDSにいるアカウント一覧が表示されます

アカウントの作成

sudo pdsadmin account create [email] [handle]

メールアドレスとハンドルを入力すると、PDSにアカウントを作成します。

アカウントの削除

sudo pdsadmin account delete [did:plc:abcdef123456]

アカウントを削除します。データの実体を削除するため、復元は不能になります。

アカウントの凍結

sudo pdsadmin account takedown [did:plc:abcdef123456]

指定したユーザーの利用を制限します。
投稿やプロフィールの更新が行えず、ほかのアカウントからも見えなくなります。

ログインしていた場合はログアウトされます。

アカウントの凍結解除

sudo pdsadmin account untakedown [did:plc:abcdef123456]

アカウント凍結を解除します。これまでの投稿内容も元に戻り、ほかのアカウントからも見る事ができるようになります。

パスワードリセット

sudo pdsadmin account reset-password [did:plc:abcdef123456]

特定アカウントのパスワードをリセットします。
実行するとすぐに新しいパスワードが発行されるため、それを使用してログインします。アカウントを切り替えていた場合、既存のセッションはすぐにログアウトします。

PDSのアップデート

sudo pdsadmin update

新しいバージョンがリリースされた場合、このコマンドを利用してPDSを最新にアップデートできます。

※このコマンドを実行すると、PDSの設定やアカウント、データ以外はインストール直後と同じ状態になります。 compose.yml などを変更していた場合、それらはリセットされます。

トラブルシュート

インストール後、ログインするとプロフィールが見えない、投稿しても見えない

  • 現在は開発者向けに連合が解放されており、すぐにBlueskyのネットワークに繋がらないようになっています。
  • 2024年2月現在、PDSをリレーに接続するには、公式ドキュメントからリンクされているDiscordサーバー、 AT Protocol PDS Admins に参加し、申請する必要があります。
    • 現在承認作業は手動のようで、これには数分〜数時間程度待つ可能性があります。
    • 将来的にこの申請は必要なくなるそうです。
    • 接続が許可されると、自分のプロフィールが見えるようになり、投稿したり閲覧することができるようになります。
    • このDiscordサーバーでははPDS設定時のサポートも受け付けてくれています。
    • また有志の呼びかけにより日本語チャンネルも設置してくれています。[2]

ほかの人の投稿は見えるのに、自分の投稿やいいね!が反映されない。もしかしてクロールされてない?

  • 次のコマンドを使ってBlueskyのリレーに見つけてもらうようリクエストすることができます
sudo pdsadmin request-crawl https://bsky.network
  • 成功するとデータの取得を開始し、タイムラインに表示されるようになります。
  • それでも表示されない場合、リバースプロキシサーバーがWebSocketでの接続に対応しているか確認してください。[3]

PDSのアカウントのハンドルが Invalid Handle と表示される

  • PDSのハンドルはWeb経由で検証されます。 https://<handle>/.well-known/atproto-did にアクセスし、DIDがテキストとしてレスポンスされれば正常に検証されるはずです。
  • Bluesky公式で提供されているBluesky Debugを使って確認すると問題を発見しやすくなります。

PDS運用における制限

  • 連合は始まりましたが、PDSの連合はまだデベロッパー公開フェーズです。
  • 現在運営からは、野良PDSに対して以下の制限がされています。[4]
    • 1つのPDSあたり10アカウントまで
    • 1時間あたり1500イベント
    • 1日あたり10,000イベント
  • 本格的に友人知人、コミュニティの人を招待して使うには、もう少しだけ時間がかかりそうです。

その他

その他の設定

今回公開された 0.4.0-beta より少し古いものになりますが、以前投稿した BlueskyのPDSを建てる (0.3.0-beta) も参考にしてみてください。

  • メール送信設定
  • アカウント作成時の招待コードの有無
  • 招待コードの自動配布間隔
  • PDSへの登録時に表示する利用規約およびプライバシーポリシーの設定方法

などの設定も記載しています。

実行環境をカスタマイズする

運用構成を部分的にカスタマイズした設定をGitHub上で公開しているので、こちらも良ければ参考にしてみてください。

以下のリポジトリでは、 Cloudflare + nginx + PDS(0.4.0) で動作する環境を作成してみています。

https://github.com/anon5r/mypds

設定やデータ保存領域を分けることで、1台で複数のPDSを同時に動かすこともできます。

最後に

最後までお付き合いいただきありがとうございます。

Blueskyで連合まで間もなく、というあたりでちょうどサンドボックスで遊びはじめていたので、更新して設定したらとても簡単にPDSを立ち上げることができ、感動していました。
細かいところをカスタマイズしようとすると、分からずハマりどころもありましたが、サポートコミュニティの助けなどもあり、一通り動かせるようになったので、自分の理解と整理のために書いてみました。
ドキュメントや先行してサンドボックス環境で検証してくれていた先人たちの知見記事もかなり参考にさせていただきました。

Bluesky自体もまだまだ開発中なので、今後ここから変わっていくこともあると思いますが、まずは連合が始まったことでここから盛り上がっていってくれたらなと思っています。

最後に、記事中の記載で、理解が誤ってる、記述が間違っている、などのご指摘があればコメントいただければ幸いです。


更新履歴

  • 誤字や一部分かりづらい記述の変更。AT Protocol解説、今後の考察記事へのリンク追加。 (2024/02/26 19:45)
  • 初版公開 (2024/02/26 11:49)
脚注
  1. 記載しているシークレットやパスワード、ローテーションキーはすべてダミーのものです。 ↩︎

  2. Nighthavenさん、きっかけをありがとうございます! ↩︎

  3. 筆者はnginxに置き換えた際、この設定が漏れており、1日ほど費やしました… ↩︎

  4. AT Protocol PDS AdminsのDiscordチャンネル内で記載されています ↩︎

Discussion