diff --git a/content/Bluesky.md b/content/Bluesky.md new file mode 100644 index 00000000..be0120e0 --- /dev/null +++ b/content/Bluesky.md @@ -0,0 +1,11 @@ +--- +date: "2024-02-08T15:53:17+0900" +--- +#socialmedia + +[@tomoya.matsuuratomoya.com on Bluesky](https://bsky.app/profile/tomoya.matsuuratomoya.com) + +基本は[[Mastodon]]からクロスポストする運用中。 + +- [[BlueskyのPDSをCloudflare Tunnel環境でセルフホストする]] +- [[MastodonからBlueskyにクロスポストする]] \ No newline at end of file diff --git a/content/BlueskyのPDSをCloudflare Tunnel環境でセルフホストする.md b/content/BlueskyのPDSをCloudflare Tunnel環境でセルフホストする.md index 7c29cabc..4fcb4fa9 100644 --- a/content/BlueskyのPDSをCloudflare Tunnel環境でセルフホストする.md +++ b/content/BlueskyのPDSをCloudflare Tunnel環境でセルフホストする.md @@ -3,6 +3,10 @@ date: "2024-02-08T15:53:17+0900" --- #self-hosted #bsky +立ちました。 +[[Bluesky]] +[@tomoya.matsuuratomoya.com on Bluesky](https://bsky.app/profile/tomoya.matsuuratomoya.com) + 公式リポジトリ - [GitHub - bluesky-social/pds: Bluesky PDS (Personal Data Server) container image, compose file, and documentation](https://github.com/bluesky-social/pds) @@ -41,14 +45,14 @@ BlueskyのATプロトコルはDNSレベルでのハンドル解決を行う。 ## シングルユーザーインスタンス限定の解法 -`/pds/pds.env`で`PDS_SERVICE_HANDLE_DOMAINS=.matsuuratomoya.com`のように指定すると、PDSサーバー自体のアドレスを`https://pds.matsuuratomoya.com`にしたまま、ハンドルのIDは`${handle}.matsuuratomoya.com`で設定できます。 +`/pds/pds.env`で`PDS_SERVICE_HANDLE_DOMAINS=.matsuuratomoya.com`のように指定すると、PDSサーバー自体のアドレスを`https://pds.matsuuratomoya.com`にしたまま、ハンドルのIDは`${handle}.matsuuratomoya.com`で設定できる。 -もちろん、実際にはこの状態でアカウントをいくつも作っていっても、ハンドルIDが自分の立ち上げてる他のサーバーのアドレスとかち合ったりするので普通は運用できません。 +もちろん、実際にはこの状態でアカウントをいくつも作っていっても、ハンドルIDが自分の立ち上げてる他のサーバーのアドレスとかち合ったりするので普通は運用できない。 -しかし、使うユーザーが一人だけの場合は、`_atproto.${handle}.matsuuratomoya.com`にTXTレコードでアカウントのDID(永続性のあるアカウントID)を指定することでハンドルを解決すれば問題なく動かすことができます。 +しかし、使うユーザーが一人だけの場合は、`_atproto.${handle}.matsuuratomoya.com`にTXTレコードでアカウントのDID(永続性のあるアカウントID)を指定することでハンドルを解決すれば問題なく動かすことができる。 -というわけで、まずは公式の`install.sh`で`pds.matsuuratomoya.com`上に一通りサーバーを立ち上げて、`/pds/pds.env`に`PDS_SERVICE_HANDLE_DOMAINS=.matsuuratomoya.com`を追記します。 -ついでに、管理メールの送信用のSMTPの設定も済ましておきましょう。 +というわけで、まずは公式の`install.sh`で`pds.matsuuratomoya.com`上に一通りサーバーを立ち上げて、`/pds/pds.env`に`PDS_SERVICE_HANDLE_DOMAINS=.matsuuratomoya.com`を追記する。 +ついでに、管理メールの送信用のSMTPの設定も済ましておく。 ``` PDS_EMAIL_SMTP_URL=smtps://${_SMTP_USERNAME}:${_SMTP_PASSWORD}@${_SMTP_HOST} @@ -56,12 +60,12 @@ PDS_EMAIL_FROM_ADDRESS=hogehoge@matsuuratomoya.com ``` (`PDS_EMAIL_FROM_ADDRESS`に関してはなぜかドキュメントに載っていなかった気がする) -その後`pdsadmin create-invite-code`でアカウント招待コードを作っておきます。(`pdsadmin account create`だと先にハンドル解決ができないため招待コードを経由する) +その後`pdsadmin create-invite-code`でアカウント招待コードを作っておく。(`pdsadmin account create`だと先にハンドル解決ができないため招待コードを経由する) ### Cloudflare Tunnelを立ち上げる -Cloudflare Tunnelを立ち上げます。私は別の用途で色々使っているトンネルがあるのでここでは省略。 -一度も使ったことがないなら、おすすめは`/pds`以下に`compose.override.yml`というファイルを作ってコンテナを追加すること。 +Cloudflare Tunnelを立ち上げる。私は別の用途で色々使っているトンネルがあるのでここでは省略。 +一度も使ったことがないなら、おすすめは`/pds`以下に`compose.override.yml`というファイルを作ってコンテナを追加するのが多分楽。 ``` services: @@ -77,10 +81,34 @@ services: - TUNNEL_TOKEN=<設定画面で出てきたトークン> ``` -トンネルが開通したら、サーバーのローカルIP(同じdocker composeで立ち上げてるなら`localhost`で)に転送する。特にドキュメントに書かれてないが内部的には3000番でサーバーが立ち上がっているところに、[[Caddy]]でリバースプロキシをかけているので、トンネルからHTTPをそのまま3000番に転送してあげる。 +トンネルが開通したら、サーバーのローカルIP(同じdocker composeで立ち上げてるなら`localhost`でいい)に転送する。特にドキュメントに書かれてないが内部的には3000番でサーバーが立ち上がっているところに、[[Caddy]]でリバースプロキシをかけている。なので、トンネルではpds.matsuuratomoa.comに来るHTTPをそのまま3000番に転送してあげれば良い。 -(なので、docker composeで立ち上がっているcaddyのサーバーは無用の長物になっているため、気になる人はオリジナルの`compose.yml`でコメントアウトしてもいいと思う。私はどうせアップデートかけた時にcompose.ymlが巻き戻る気がしててめんどくさいのでやってない) +(つまりdocker composeで立ち上がっているcaddyのサーバーは無用の長物になっているため、気になる人はオリジナルの`compose.yml`でコメントアウトしてもいいと思う。私はどうせアップデートかけた時にcompose.ymlが巻き戻る気がしててめんどくさいのでやってない) ### PDSにログインする -https://bsky.app にアクセスして、 +https://bsky.app にアクセスして、アカウントを作成する。この時pdsがきちんと立ち上がっていれば、サーバーのアドレスにpds.matsuuratomoya.comを指定して次に進めるはず。 + +ここで先ほど作成した招待コードでアカウント作成を進める。アカウント名はなんでもいいが、`me`や`at`、`bsky`などシングルユーザーインスタンスなら使っても良さそうな短いハンドル名はコード上で予約IDとして(多分スパム防止)弾かれてしまう。(これは後々設定ファイルで弄れるようにしてほしい…。) + +しょうがないので私は冗長だが`tomoya.matsuuratomoya.com`というハンドルを設定した。 + +ここで重要なのは、**このインスタンスでログインしている間、インスタンス上のアカウントのハンドル解決はあくまで内部的に**行われるということだ。 + +どういうことかというと、アカウント作成後、設定画面からハンドル変更で独自ドメインを指定することができる。 +ここで例えばDNSを使用して`matsuuratomoya.com`というルートドメインをアカウントに設定することも、`_atproto`にTXTレコードをきちんと設定すれば、できる。ログアウトした状態なら正常にこのアカウントのプロフィールも表示できる。 + +ただし、`matsuuratomoya.com`を含むハンドルは`pds.matsuuratomoya.com`でログインしてる限り、あくまで内部でのハンドル解決が優先されDNSへの問い合わせはされない、ということらしい。ここがドキュメントでは明言されておらず自分のプロフィールが表示されないのに丸一日悩まされた。 + +### 他サーバーとの連携 + +肝心のFederationだが、残念ながら現在は一通り設定を済ませた後公式のDiscord([AT Protocol PDS Admins Discord](https://discord.gg/UWS6FFdhMe))でPDSサーバーのアドレスを添えて連携リクエストをbsky公式に出す必要がある(そうしないとbluesky.socialのアカウントからは見えないようになっている) + +作れるアカウントも現在は10アカウントまで、投稿数にも(一人で使う分には問題ない程度の)制限がある。今後どのくらい盛り上がるんでしょうね。 + +## 要点まとめ + +- 自分のpdsはcloudflare tunnelでpds.matsuuratomoya.comをポート3000に転送 +- `/pds/pds.env`で`PDS_SERVICE_HANDLE_DOMAINS=.matsuuratomoya.com`のようにルートドメインにする必要あり(Cloudflareではサブサブドメインに証明書が出ないので) +- その上で、自分のpdsでログインしてる時の、自分のドメインに属するアカウントのハンドル解決は`_atproto`レコードや`.well-known/atproto-did`を介さず行われるので何がしかのハンドルを設定する必要がある(私の場合は`@tomoya.matsuuratomoya.com`に設定でき、`@matsuuratomoya.com`にはできない) +- しかし以前としてログアウト状態や他のインスタンスからはDNS解決できる必要があるので、`_atproto.tomoya.matsuuratomoya.com`にTXTレコードでdidを指定する必要がある diff --git a/content/MastodonからBlueskyにクロスポストする.md b/content/MastodonからBlueskyにクロスポストする.md new file mode 100644 index 00000000..0e9c999d --- /dev/null +++ b/content/MastodonからBlueskyにクロスポストする.md @@ -0,0 +1,43 @@ +--- +date: "2024-02-08T15:53:17+0900" +--- +#self-hosted #bsky + +[tomoyanonymous/mastodon-to-bluesky: forked from https://github.com/mauricerenck/mastodon-to-bluesky - mastodon-to-bluesky - Tomoya Matsuura Gitea](https://git.matsuuratomoya.com/tomoyanonymous/mastodon-to-bluesky) + +主にこの記事を参考にした。 + +[Crosspost from Mastodon to Bluesky - Maurice Renck](https://maurice-renck.de/en/hub/tooling/crosspost-from-mastodon-to-bluesky) + +RSSをフェッチして転送している形に近いけど、MastodonというかActivityPubプロトコルには**outbox**というjsonでの直近10件程度のポストを取得できる仕組みがある。公開アカウントならこれを定期的にフェッチしてbskyの公式APIで投稿すれば良い。 + +下準備として、bskyにログインして設定からアプリパスワードを作成しておく。 + +設定ファイル(.env)にMastodonのインスタンス、ID、bskyのハンドル、PDSサーバーのアドレス、アプリパスワードを設定しておく。 + +lastProcessedPostId.txtというファイルに、一番最後にクロスポスト投稿した時刻を保存しておくことで重複を避けているらしい。 + +## 改善の余地 + +元のコードでは、画像を含むポストは画像なしでそのまま転送、リプライは全て無視していた。この辺は一応治せるはず。 + +### 画像のアップロード(不完全) + +bskyのAPIでは画像も4枚までアップロードできる。やってる人もいる。 + +[Node.js (Typescript) で Bluesky に画像を自動投稿する Bot を作る (その1) #Node.js - Qiita](https://qiita.com/eXpresser/items/fce2066f442bd37c8a36) + +ただし、画像のサイズは1MBまでの制限がある。Mastodonの方がこの制限はゆるいので、適当にスマホで撮った写真だと普通に2MBとか行ってたりする。ので、画像サイズを適当に縮小してから送る必要があるだろう。 + +…なのだが、試しに小さいサイズの画像でアップロードしてみてもなぜかエラーのレスポンスが返ってきてしまう。これはPDSをセルフホストしているせいのような気がする。 + +ので、今は諦めて画像のURLをoutboxから取得してそのURLをテキストとしてそのまま添付している。 + +### 自分へのリプライを取得(これも不完全) + +他人へのリプライはともかく、自分でのリプライのツリーは結構使うので無視したくない。 + +もとのコードは`item.object.inReplyTo===null`のものだけを抜き出してたので、IDもチェックして自分相手だったら無視せず投稿することにした。 + +bskyのAPIで、リプライ先を指定した投稿もできる。ただそうすると、Mastodonでの投稿URLと、bskyでの投稿URLの対をどこかデータベースに保管しなくてはならない。これはだるいのでやめた。そもそも自分宛のリプライくらいなら普通の連投でもそこまで不自然ではあるまい。 +