この記事はMisskey (2) Advent Calender 2023の掲載記事です。
始めに
おはこんばんにちは、「Misskey.art」を運営している c30 です。
今回は「Misskey の files フォルダーをオブジェクトストレージに移行した」という話題で記事を書いていこうと思います。
※例として、ここではCloudflare R2を使用します。
※オブジェクトストレージを勧める前提で記事を書いています。
※Misskey v2023.11.1
を使用しているため情報が不十分な場合があります。
どうしてこの記事を作ろうと思ったのか
Misskey.art のファイルをオブジェクトストレージに移行してるときに思いついたからです。
本題
Misskey のサーバーを運営している人なら一度は経験をしているのではないでしようか、サーバーを建てたときにオプジェクトストレージの存在を知らすに建ててしまったこと。
...え、無い?
私はありますよ、えぇ、オプジェクトストレージの存在知らなかったんですもの。
容量がカツカツになり始めたときに存在を知ったので...
必要な物
- オブジェクトストレージ(サービスは S3 が対応していれば多分なんでも良いです)
- rclone - 元々のファイルをオブジェクトストレージに移動するときに使います
- 事前にオブジェクトストレージに変更した Misskey サーバー
Cloudflare R2 の準備
これは、常に使用している人はスキップしても大丈夫です。
バケツを用意する
-
Cloudflareにアクセスし、
R2
をクリックします。 -
初めて使用する場合、クレジットカードまたは PayPal の登録が必要になります。
支払い情報を入力して
Add R2 subscription to my account
をクリックします。 -
Create Bucket
をクリックします。 -
Bucket name
に任意の名前を入力し、Create Bucket
をクリックします。 -
バケツが鉄 8 個で作れました。
バケツを自分のドメインに紐付ける
Settings
に移動します。Connect Domain
をクリックします。Domain
にfiles.<ドメイン>
を入力し、Continue
をクリックします。(Cloudflare に DNS を設定していないと、ドメインは使用できません。)Connect domain
をクリックします。
オブジェクトストレージの Access Key ID と Secret Access Key を取得する
- Cloudflareにアクセスし、
R2
をクリックします。 Manage R2 API Tokens
をクリックします。Create API token
をクリックします。Token name
に任意の名前を入力します。Permissions
はObject Read & Write: Allows the ability to read, write, and list objects in specific buckets.
を選択します。Specify bucket(s)
は、Apply to specific buckets only
に選択し、対象の Misskey の bucket を選択します。Create API token
をクリックします。R2 Token was successfully created
と出たら、Use the following credentials for S3 clients:
のAccess Key ID
とSecret Access Key
をコピーし、メモしておきます。Finish
をクリックし、作業は完了です。
Misskey にバケツを設定する
これも、常に設定している人はスキップしても大丈夫です。
-
運営している Misskey のサーバーにアクセスし、
コントロールパネル
をクリックします。 -
オブジェクトストレージ
をクリックします。 -
オブジェクトストレージを使用する
をオンにします。Base URL
に設定したドメイン +/files
を書きます。Bucket
に設定したバケットの名前を設定します。Prefix
にfiles
を入力します。Endpoint
に<R2ページのAccount ID>.r2.cloudflarestorage.com
を入力します。Region
にus-east-1
を入力します。Access key
にオブジェクトストレージのAccess Key IDとSecret Access Keyを取得する
で取得したAccess Key ID
をペーストします。Secret key
にオブジェクトストレージのAccess Key IDとSecret Access Keyを取得する
で取得したSecret Access Key
をペーストします。下にあるスイッチをすべてオンにします。
-
保存
を押し、画像をアップロードして出来たら完了です。
rclone でファイルをオブジェクトストレージにアップロードする
オブジェクトストレージにファイルをアップロードするために rclone のセットアップをします。
実際に設定する際は使用する各サービスの画面と見比べていい感じに読み替えてください。おそらくどのサービスも基本は似たようなことが書いてあると思います。
rclone のインストール
Linux の場合、こちらのコマンドでインストールが可能です。
sudo -v ; curl https://rclone.org/install.sh | sudo bash
rclone を設定する
インストールが出来たら、rclone config
で設定をします。
- 新しく追加するため、
n
を選択します。 name>
にリモートにつけたい名前を書きます。Storage>
に5
と入力します。provider>
に6
と入力します。env_auth>
に1
と入力します。access_key_id>
にオブジェクトストレージのAccess Key IDとSecret Access Keyを取得する
で取得したAccess Key ID
をペーストします。secret_access_key>
にオブジェクトストレージのAccess Key IDとSecret Access Keyを取得する
で取得したSecret Access Key
をペーストします。region>
に1
と入力します。endpoint>
に<R2ページのAccount ID>.r2.cloudflarestorage.com
を入力します。Edit advanced config?
と聞かれるのでn
を入力します。Keep this "remote" remote?
と聞かれるので、設定を間違えてないか確認し、y
を入力します。q
を入力し、rclone config
から抜けます。
rclone でオブジェクトストレージにファイルをアップロードする
sudo su - misskey;
cd misskey;
rclone copy --metadata --progress files/ <rcloneを設定するで決めた名前>:<bucketの名前>/files; # /filesをつけてるのは、移行する際に分かりやすくするためです。
次の作業に移る前に、データベースのバックアップを忘れずに
sudo su - postgres;
pg_dumpall -f backup.sql; # バックアップ用コマンド
psql -f backup.sql; # バックアップ復旧用コマンド
頭を脳筋にして sql 文を postgresql に叩きまくる
これはデータベースをまさぐって使用したコードです。
update emoji set "originalUrl" = replace("originalUrl", '<変更前のURL>', '<変更後のURL>');
update emoji set "publicUrl" = replace("publicUrl", '<変更前のURL>', '<変更後のURL>');
update drive_file set "thumbnailUrl" = replace("thumbnailUrl", '<変更前のURL>', '<変更後のURL>');
update drive_file set url = replace(url, '<変更前のURL>', '<変更後のURL>');
update "user" set "avatarUrl" = replace("avatarUrl", '<変更前のURL>', '<変更後のURL>'); --ここはURLの変換が違うので注意
update "user" set "bannerUrl" = replace("bannerUrl", '<変更前のURL>', '<変更後のURL>');
update role set "iconUrl" = replace("iconUrl", '<変更前のURL>', '<変更後のURL>');
update announcement set "imageUrl" = replace("imageUrl", '<変更前のURL>', '<変更後のURL>');
update avatar_decoration set url = replace(url, '<変更前のURL>', '<変更後のURL>');
解説
<変更前のURL>
はhttps://<サーバーのURL>/files/
になります。
<変更後のURL>
はhttps://files.<サーバーのURL>/files/
になります。
ここで注意なのが、avatarUrl
だけ URL エンコードされたものになっています。
<変更前のURL>
はhttps%3A%2F%2F<サーバーのURL>%2Ffiles%2F
になります。
<変更後のURL>
はhttps%3A%2F%2Ffiles.<サーバーのURL>%2Ffiles%2F
になります。
置き換えた後に、データベースの変更作業に移ります。
sudo su - postgres;
psql;
\c misskey;
# <URL置き換え後のsql文を書いていく>
\q
これで Misskey のサーバーを再起動、キャッシュのクリアなどをしてちゃんとファイルが表示されたら完了です。
最後に
初めてこういう記事を書いたので、読みづらいところがあったりすると思います。
この記事を読んで誰かの助けになれたら良いな、と思っています。
読んでくださりありがとうございました。