Bluesky SandboxにPDSを立てる
BlueskyのPDSを立ててみた
2023年3月のカスタムドメインの説明から随分時間が経ってBlueskyに多くの機能が実装され自分が入ったころは1000アカウント台だったユーザーも160万アカウントを超えたBluesky。
2023年6月にBlueskyで連合実験のためのSandbox環境にPDSを立てていたので(2度爆破されている)それのここまでのまとめをしておく。
ほとんどgithubのコピーのようなものなのであまり意味はないかもしれない。
(Bluesky SandboxのPDS連合は定期的に爆破されるのであくまで実験場です)
推奨環境
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ともつながるようになる予定なので楽しみではある。