この記事は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のサーバーを再起動、キャッシュのクリアなどをしてちゃんとファイルが表示されたら完了です。
最後に
初めてこういう記事を書いたので、読みづらいところがあったりすると思います。
この記事を読んで誰かの助けになれたら良いな、と思っています。
読んでくださりありがとうございました。