Bluesky SandboxにPDSを立てる

作成:
heroimage

BlueskyのPDSを立ててみた

2023年3月のカスタムドメインの説明から随分時間が経ってBlueskyに多くの機能が実装され自分が入ったころは1000アカウント台だったユーザーも160万アカウントを超えたBluesky。

2023年6月にBlueskyで連合実験のためのSandbox環境にPDSを立てていたので(2度爆破されている)それのここまでのまとめをしておく。

ほとんどgithubのコピーのようなものなのであまり意味はないかもしれない。

(Bluesky SandboxのPDS連合は定期的に爆破されるのであくまで実験場です)

GitHub - bluesky-social/pds: Bluesky PDS (Personal Data Server) container image, compose file, and documentation
Bluesky PDS (Personal Data Server) container image, compose file, and documentation - bluesky-social/pds
GitHub - bluesky-social/pds: Bluesky PDS (Personal Data Server) container image, compose file, and documentation favicon https://github.com/bluesky-social/pds
GitHub - bluesky-social/pds: Bluesky PDS (Personal Data Server) container image, compose file, and documentation

推奨環境

githubではUbuntu22.04を推奨しているが自分が試したところRaspberry pi OSでもPDSを立てることができた。

余計な問題が起こる可能性もあるのでとりあえずUbuntu22.04で良いかもしれない。(23.04でも確認済み)

自分の環境

現状のギャラリー用に使っている個人サーバーのubanis.mydns.jpをサブドメインを利用して立てることにした。mydns.jpでサブドメインを設定する方法は検索すると出てくる。

サーバー自体は昔のままの構成。OSはUbuntu22.04LTSにアップグレード済み。

  • OS Ubuntu 22.04LTS
  • CPU Celeron J3455
  • Memory DDR3 16GB
  • SSD 240GB

簡単な導入手順

すべてを自動的に行ってくれるスクリプトがある。

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

自分はすでにいろいろサーバーが動いている状態だったのでマニュアル導入をした。

手動導入

ファイアウォールのポートを開ける

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Dockerの導入

自分はすでに導入してあったので特に何もしなかったがgithubに記載されている方法を貼っておく。

sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

PDS用のディレクトリの作成

ここにwebサーバーCaddyの設定やPDSのデータベースや画像などが保存される。

sudo mkdir /pds
sudo mkdir --parents /pds/caddy/data
sudo mkdir --parents /pds/caddy/etc/caddy

Caddyfileを作成

webサーバーCaddyの設定を作成する。example.comは自分のドメインにする。

cat <<CADDYFILE | sudo tee /pds/caddy/etc/caddy/Caddyfile
{
  email you@example.com
  on_demand_tls {
    ask http://localhost:3000
  }
}

*.example.com, example.com {
  tls {
    on_demand
  }
  reverse_proxy http://localhost:3000
}
CADDYFILE

PDSの設定ファイル

PDS関係の環境変数がセットされている状態でcatでファイルを生成する。自分は面倒なのでシェルスクリプトを用意した。

PDS_HOSTNAME="example.com"
PDS_JWT_SECRET="$(openssl rand --hex 16)"
PDS_ADMIN_PASSWORD="$(openssl rand --hex 16)"
PDS_REPO_SIGNING_KEY_K256_PRIVATE_KEY_HEX="$(openssl ecparam --name secp256k1 --genkey --noout --outform DER | tail --bytes=+8 | head --bytes=32 | xxd --plain --cols 32)"
PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX="$(openssl ecparam --name secp256k1 --genkey --noout --outform DER | tail --bytes=+8 | head --bytes=32 | xxd --plain --cols 32)"

cat <<PDS_CONFIG | sudo tee /pds/pds.env
PDS_HOSTNAME=${PDS_HOSTNAME}
PDS_JWT_SECRET=${PDS_JWT_SECRET}
PDS_ADMIN_PASSWORD=${PDS_ADMIN_PASSWORD}
PDS_REPO_SIGNING_KEY_K256_PRIVATE_KEY_HEX=${PDS_REPO_SIGNING_KEY_K256_PRIVATE_KEY_HEX}
PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX=${PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX}
PDS_DB_SQLITE_LOCATION=/pds/pds.sqlite
PDS_BLOBSTORE_DISK_LOCATION=/pds/blocks
PDS_DID_PLC_URL=https://plc.bsky-sandbox.dev
PDS_BSKY_APP_VIEW_URL=https://api.bsky-sandbox.dev
PDS_BSKY_APP_VIEW_DID=did:web:api.bsky-sandbox.dev
PDS_CRAWLERS=https://bgs.bsky-sandbox.dev
PDS_CONFIG

