Mastodon の画像をローカルから S3 互換サーバーに移した
Mastodon の画像をローカルから S3 互換サーバーに移しました。当初は「お一人様だから」ということでしばらくローカルに保存すればいいかなと思っていましたが、リレーサーバーに参加した途端にメディアストレージの使用量がエグいことになったので、練習も兼ねて S3 互換サーバーに移すことにしました。
使ったサービス
せっかく Vultr にホストしているのでオブジェクトストレージも Vultr が提供しているサービスを使います。容量 1TB で月額5ドルです。S3 互換サーバー、と書いている通り S3 の知見をある程度参考にできるのが嬉しいです。
余談ですが、実はオブジェクトストレージも今回はじめて使うので相場とかは何も知らないのですが、5ドルで 1TB 使えるのはすごいなと思いました。
手順
主に以下の手順で作業しました。念のために予め Mastodon 関連のサービスを落としてから作業をしました。
- オブジェクトストレージを作成
- s3cmd の導入
- ポリシーの設定
- ローカルのファイルをアップロード
- Mastodon の設定ファイルを編集
- プロキシの設定
- SSL 証明書の発行
- サービスの起動
オブジェクトストレージを作成
Vultr の管理画面からオブジェクトストレージとバケットを作成します。このあたりはマウスをポチポチすれば終わるので割愛します。
s3cmd の導入
s3cmd はサードパーティ製の S3 クライアントです。S3 の操作に特化しているので aws-cli より使いやすいっぽいです。たぶん。
Ubuntu であればパッケージマネージャーを用いて導入することができます。
# apt install s3cmd
導入後は初期設定(?)をします。ここからしばらく一般ユーザーで作業します。
# su - mastodon
$ s3cmd --configure
いくつか質問されるので以下のように設定します。S3 Endpoint と DNS-style に書かれている hogehoge
は同一の値に置き換えます。
- Access Key と Secret Key は Vultr のページに書かれている項目をコピペ
- Default Region は何も入力しないで Enter
- S3 Endpoint は Vultr のページに書かれている
hogehoge.vultrobjects.com
- DNS-styleは
%(bucket)s.hogehoge.vultrobjects.com
ポリシーの設定
Vultr のオブジェクトストレージは初期状態では外部からアクセスできません。そのため、ポリシーを設定してアクセスできるようにします。
まず、mastodon_media-policy
というファイル名で以下のファイルを作成します。backetname
は設定したバケット名に置き換えてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::backetname/*"
}
]
}
ファイルを作成したら s3cmd でポリシーを反映させます。
$ s3cmd setpolicy mastodon-media_policy s3://backetname
ローカルのファイルをアップロード
既にアップロードされているファイルがリンク切れにならないように、アップロードします。割と時間がかかるのでケーキを食べたりお茶を飲んだりして待つのがおすすめです。
$ s3cmd sync ~/live/public/system s3://backetname
Mastodon の設定ファイルを編集
~/live/.env.production
に以下の内容を追記します。
S3_ENABLED=true
S3_BUCKET=backetname
AWS_ACCESS_KEY_ID=accesskey
AWS_SECRET_ACCESS_KEY=secretkey
S3_ENDPOINT=https://hogehoge.vultrobjects.com
S3_ALIAS_HOST=domainname
accesskey
と secretkey
は Vultr のページの項目をコピペします。backetname
と hogehoge
は前述の値に置き換えます。
完了したら root に戻ります。
$ exit
プロキシの設定
/etc/nginx/sites-available/s3
というファイル名で以下のファイルを作成します。
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name domainname;
root /var/www/html;
keepalive_timeout 30;
location = / {
index index.html;
}
location / {
try_files $uri @s3;
}
set $s3_backend 'https://hogehoge.vultrobjects.com/backetname';
location @s3 {
limit_except GET {
deny all;
}
resolver 8.8.8.8;
proxy_set_header Host hogehoge.vultrobjects.com;
proxy_set_header Connection '';
proxy_set_header Authorization '';
proxy_hide_header Set-Cookie;
proxy_hide_header 'Access-Control-Allow-Origin';
proxy_hide_header 'Access-Control-Allow-Methods';
proxy_hide_header 'Access-Control-Allow-Headers';
proxy_hide_header x-amz-id-2;
proxy_hide_header x-amz-request-id;
proxy_hide_header x-amz-meta-server-side-encryption;
proxy_hide_header x-amz-server-side-encryption;
proxy_hide_header x-amz-bucket-region;
proxy_hide_header x-amzn-requestid;
proxy_ignore_headers Set-Cookie;
proxy_pass $s3_backend$uri;
proxy_intercept_errors off;
proxy_cache CACHE;
proxy_cache_valid 200 48h;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_lock on;
expires 1y;
add_header Cache-Control public;
add_header 'Access-Control-Allow-Origin' '*';
add_header X-Cache-Status $upstream_cache_status;
}
}
hogehoge
と backetname
と domainname
は前述した値に置き換えてください。
ファイルの作成後にシンボリックリンクを張ります。
# ln -s /etc/nginx/sites-available/s3 /etc/nginx/sites-enabled/
SSL 証明書の発行
画像配信用の SSL 証明書を発行します。手順は Mastodon サーバーを建てたときと同様です。
# systemctl stop nginx
# certbot certonly --standalone -d domainname
# systemctl start nginx
サービスの起動
最後に、Mastodon 関連のサービスを立ち上げて作業は終了です。
# systemctl enable --now mastodon-web mastodon-sidekiq mastodon-streaming
備考
移行前に投稿した画像はリモートサーバーでは引き続きローカルを参照するそうです。そのため、移行した後もローカルの ~/live/public/system
は消さないようにする必要があります。ただし、~/live/public/system/cache
はキャッシュなので普通に消しちゃって構いません。
まとめ
たぶん合っていると思いますが、相変わらずうろ覚えで書いているので間違っていたら教えてください。ちなみに移行は2時間かかりました。おしまい。