さくらの VPS で Bluesky PDS (Personal Data Server) をセルフホストしてみる

早期アクセスが公開された Bluesky PDS (Personal Data Server) を、さくらの VPS を使用してセルフホストしてみました。インストールスクリプトのおかげで、単純に立ち上げるだけならとても手軽です。基本的な手順と、ちょっとした設定のコツや注意点についてまとめています。

先日、Bluesky はセルフホスティング向け 「連合 (フェデレーション)」 のアーリーアクセス (早期アクセス) を公開しました。

仕組みが異なるので同じではないですけども、わかりやすく簡単に言えば Mastodon のように、自分でサーバを立てて、AT Protocol (Authenticated Transfer Protocol) を利用した分散型ネットワークに接続することが可能になったということです。

現時点では、PDS あたり最大 10 アカウント、1時間あたり 1,500 イベント、1日あたり 10,000 イベントという制限がついていたり、アーリーアクセスですので、大きな変更が突然入って最悪ぶっ壊れるみたなことが起こる可能性があり、メインのアカウントを運用するような状況ではありませんけども、折角なのでどんな感じなのか実際に動かしてみることにしました。

前提

Bluesky PDS をセルフホストするのは、ただ立ち上げるだけなら超簡単なのですが、一応下記の準備が必要です。

  • サーバ (推奨スペックは後述)
  • ドメイン (DNS の設定が可能)

サーバの推奨スペック

サーバの推奨スペックについて、公式のドキュメントでは下記のような感じ。

公式リポジトリの README.md が更新されて、推奨スペックが下がったようなので下記に反映しています。下記の構成で、1 ~ 20 ユーザーくらいまでホストできる想定っぽいです。なので、さくらの VPS であれば、1G プランで十分ですね。

OS Ubuntu 22.04
メモリ 2 GB 以上 → 1 GB
CPU 2 Core 以上 → 1 Core
ストレージ 40 GB 以上の SSD 推奨 → 20 GB SSD
アーキテクチャ AMD64 / ARM64

今回はなるべく推奨環境に合わせておこうということで、さくらの VPS さんの 2G プランを選択しました。だいたい、月額で 1,700 円くらい。

最初は、DigitalOcean で簡単に立ち上げようかなと思ったんですけども、同じくらいのスペックだと、月額 20 ドルちょいで、日本で借りた方が安いってことに気がついてやめました。おのれ円安。

ドメインの選定

ドメインは、ご自由になんですけども、注意しないといけないのは、ホストに設定したドメイン自体は、アカウントのハンドルにはならないってこと。

これは、サブドメインで PDS をホストする場合は少し注意が必要かもしれません。つまり、subdomain.example.com で PDS をホストすると、その PDS 上で作成されたアカウントのハンドルとしては、username.subdomain.example.com みたいになっていくってことです。

例えば自分のブログなんかを長年 example.com で運営してるから、このドメインを使って username.example.com みたいなハンドルにしたいなと思ったとしても、実際に example.com を PDS のサーバに割り当てることはできない (運営中のサイトが閲覧できなくなっちゃうので) と思います ので、現実的には subdomain.example.com のように、サブドメインを PDS のサーバには割り当てることになると思います。

結果、本当はハンドルを username.example.com にしたいなと思っていても、実際には username.subdomain.example.com のような形にしかできない、ということになるわけです。

多分、自分にとって思い入れのあるドメインってのは、ほとんどの場合、すでに何かしらのサイト運営に使用されているケースが多いと思いますので、実は bsky.social 上で、カスタムドメインを設定する方が、本来自分の設定したいハンドルにしやすいっていうのはあるかもしれません。

ちなみに私は今回、サブドメインを使用して PDS をホストしました。よって、作ったアカウントのハンドルは、username.subdomain.example.com 形式になっています。

Bluesky PDS の立ち上げ

まずローカルで SSH に必要な秘密鍵と公開鍵ペアを作ります。署名アルゴリズムは 「ed25519」 を指定 (-t オプション)、管理がしやすいようにファイル名も指定 (-f オプション) しておきます。

ssh-keygen -t ed25519 -f ed25519_file_name

その上で、さくらの VPS のサイトからプランを選んで契約に進みます。