githubの初期設定には書かれていないがこのpds.envにPDS_INVITE_REQUIRED=falseを追記して自分のアカウント作成後にfalseをtrueにして招待コードなしに自分のPDSでアカウントを作成できない状態にしておいた。

以前はデフォルトだとこの記述がない場合は招待コードなしでアカウント作成できる状態だった。

管理者メールアドレスはパスワード変更の際にユーザーへ送るメールアドレスの送信元アドレスになる。

  • PDS_EMAL_FROM_ADDRESS=メールアドレス
  • PDS_EMAIL_SMTP_URL=Googleなどで設定したSMTPメール転送

これらを設定しないとメール経由のパスワードの変更などができなくなる。

Docker composeファイルのダウンロード

curl https://raw.githubusercontent.com/bluesky-social/pds/main/compose.yaml | sudo tee /pds/compose.yaml

次の3つのコンテナが作成されるようになっている。

  • pds localhost:3000で動作するPDSサーバー
  • caddy リバースプロキシーのためのwebサーバー
  • watchtower 自動的にpds関連コンテナを最新のものに更新するためのもの

PDSをUbuntuのサービスに登録する

cat <<SYSTEMD_UNIT_FILE >/etc/systemd/system/pds.service
[Unit]
Description=Bluesky PDS Service
Documentation=https://github.com/bluesky-social/pds
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/pds
ExecStart=/usr/bin/docker compose --file /pds/compose.yaml up --detach
ExecStop=/usr/bin/docker compose --file /pds/compose.yaml down

[Install]
WantedBy=default.target
SYSTEMD_UNIT_FILE

systemdデーモンのリロード

sudo systemctl daemon-reload

systemd サービスの有効化

sudo systemctl enable pds

systemd PDSの開始

sudo systemctl start pds

PDSが動作しているか確認する

curl https://example.com/xrpc/_health
{"version": "0.3.0-beta.3"}

PDSが正常に動作しているならば上記のようなバージョン番号が返ってくる。
watchtowerがPDSの自動更新を行うので定期的に確認してみると良い。

招待コードの作成

管理者パスワードの確認

以下のようにして出力して確認する。

source /pds/pds.env
echo $PDS_ADMIN_PASSWORD
a7b5970b6a5077bb41fc68a26d30adda これは例

招待コード作成

YOUR PDS ADMIN PASSWORDは上記で確認した管理者パスワードのこと。

PDS_HOSTNAME="example.com"
PDS_ADMIN_PASSWORD="<YOUR PDS ADMIN PASSWORD>"

curl --silent \
  --show-error \
  --request POST \
  --user "admin:${PDS_ADMIN_PASSWORD}" \
  --header "Content-Type: application/json" \
  --data '{"useCount": 1}' \
  https://${PDS_HOSTNAME}/xrpc/com.atproto.server.createInviteCode

Blueskyクライアントから接続

sandbox用に別のwebクライアントの場所が用意されているので https://app.bsky-sandbox.dev ここから自分のPDSに接続してみる。当然公式のiosやAndroidのクライアントからでも問題ない。

自分のPDSのアドレスを入力

Create Accountから Hosting ServerをOtherにして自分のPDSのドメイン名を入力する。

例) https://pds.ubanis.mydns.jp

PDSが正常に動作しているならば特に何もエラーが表示されることなくNextが押せる。

アカウント作成

ここからは通常のBlueskyのアカウント作成と同じ。

アカウント名が公式サーバーならば、ubanis.bsky.socialであるところが自分のPDSのものになる。

例) ubanis.pds.ubanis.mydns.jp

ポストする

アカウント作成直後は自分のプロフィールがエラーになったりするかもしれないがしばらくすると正常に表示されるはずなのでそこで初めてのポストをする。

プロフィールの画像を変更するなどして画像も正しくPDSにアップロードされるか確認してみる。

最後に

BlueskyはPDSがたくさん連合している状態でも一見ひとつのサーバーにしか見えず、ユーザーも分散している先から接続しているのかもわからないように感じられるのでマストドンのような壁を感じないのが良いと思った。

Blueskyは2024年初頭からいよいよ正式に連合が始まり公式のPDS bsky.socialともつながるようになる予定なので楽しみではある。