Mastodonでオブジェクトストレージを使う方法

目次

概要

Mastodonの画像や動画などのメディアファイルを置く場所として、オブジェクトストレージを使うようにしました。

このときに行った設定方法について説明します。

環境

  • mastodon 4.0.2
  • Wasabi

Mastodonのメディアについて

Mastodonでは、画像や動画などのメディアファイルを投稿に含めることができます。これらのファイルは、Mastodonのサーバーが管理する場所に保存されているわけですが、アップロードされた分だけ、サーバーのストレージが使われるということでもあります。

そこで、オブジェクトストレージと呼ばれるAPIを用いてファイルの保存や参照ができるサービスを利用して、サイズの大きいメディアファイルをサーバーとは異なる場所に保存する方法があります。

私は、自分で運用しているMastodonサーバーがあるのですが、このサーバーでは連合リレーを使って、他のたくさんのサーバーから投稿、トゥートを取得しています。もちろんこれらの投稿には画像や動画などのメディアが含まれており、にぎやかな連合リレーに接続しているため、1日あたりに保存されるメディアファイルのサイズは結構なものとなります。このように外部のサーバーから送られてきたメディアファイルは、キャッシュとして自分のサーバーにも保存されています。キャッシュなので、古いものを削除してサーバーのストレージの空きをつくることはできるのですが、それでもメディアファイルの量は結構な量となります。

そこで、オブジェクトストレージを利用して、キャッシュを含めたメディアファイルをMastodonを実行しているサーバーから覗くことにしました。

設定について

私が利用するオブジェクトストレージはWasabiというものです。WasabiはS3互換のAPIを備えたサービスで、使い勝手も良いです。Wasabiの契約は、公式サイトからも可能ですが、私の場合は、WebARENAを介して契約しました。WebARENAを利用したのは、WebARENAのIndigoというVPSサービスを利用していたため、契約しやすかったというのが大きな理由です。

Wasabi オブジェクトストレージなら安心と信頼のWebARENA(ウェブアリーナ)|Wasabi

Wasabiの料金は、1TBまで月額834円からとリーズナブルです。APIへのアクセスや通信に料金がかからないというのも嬉しい点です。

最初に、Wasabiの契約をして、バケットを作成します。バケットは、ファイルを置く場所です。バケットを複数作ることで、サービス毎やプロジェクト毎などにわけてファイルを管理することができます。

Wasabiへの接続について、どこからでもアクセスできるようにします。この設定はWasabiの場合、ポリシーを設定することでできます。このポリシーでは、保存されているオブジェクトへのアクセスのみを許可しているため、削除や変更などはできないようになっています。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AddPerm",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::<バケット名>/*"
    }
  ]
}

次に、Mastodonの設定ファイルを編集して、オブジェクトストレージにファイルを保存するようにします。設定ファイルは.env.productionなどの名前のファイルです。

S3_ENABLED=true
S3_BUCKET=<バケット名>
AWS_ACCESS_KEY_ID=<ACCESS_KEY_ID>
AWS_SECRET_ACCESS_KEY=<ACCESS_KEY>
S3_ALIAS_HOST=<ドメイン名>/<バケット名>
S3_REGION=ap-northeast-1
S3_PROTOCOL=https
S3_HOSTNAME=s3.ap-northeast-1.wasabisys.com
S3_ENDPOINT=https://s3.ap-northeast-1.wasabisys.com

設定では、バケット名やオブジェクトストレージにアクセスするACCESS_KEY_IDやACCESS_KEYを設定します。

その他にも、S3_HOSTNAMEやS3_ENDPOINTには、オブジェクトストレージにアクセスする際のドメインやホスト名を指定します。

少々面倒な点として、S3_ALIAS_HOSTを設定しています。この設定がない場合は、Wasabiなどのオブジェクトストレージ自体のドメインが公開されてしまいます。それでもよければそのままでも良いのですが、私の場合は、メディアを配布する用のドメインを新たに設定して、それを指定しました。ちなみに、最後にはドメイン/バケット名のようにバケット名を指定します。

最後にオブジェクトストレージへのアクセスをリバースプロキシで接続するようにします。私は、Mastodonを動かしているサーバーのNginxに設定を追加して利用しています。

Nginxの設定として次を追加します。

proxy_cache_path /var/cache/nginx/mastodon-s3 levels=1:2 keys_zone=mastodon-s3:10m inactive=7d max_size=1g;

server {
    listen 443 ssl http2;
    server_name ドメイン;

    ssl_certificate /etc/ssl/fullchain.pem;
    ssl_certificate_key /etc/ssl/privkey.pem;

    location /mastodon-s3/ {
        proxy_cache mastodon-s3;
        proxy_cache_revalidate on;
        proxy_buffering on;
        proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
        proxy_cache_background_update on;
        proxy_cache_lock on;
        proxy_cache_valid 1d;
        proxy_cache_valid 404 1h;
        proxy_ignore_headers Cache-Control;
        add_header X-Cached $upstream_cache_status;
        proxy_pass https://s3.ap-northeast-1.wasabisys.com/<バケット名>/;
    }

}

server {
    listen 80;
    server_name ドメイン;

    return 301 https://$server_name$request_uri;
}

server_nameのドメイン名や、proxy_passのオブジェクトストレージのパスなど、適当なものを設定してください。

これで設定は終わりです。最後にMastodonの再起動やNginxへの設定の読み込みをすれば終了です。

既存のデータについて

Mastodonで既に保存されているデータについて、基本的にはオブジェクトストレージに移しておいた方がよいです。しかし、移動させたからといって、元のサーバーに保存されているデータは削除しない方がよいです。リモートからMastodonにアクセスするサーバーの中に、昔のメディアファイルのURLを記憶しているものがあるためです。そのようなサーバーからも正常にアクセスできるようにするためには、元々保存されていたファイルにもアクセスできるようにしておくべきです。

例外として、キャッシュファイルについては削除しても大丈夫です。

既存のデータを送信する方法について紹介します。ここでは、awsコマンドを利用してオブジェクトストレージにアップロードをしました。

最初にaws-cliをインストールします。

pip3 install aws-cli

次に、接続のための設定を行います。設定は指示に従ってAPIへの接続用のキーなどを入力していきます。

aws configure

最後に、ファイルのアップロードを行います。アップロードするファイルは、Mastodon内のpublic/system以下のディレクトリやファイルです。

aws s3 sync public/system s3://<バケット名>/ --endpoint-url=https://s3.ap-northeast-1.wasabisys.com

アップロードするファイルの数が多い場合は、かなり時間がかかります。私の場合は30分ほどかかりました。

アップロードが終わったら、キャッシュ用のpublic/system/cacheディレクトリは削除しても大丈夫です。

さいごに

オブジェクトストレージをあまり使ったことがなかったので、設定に手間取りました。ポリシーを設定したり、メディア配信用に独自ドメインを設定するなど、設定する部分も多かったので苦労しました。

現在、私のMastodonではオブジェクトストレージを利用して不具合は発生していません。

同じような設定をしたい人の参考になれば嬉しいです。