OS は 「Ubuntu 22.04 amd64」 を選択。リージョンなどはお好みで選んで、「SSH キー設定」 から 「公開鍵をサーバーにインストールする」 を選択し、先ほど作成した公開鍵をコピペ。契約を進めます。

サーバが立ち上がったら、SSH して、基本的な設定を。

まずは、最初のお仕事。

sudo apt update
sudo apt upgrade

SSH のポート番号変更とかパスワードによるログインの禁止とか。

sudo vim /etc/ssh/sshd_config
---
# ポート番号をデフォルトの 22 から任意に変更
Port 22
# PasswordAuthentication オプションを on に
PasswordAuthentication no
---
sudo systemctl restart sshd

ファイアウォールの設定を確認、先ほど変更した SSH ポートを開放するなど。

sudo ufw status
# 有効になっていなければ有効に
sudo ufw enable
# 変更した SSH ポートを許可
sudo ufw allow <port>/tcp
# 80/tcp と 443/tcp も有効に (実際には installer.sh が設定してくれるのでやらなくても問題なし)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 設定を反映
sudo ufw reload

DNS を設定

立ち上がったサーバに対して、PDS で使用するドメインが名前解決できるように DNS の設定をします。

例えば、subdomain.example.com という example.com のサブドメインを使用して PDS をホストする場合、まずはそのサブドメインで PDS にアクセスできるように設定が必要ですね。

example.com のネームサーバに対して、例えば下記のように設定します。

サブドメイン 種別 値 (IP アドレス)
subdomain A 203.0.113.1

ここまでは普通なんですが、次に、このサブドメイン上に作られるユーザー名に対応したサブドメインでもアクセスできないといけませんので、下記のように、*.subdomain という形でワイルドカードを使った設定もしておく必要があります。

当然ですが、サブドメインや IP アドレスは実際の環境に合わせて読みかえてください。

サブドメイン 種別 値 (IP アドレス)
*.subdomain A 203.0.113.1

もし、PDS ではアカウントをひとつしか作らないと決めていて、そのアカウント名も決まっている (例えば username) という場合は、下記のように設定しても良いです。

サブドメイン 種別 値 (IP アドレス)
username.subdomain A 203.0.113.1

大切なのは、PDS 自体 (例えば subdomain.example.com) と、そこに作られる各ユーザーのハンドル (username01.subdomain.example.comusername02.subdomain.example.com ...) がすべて名前解決できるようになっているかということです。

AT Protocol PDS Admins Discord から PDS の申請

今のところだけですが、Bluesky PDS 公式リポジトリの README.md には 『AT Protocol PDS Admins Discord に参加して、PDS のホスト名を登録してな』 と書かれていますので、それをやっておきます。

Bluesky PDS 公式リポジトリの該当セクション に Discord の招待リンクがありますので、そこから参加し、「#⁠requests」 チャンネルから PDS に設定したドメイン名と、連絡先メールアドレスを登録します。

PDS のインストール

サーバに戻って PDS のインストールを始めます。

まず、installer.sh を落としてきましょう。

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

そうしたら、installer.sh を実行するだけです。

sudo bash installer.sh

installer.sh

Enter your public DNS address (e.g. example.com):

みたいな感じで質問されますので、先ほど設定した PDS のドメイン (subdomain.example.com) を入力して進めます。

installer.sh が、Docker をインストールしたり、コンテナ立ち上げて Web サーバ (Caddy が使われています) の設定や証明書の取得、DB (SQLite) の設定まで全部やってくれますので、何もすることないです。

処理が進むと最後に、

Create a PDS user account? (y/N):

みたいに、アカウント作るか? って聞かれますので、作るならここで作っても良いです。メールアドレスと、ハンドル (username.subdomain.example.com など) を入力すればアカウントが作成されます (パスワードは自動発行)。

ここで作らなかった場合は、あとで

sudo pdsadmin account create username@example.com username.subdomain.example.com

のように、pdsadmin から簡単に作れますので、特に焦る必要はないです。

ちなみに、pdsadmin のヘルプはここにありますが、作ったアカウントの一覧が確認したければ、

sudo pdsadmin account list

で表示できますし、アカウントを削除したい場合は、

sudo pdsadmin account delete <DID>

で削除できます。

なお、installer.sh の処理が完了後の、Docker コンテナ稼働状況は下記のような感じです。

