MastodonのオブジェクトストレージにCloudflare R2を設定する方法
概要
Cloudflare R2を使用してMastodonのメディアファイルを保存し、配信する方法を紹介します。
環境
- Mastodon 4.1.1
目的
Mastodonでは、トゥートの投稿時にアップロードした画像や動画などのメディアファイルをオブジェクトストレージに保存することができます。また、リモートのサーバーから取得したトゥートに含まれるメディアファイルもキャッシュとして保存可能です。
オブジェクトストレージにメディアファイルを保存し、配信することで、サーバーのストレージ使用量を減らしたり、負荷を減らしたりできます。私がオブジェクトストレージを利用しようと思ったのは、主にこのためです。
MastodonでサポートされているオブジェクトストレージはAWS S3ですが、S3にはたくさんの互換サービスがあります。私が今回利用したCloudflare R2もその1つです。また、自分でサーバーを用意して使うMinioなどもあります。
Cloudflare R2を使用してみた理由は、AWSのS3よりも安価に利用できるためです。S3とは異なり、転送量については料金がかかりません。また、保存しているデータのサイズや、オブジェクトへのアクセス数で課金されるモデルはS3と同様ですが、この金額もS3より安価です。
Cloudflare R2 | エグレス料金ゼロのオブジェクトストレージ
AWS S3とは設定方法が一部異なるため、ここではMastodonでCloudflare R2を使う方法について説明します。
設定方法
ここからは、Cloudflare R2の設定をした後に、Mastodonの設定をするという流れで進めていきます。
最初に、Cloudflareにサインインします。その後、メニューからR2を選択します。
ここでは、R2に関するさまざまな設定ができます。まずはR2で使用するバケットを作成します。このバケットの名前はMastodonの設定でも使うので、覚えておきます。
次に、どこからでもアクセスして保存しているデータを確認できるようにバケットの設定を変更します。バケットの「Settings」に移動します。そうすると、「Public access」という項目があるので、そこから、Cloudflareが用意するr2.devドメインを利用するか、自分で用意した好きなドメイン名を利用するかを選択して、設定します。両方設定することも可能です。ここで設定したドメインはMastodonの設定でも使います。
その他に、この作成したバケットに書き込みができるAPIキーを用意します。設定はR2のトップページに移動して、右上の「Manage R2 API Tokens」から行います。指示に従って、APIキーを作成します。このとき、PermissioinはEditにします。最後に表示される「Access Key ID」と「Secret Access Key」は、Mastodonの設定で使います。
次に、Mastodonをインストールしたサーバーを操作して設定します。Mastodonの設定ファイルが書かれた.env.productionに次のように記述します。
S3_ENABLED=true
S3_ALIAS_HOST=<Public Accessで設定したドメイン>
S3_BUCKET=<バケット名>
S3_ENDPOINT=https://<アカウントID>.r2.cloudflarestorage.com/
AWS_ACCESS_KEY_ID=<Access Key ID>
AWS_SECRET_ACCESS_KEY=<Secret Access Key>
S3_PROTOCOL=https
S3_PERMISSION=private
S3_ENDPOINTに指定するものは、バケットの詳細ページにも書かれているエンドポイントから、バケット名を除いたものでもあります。S3_ALIAS_HOSTは、Public accessで設定したドメインをexample.comのように、httpやhttpsをつけずに指定します。
最後に、Mastodonを再起動して設定を反映させれば終わりです。
設定が正しくできていれば、Mastodonへアクセスした際に画像や動画などのメディアファイルが表示されるはずです。
既にMastodonにある画像や動画をオブジェクトストレージに保存する場合は、mastodonディレクトリ以下のpublic/systemの内容をオブジェクトストレージにアップロードして対応可能です。AWS CLIのs3コマンドを利用したり、rcloneコマンドを利用したり、AWS S3のバケットを操作するのと同じように操作可能です。
さいごに
Cloudflare R2は、S3互換のオブジェクトストレージとしてかなり後発のサービスです。リリースされてからあまり時間が経っておらず、S3のすべての機能を備えているわけではありません。そのため、失敗する可能性もあるかもしれませんが、うまく設定できました。