quartz-research-note/content/BlueskyのPDSをCloudflare Tunnel環境でセルフホストする.md
Tomoya Matsuura(MacBookPro) 8681977218
All checks were successful
Build / build (push) Successful in 3m8s
[obsidian] vault backup: 2024-03-05 23:31:25[
2024-03-05 23:31:25 +09:00

6.4 KiB
Raw Blame History

date
2024-02-08T15:53:17+0900

#self-hosted #bsky

公式リポジトリ

日本語のリソース

基本的には公式のリソースに従うのが一番。インストールスクリプトを実行すると/pdsディレクトリ以下に必要なリソースをコピーして、Dockerのインストールも含めて面倒を見てくれるので、すでにDockerで色々立ち上げてる人には逆にめんどくさいかもしれない。DNSの設定とかをDockerホスト側の設定含めチェックする必要があるからこういうやり方にしている…っぽい。

私はせっかくProxmox環境なので、諦めて一個LXCコンテナを増やすことにした。

Cloudflare環境でのハンドル解決問題

BlueskyのATプロトコルはDNSレベルでのハンドル解決を行う。そのため、例えばサーバーをbsky.matsuuratomoya.comでホストすると、通常はアカウントはサブドメインのtomoya.bsky.matsuuratomoya.comで解決されなければならない。

ここで、私の環境では問題が二つ。

  • bsky.matsuuratomoya.com${handle}.bsky.matsuuratomoya.comはどちらもpdsのサーバーのIPアドレスにAレコードで解決されなければならない。
  • また実際のトラフィックはポート80、443をサーバーまで到達できるようにしなければならない。

立ち上げたサーバーが固定グローバルIPを持つ場合特に問題ない。私のサーバーはIPoE環境なので、IPv4で任意のポートを空けることができない。そのためWebサービスの公開にはCloudflare Tunnelを使っている。

この場合、必然的にネームサーバーもCloudflareのものを使うことになる。Cloudflareは自動でHTTPの接続をSSL化してくれるので、Let's Encryptとかの面倒な設定が要らないため便利。だが無料プランでは残念ながら二階層以上のサブドメイン、つまり${handle}.bsky.matsuuratomoya.comにはSSL証明書を発行してくれない。

解決策は次のどれかである

  1. Cloudflareにお金を払ってSSL証明書を発行してもらう
  2. サブサブドメイン部分だけどうにか別の方法で証明書を用意する
  3. 自分一人のハンドル解決だけどうにかする設定にする(今回はこれ)

シングルユーザーインスタンス限定の解法

/pds/pds.envPDS_SERVICE_HANDLE_DOMAINS=.matsuuratomoya.comのように指定すると、PDSサーバー自体のアドレスをhttps://pds.matsuuratomoya.comにしたまま、ハンドルのIDは${handle}.matsuuratomoya.comで設定できます。

もちろん、実際にはこの状態でアカウントをいくつも作っていっても、ハンドルIDが自分の立ち上げてる他のサーバーのアドレスとかち合ったりするので普通は運用できません。

しかし、使うユーザーが一人だけの場合は、_atproto.${handle}.matsuuratomoya.comにTXTレコードでアカウントのDID永続性のあるアカウントIDを指定することでハンドルを解決すれば問題なく動かすことができます。

というわけで、まずは公式のinstall.shpds.matsuuratomoya.com上に一通りサーバーを立ち上げて、/pds/pds.envPDS_SERVICE_HANDLE_DOMAINS=.matsuuratomoya.comを追記します。 ついでに、管理メールの送信用のSMTPの設定も済ましておきましょう。

PDS_EMAIL_SMTP_URL=smtps://${_SMTP_USERNAME}:${_SMTP_PASSWORD}@${_SMTP_HOST}
PDS_EMAIL_FROM_ADDRESS=hogehoge@matsuuratomoya.com

(PDS_EMAIL_FROM_ADDRESSに関してはなぜかドキュメントに載っていなかった気がする)

その後pdsadmin create-invite-codeでアカウント招待コードを作っておきます。(pdsadmin account createだと先にハンドル解決ができないため招待コードを経由する)

Cloudflare Tunnelを立ち上げる

Cloudflare Tunnelを立ち上げます。私は別の用途で色々使っているトンネルがあるのでここでは省略。 一度も使ったことがないなら、おすすめは/pds以下にcompose.override.ymlというファイルを作ってコンテナを追加すること。

services:
  tunnel:
    container_name: cloudflared-tunnel
    image: cloudflare/cloudflared:latest
    volumes:
      - ./cloudflared:/~/.cloudflared
    restart: unless-stopped
    command: tunnel run
    privileged: true
    environment:
      - TUNNEL_TOKEN=<設定画面で出てきたトークン>

トンネルが開通したら、サーバーのローカルIP同じdocker composeで立ち上げてるならlocalhostに転送する。特にドキュメントに書かれてないが内部的には3000番でサーバーが立ち上がっているところに、Caddyでリバースプロキシをかけているので、トンネルからHTTPをそのまま3000番に転送してあげる。

なので、docker composeで立ち上がっているcaddyのサーバーは無用の長物になっているため、気になる人はオリジナルのcompose.ymlでコメントアウトしてもいいと思う。私はどうせアップデートかけた時にcompose.ymlが巻き戻る気がしててめんどくさいのでやってない

PDSにログインする

https://bsky.app にアクセスして、