Mastodonでオブジェクトストレージとしてminioを使う方法
概要
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をオブジェクトストレージとして利用していますが、今のところ不具合はありません。これまでオブジェクトストレージにかけていたお金が減ったので、少しだけ懐が潤いました。