概要

Mastodonでオブジェクトストレージを使う際に、同じサーバー上のminioを利用してオブジェクトストレージのサーバーを用意しました。

ここではその方法を紹介します。

環境

  • Debian 11
  • Mastodon 4.1.0
  • Docker version 23.0.1

Mastodonとオブジェクトストレージ

Mastodonでは、リモートのサーバーのキャッシュや、サーバーの利用者がアップロードしたファイルなどのメディアファイルをオブジェクトストレージに保存することができます。こうすることで、サーバーのストレージをあまり圧迫せずに、Mastodonを運用することができます。

私も、どれくらいのデータがサーバーに保存されるのか、実際に利用するまで分からなかったため、Mastodonのメディアファイルをオブジェクトストレージへ保存するようにしていました。

実際に試してみると、自前で用意していたVPSのストレージサイズで収まるくらいのデータしかなかったので、今回Mastodonを動かしているのと同じVPS上で、minioを利用してオブジェクトストレージを用意し、それを利用することにしました。

minioの準備と設定

最初にサーバー上でminioを用意します。minioはDocker Composeを利用して用意しました。私の環境ではMastodonの環境構築にDockerを利用しているため、それを前提とした設定ファイルです。

docker-compose.ymlという名前のファイルに次の内容を記述します。

version: "3"

services:
  minio:
    image: quay.io/minio/minio
    container_name: minio
    restart: unless-stopped
    command: server --console-address ":9001" /data
    environment:
      MINIO_ROOT_USER: root
      MINIO_ROOT_PASSWORD: パスワード
    networks:
      - minio-network
    ports:
      - 9000:9000
      - 9001:9001
    volumes:
      - data:/data

volumes:
  data:

networks:
  minio-network:
    external: true

MINIO_ROOT_USERやMINIO_ROOT_PASSWORDは、それぞれminioのダッシュボードを利用するためのアカウントのユーザー名とパスワードです。バケットの作成やアクセス設定などに利用します。自分自身で用意した文字列を指定してください。

次に、minioで利用するネットワークを作成するためにdockerコマンドを実行します。

docker network create minio-network

minioのコンテナを起動します。

docker-compose up -d

minioの起動後、ブラウザからサーバー上の9001番ポートにアクセスします。私は、SSHのポートフォワーディングを利用してアクセスしました。

アクセス時には、先ほど設定したユーザー名やパスワードを利用します。そこから、適当な名前でバケットを作成します。さらに、Mastodonからアクセスできるようにアクセスキーも作成してください。

バケットについては、さらに設定が必要です。「Buckets」から先ほど作成したバケットを選択して右上の設定に移動します。その後、「Anonymous」から「Add Access Rule」を選択し、Prefixに*をAccessをreadonlyとして、設定を保存します。これで、Mastodonのユーザーがこのバケットにアクセス可能となり、メディアファイルを閲覧できるようになりました。

さらに、Mastodonの方に、minioで構築したオブジェクトストレージサーバーを参照するように設定を変更します。

.env.productionを次のように記述します。

S3_ENABLED=true
S3_BUCKET=<バケット名>
AWS_ACCESS_KEY_ID=<ACCESS_KEY>
AWS_SECRET_ACCESS_KEY=<SECRET_ACCESS_KEY>
S3_ALIAS_HOST=<ドメイン>/<バケット名>
S3_REGION=ap-northeast-1
S3_PROTOCOL=https
S3_HOSTNAME=minio:9000
S3_ENDPOINT=http://minio:9000

AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYには、minioのダッシュボードから作成したアクセスキーを指定します。

S3_ALIAS_HOSTには、メディアファイルを保存するオブジェクトストレージ用に新たに用意したドメイン名と、先ほど作成したバケットの名前を指定します。わざわざドメインを新たに用意するのは面倒かもしれませんが、必ず必要です。

S3_BUCKETにも、バケット名を記述します。

最後に、リバースプロキシでオブジェクトストレージへアクセスするようにします。私は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 /<バケット名>/ {
        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 http://localhost:9000/<バケット名>/;
    }

}

server {
    listen 80;
    server_name <ドメイン>;

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

オブジェクトストレージ用に用意したドメインやバケット名で<ドメイン><バケット名>は置き換えてください。

最後に、MastodonやNginxを再起動して、設定を反映させれば終わりです。

さいごに

ローカルにインストールしたminioをオブジェクトストレージとして利用していますが、今のところ不具合はありません。これまでオブジェクトストレージにかけていたお金が減ったので、少しだけ懐が潤いました。