mastodonにwasabiのオブジェクトストレージを組み込み、設定する。
以前自鯖を使用していた際にアップデートなど思い当たる節がないのにも関わらず、何故かあの見慣れた「ゾウがPCバンバンする画面」が現れた。
特に思い当たる節が本当になかったので、色々調べたら、「ストレージの容量がパンパンで、他のユーザーのデータを読み込めなくなってる」という説が浮上。以下のコマンドで調べてみる。
user@vultr:~#df -h
すると、案の定容量がパンパンだということがわかった。結構容量食うのよね…
と、いうことでMastodonのユーザ投稿ファイルをサーバ内に保存せずオブジェクトストレージにアップロードする機能を使うことに。
Misskeyの場合はオブジェクトストレージの設定をGUIのような感じで結構直感で出来るが、mastodonはできないので、そのやり方をここに記しておく。
なんでwasabi
と、言ってもオブジェクトストレージを展開しているサービスというのは沢山ある。それこそ私が自鯖を保有しているvultrもオブジェクトストレージのサービスを持っているし、国産のConohaやAWSのS3などなど…挙げたらキリがないわけだが…
その中でもwasabiを選んだ理由は
1発でwasabiは設定を成功したから&安いから
である。
そもそもWasabiはAPIがAWS S3互換のオブジェクトストレージサービスであり、何より利用料金が非常に安価であるのが特徴。GBあたりの料金だと $0.0049 per GB/月、日本円で約0.72円。2022年11月現在、円安が進んでいるが、1円かからない。とりあえずこれ選んどけば間違いないし、お財布にも優しいし、めんどくさい設定はほぼないからいいよね、ってことで。
ちなみに私が設定した際、下記のQiitaの記事を参考にしたが、如何せん記事自体の最終更新日が2019年なので、wasabiのUIなども色々変わっていた。
https://qiita.com/mecaota/items/365fa9330366e74f756a
なので、画像など諸々を2022年現在のUIに変えたバージョンってことで、1つ宜しくお願い致します。
ほな、つくりまっせ~
Bucketを作る…の前に。
bucketを作る前に、wasabiのアカウントを作ってない人はまず作る。
アカウントを作る際は「アカウントを作成」的なボタンは無い模様。「無料トライアル」をクリックしてスタートする。
アカウントを作り終え、コンソール画面を開くと、左上の「wasabi」マークに赤文字で「trial」と出ているはずだ。
無料トライアルってことで、wasabiのアカウントを作る際は、作ってから30日間はお金がかからないようだが、残念ながらトライアル枠だとオブジェクトストレージへの設定ができない。どうもトライアル枠には制限があるようだ。なので、クレジットカードを登録しないとできない。なので、左下の「billing」から支払方法を設定する。
とんだ画面で「Payment settings」のボタンから支払方法を設定。
その後、コンソール画面に戻ると、左上の赤文字の「trial」という文字が消えているはずだ。これで本登録会員ユーザーになった。ここから、本格的にオブジェクトストレージを作る。
Bucketを作る
オブジェクトストレージというのはあくまでサービスの単語であり、イメージとしては、今から作る「Bucket」という大きな箱に画像などのデータを入れていく感じ。なのでその箱を作る。右上にある「CREATE BUCKET」というボタンをクリック。
「Select Bucket Name」はBucketの名前。今回ここでは「mstdn-objectbox」としよう。
「Region」はそのサーバーの設置場所。なんか記憶ではアメリカしかなかった気がするが、気付いたらいっぱいニョキニョキ生えてた。日本に住んでるなら無難に「Tokyo」にすべきなんじゃないかな。ここではTokyoで制作する前提として見ていただきたい。
ちなみに「Tokyo」を選んだ際、その横に書いてある「ap-northeast-1」と「s3.ap-northeast-1.wasabisys.com」は後で入力するので今のうちにメモっておこう。あと選んだリージョンごとにこの2つの部分は違うので柔軟に対応する事。
Quick Setupは無視。Quick Setupは既存の既に持っているオブジェクトストレージをコピーしたりするときに使用する模様。
名前とリージョンを設定したら「NEXT」の左側にある「CREATE BUCKET」をクリック。BUCKET一覧に追加されているはずだ。
箱はできたので、その箱の詳細部分を触っていく。BUCKET名をクリックし、右側にある歯車マークをクリックする。
POLICIESタブをクリックすると、コンソール画面が出てくる。
ここに、以下のコマンドをコピペする。下記文字列をコピペする。{your-bucket-name}
の部分にはさっき設定したBUCKETの名前を入れる。
従って、「mstdn-objectbox」と設定したのであれば"Resource": "arn:aws:s3:::mstdn-objectbox/*"
となる。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::{your-bucket-name}/*"
}
]
}
その後、右下にある「SAVE」を押す。これでこのbucketの中身に誰でもアクセスできるようになる。もちろん読みに来ることしか出来ないのでご安心を。
USERを作る
箱を作り、その箱を設定も出来た。ただ、今のままだとただ箱が置いてあるだけである。箱に画像やデータを出し入れするには、その画像やデータを出し入れする権限を持つユーザーが必要だ。その為、今からそのユーザーを作る。左のメニュ―タブにある「Users」をクリックし、右上の「CREATE USER」をクリック。
UsernameはBucket名同様、テキトーに好きなものを入力。今回は「mstdn-user」としておく。そして、ここで「Type of Access」の「Programmatric(Create API Key)」にチェックを入れる。ここを忘れずに。終わったら次へ。
続いてグループの設定。1つのオブジェクトストレージしか管理しないのであればぶっちゃけ必要ないが、まぁ、万が一のために作っておく。特に意味はない。「+CREATE A GROUP」をクリックし、グループ名を好きに入力し、「SAVE」を押してグループ制作完了だ。今回は「wasabidaisuki-club」とした。ちなみに僕はワサビは特段好きってわけでもない。あ、でも寿司は必ずワサビ有りにしてる。寿司おいしいよね。
終わったらスクロールして右下の「NEXT」をクリック。
この後に出てくる「Policies」に関しては後々設定するので、何も考えずどんどん次に進み、「CREATE USER」をクリックする。
すると、「Access Key」と「Secret Key」が発行される。下に「COPY KEYS TO CLIPBOARD」という文字がある。それをクリックすると2つのキーをコピーしている状態になる。メモ帳とかにペーストして忘れないようにすること。後々Mastodon側で設定するときに使う。
特にSecret Keyに関しては、再発行が出来ない。忘れたらAPI key発行からやり直さないといけなくなるので注意。あとこの画面が出るのが数秒後なので、間違えて×ボタンを押したりしないように。
USERのPolicyの設定
とりあえずUSERを作ったが、今のままだとこのユーザーは箱の中身を見れはするが、出し入れはできない。要は箱の中を見学してる一般客状態である。ここに書き込み権限を与えて、箱の中身を操作できるようにする。
左側のメニュータブから「Policies」を選び、右側の「CREATE POLICY」をクリックする。
次の画面で、「Policy name」と「Policy Document」を設定する。真ん中の「Description」はそのPolicyの説明欄なので、必ず書かないといけないところではない。空欄でおk。
「Policy name」は自分の好きな名前に設定。今回は何も考えず「mastodon-policy」にしておく。「Policy Document」は下記の文字列をコピペ。例によって{your-bucket-name}の部分にはさっき設定したBUCKET名を入れること。
「mstdn-objectbox」と設定したのであれば、"Resource": "arn:aws:s3:::mstdn-objectbox/*"
となる。
さっきとの違いは、今回は{your-bucket-name}の部分が2ヶ所あるので注意。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::{your-bucket-name}"
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::{your-bucket-name}/*"
}
]
}
終わったら下の「CREATE POLICY」ボタンを押して保存する。これで、この権限を設定したユーザーやグループからのAPIアクセスに対してデータの書き込み・読み取り・削除権限が付与される。
では、次はこのPOLICYをグループに対して適用させる。左側のメニューから「Groups」を選び、さっきUSER制作時に作ったグループ名をクリック。私の場合は「wasabidaisuki-club」が存在するはずなので、それをクリック。
まずは使用するユーザーがしっかりグループに所属されているか確認。下にスクロールして、「Assigned Users」のタブを開いて、さっき作ったユーザーの名前が出たらおk。
その後、Policyを反映させるには、その下の「Policies」に移動し、検索欄にさっき設定したPolicyの名前を検索する。サジェストが出てくるので、途中で多分出てくる。
その後、サジェストに出てきたものをクリックしたら、右の「Assigned Policies」の部分にそのPolicy名が現れる。これで設定完了だ。そのグループにPolicyを反映させることに成功した。「SAVE」といったボタンが無いので不安になるが、大丈夫だ。
以上で、Wasabi側の設定は全て終わった。Mastodon側の設定に移動する。
Mastodon側の設定
※non-dockerを前提に解説しますので、dockerインストールの方は適宜置き換えてください。
Mastodonのサーバーにコンソールでログインしたら、mastodonのディレクトリに移動し、「.env.production」を開く。
そしたら色々書かれていると思うので、一番下に移動したうえで下記の項目を追記する。
S3_ENABLED=true
S3_BUCKET={bucket名} # 設定したバケット名
AWS_ACCESS_KEY_ID={access key} # USERで制作したAccessキー
AWS_SECRET_ACCESS_KEY={secret key} # USERで制作したSecretキー
S3_REGION=ap-northeast-1 # Tokyoの場合はこのままコピペ。
S3_PROTOCOL=https
S3_HOSTNAME=s3.ap-northeast-1.wasabisys.com # Tokyoの場合はこのままコピペ。
S3_ENDPOINT=https://s3.ap-northeast-1.wasabisys.com # Tokyoの場合はこのままコピペ。
書き換えが終わったら、systemctl restart mastodon-*
でmastodonのサービスを全て再起動させる。すると次回起動時からmastodonのメディアは全てwasabiに保存される。一度テキトーに画像ファイルなどをアップロードして、ちゃんと表示されるか確認し、表示されたら接続完了である。
Q:アイコンやヘッダー、画像投稿が全部真っ暗になり、表示できなくなった。
A.再起動後、全ての画像などのメディアはwasabiの方へ行くようになったので、既存のデータの保存場所であるローカルのストレージを読み込まなくなった。従って、アイコンなどを事前に設定していた場合は「そのデータ、wasabiにないやん!」となり、真っ暗になるという仕組みだ。もし、過去の画像投稿などがどうでもいいのであれば、改めてアイコンなどはアップロードすれば治る。
おまけ:wasabiと既存のMastodonデータを同期。
これは新規に鯖を建てて、今から利用を開始する場合は特にいらない作業である。
まず、Mastodonが動作するOSに、aws-cliをインストールする。AWSやAWS互換SaaSと接続する為のコマンドツールだ。ちなみにこれ、python製なので、python(3系でOK)を導入した上で、python3-pipをインストールする。
OSはUbuntu上で動作している(パッケージマネージャがaptの場合)前提で解説する。
$ sudo apt install python3
$ sudo apt install python3-pip
pythonとpip導入後、pipでawscliをインストール
$ pip3 install awscli
その後、AWS CLIの設定をしたいので、以下のコマンドを叩く
$ aws configure
AWS CLIの設定画面が開いたら、wasabiで発行したAccess keyとSecret keyをそれぞれAccess Key ID
, Secret Access Key
で入力。Default Regionはwasabiのbucket一覧にかかれているRegionの項目を入れる。今回の場合だとTokyoなので、ap-northeast-1
となる。。Default output format
の部分は無視。
設定が終わったら、その設定を同期し、有効化する。
Mastodonのディレクトリに移動して、public/system
以下に入っているファイルを全て転送する。今回の場合は、{bucket名}
にはmstdn-objectbox
が入る。なお、選択したリージョンによってendpointが異なるので、注意。
今回の場合はTokyoなので、以下のようになる。
$ aws s3 sync public/system s3://{bucket名}/ --endpoint-url=https://s3.ap-northeast-1.wasabisys.com
これでMastodonの既存メディアフォルダと、wasabiとの同期がスタートする。
まとめ
多分探せばもっと安いし簡単なやり方があると思うが、wasabiは結構他の鯖缶の人も愛用しているイメージが勝手にあるので、いいかなぁと思った。結構オブジェクトストレージ設定の記事って、あんまり無いのよね。探したけど。海外ニキの記事とかもありますが、一番これがシンプルで分かりやすかったかなぁと思いました。
説明がバカほどへたくそなんで、分かりづらかったりしたらコメントくださいまし。