sudo docker container ls

CONTAINER ID   IMAGE                            COMMAND                   CREATED       STATUS                 PORTS     NAMES
09f8ecd1fec2   caddy:2                          "caddy run --config ..."   2 hours ago   Up 2 hours                       caddy
a8a72ab132b9   ghcr.io/bluesky-social/pds:0.4   "dumb-init -- node -..."   2 hours ago   Up 2 hours                       pds
77a2dffb3e42   containrrr/watchtower:latest     "/watchtower"             2 hours ago   Up 2 hours (healthy)             watchtower

メールが送信できるように設定

PDS は、メールアドレス確認用のメールや、パスワードリセット時なんかのメールを送信するみたいな処理も行いますが、これらは、

/xrpc/com.atproto.server.requestEmailConfirmation

が実行します。

ただし、さくらの VPS は契約直後だと OP25B の設定がネットワーク側で有効になっていて、25 番ポートから外部にメールを飛ばせないようになっていますので、これをなるべく手間をかけずに解決します。

で、今回は Gmail の SMTP を使わせてもらう事にしました。必要なのは Gmail アカウントと、「アプリパスワード」 です。

/pds/pds.env に、設定ファイルがありますので、これを開いて、下記の設定を追加しましょう。

PDS_EMAIL_FROM_ADDRESS=example@gmail.com
PDS_EMAIL_SMTP_URL=smtps://example%40gmail.com:[APP_PASSWORDS]@smtp.gmail.com

PDS_EMAIL_FROM_ADDRESS は PDS から送信されるメールの送信元アドレスです。

PDS_EMAIL_SMTP_URL に URI 形式で、SMTP に接続するための設定を記述します。

smtps://[GMAIL_ADDRESS]:[APP_PASSWORDS]@smtp.gmail.com という形式になりますが、メールアドレスの 「@」 は、「%40」 に URL エンコードしてください。また、アプリパスワードはアカウント管理画面からコピーすると、わかりやすいようにか、4 桁ずつスペースが入っていますけども、スペースは削除してくださいね。

設定ファイルを保存したら

sudo systemctl restart docker

しておきます。

PDS が無事立ち上がっているか確認

最後に、PDS の /xrpc/_health にブラウザでアクセスしてみましょう。今回の例だと下記のような URL にアクセスすることになります。

https://subdomain.example.com/xrpc/_health

下記のような JSON が帰ってくれば問題なく PDS が立ち上がっています。

version "0.4.0-beta.7"

もし、タイムアウトするなど、アクセスできない場合は、sudo ufw status して必要なポート (80/tcp と 443/tcp) が開いているかの確認や、Docker のログなどを確認しつつ原因を探します。

さくらの VPS の場合、ufw の設定以外に、サーバコントロールパネル側でパケットフィルタの設定がされていると思いますので、そっちで必要なポートが開いてない、みたいなこともあるかもしれません。確認してください。

Bluesky App からサインイン

無事、PDS が立ち上がったら、Bluesky App からサインインしてみましょう。

例えば、Web 版の場合、サインイン画面で、「Bluesky Social」 の部分をクリックすると、サービスを選択できます。

Bluesky App で PDS にログイン Step 1

「カスタム」 の方を選ぶとアドレス入力欄がありますので、ここに PDS のアドレスを入力しましょう。

Bluesky App で PDS にログイン Step 2

あとは、作ったアカウント情報でログインすれば OK です。

設定画面から 「Verify email (メールアドレスの確認)」 を実行して、正しくメールが届けば、確認コードを入力して、プロフィール設定に進めば PDS でのアカウント運用開始です。

ちなみに、私がセルフホストした PDS で立ち上げたアカウントが下記。

本垢、というかメインで使っているアカウントは下記です。

紛らわしいけど、とりあえずしばらく運用してみて、サーバのリソースがどの程度消費されるのかなど、見守ってみたいと思います。

関連エントリー


注釈:
PDS の HTTP API 群は /xrpc/ 以下で動作しますので、理論上はそこだけ既存サイト内で動作するようにすれば共存はできると思いますが、結構面倒くさいんじゃないですかね...... 少なくとも私はやりたくない。

記事をここまで御覧頂きありがとうございます。
この記事が気に入ったらサポートしてみませんか?