Mastodon

輪転機を回せ

unipstの書いたものをまとめています。

お一人様 Mastodon インスタンスでメディアストレージを利用できるように移行する

この記事は あるさば交換日記 Advent Calendar 2018 の 18日目です。

adventar.org

ご挨拶

こんにちは。
お一人様Mastodonインスタンス インターネット老人ホーム「私信」の unipst と申します。
インターネットが好きです。

なんかアドカレを書いてみたいと、あるさばAdminのかず姉ちゃんに言ったら、書いていいよ!と許可を頂いたので、書きます。
(ただ、なぜかず姉さんがお姉ちゃんなのか、そんなに親しくないのにお姉ちゃんと呼んで良いのだろうか…など、気になっていますが仲良くさせて頂けると有り難いなと思っています。)

はじめに

勉強や自分の興味もあり、お一人様インスタンスをConohaに立てました。
1GB メモリ 50GB SSDのプランです。

そこから、運用することだいたい2ヶ月ぐらいたった頃、ディスクが25GB程度に達するようになりました。

f:id:unipstx:20181209201013j:plain:w640
ディスクが25GBぐらいになる。(削除前にカーソルあわせるべきでしたね)

ちょこちょこ

RAILS_ENV=production bundle exec bin/tootctl media remove

を使って、別インスタンスの画像を削除すれば20GB程度になるのですが、ちょっと目を離すと数GB増えていく…

最初の頃はすぐにインスタンスを閉じるかもしれないし、お金もないのでメディアストレージを使用せず、全部1つのディスクに突っ込んだのですが…
ここに来てちゃんとしたい気持ちになってきたため、オブジェクトストレージを利用することにしました。

ただ、いまローカルにあるファイルをオブジェクトストレージに移動させないといけません。
そこもあわせてやっていきます。

ここからは自分が行った作業メモです。
自分の環境ではそうだったのですが、環境や時期によって違うと思いますので、お気をつけください。

環境

  • Conoha 1GB メモリ プラン
  • Conoha オブジェクトストレージ
  • Ubuntu 18.04.1 LTS
  • Mastodon 2.6.4 (当時)

Dockerは使っていません。

選定

いろいろ探したのですが、結局はサーバと同じブランドのConoha オブジェクトストレージを利用することにしました。

お安くていいねっ…

作業

こちらと 2502.net こちらを
/user/karasugawa/サーバ/2018/06/03/MastodonをConoHaオブジェクトストレージへ - GROWI - KRSGW
を参考にさせていただきました。

1. まず契約

コントロールパネルにてオブジェクトストレージの契約をします。まずは100GB

2. サーバ側に オブジェクトストレージを操作するコマンドを入れる

今回は Swiftコマンドで行います。というか、S3 APIもあるんですね。いまドキュメント見返して気づきました。まあでもやることは同じなはず… support.conoha.jp

こちらを見て、pip install python-swiftclient しようとしたのですが、うまくいかなくて、探していると昔のドキュメントを見つけました。 www.conoha.jp

# yum install python-swiftclient python-backports

yum にあるならubuntuにもあるだろーと思って、探したら、ubuntu のパッケージにpython-swiftclientがあり、apt install python-swiftclient でインストールできました。便利。

Ubuntu – bionic の python-swiftclient パッケージに関する詳細

3. 下準備していく

コマンドを準備したので、早速

swift stat

したのですが、怒られるので先に認証情報を入れていきます。

# export OS_AUTH_URL='[Identity Service]'
# export OS_TENANT_NAME='gnct[xxxxxxxx]'
# export OS_USERNAME='gncu[xxxxxxxx]'
# export OS_PASSWORD='[APIユーザー作成時に設定したパスワード]'

そして、また

swift stat

すると、ステータスが表示されたかと思います。

4. オブジェクトストレージにコンテナを作成

オブジェクトを格納するための場所を作成します。
フォルダみたいだなーって感じました。

swift post [コンテナ名]

自分は、mstdn にしたので、

swift post mstdn

となりました。

このあと、

swift stat mstdn

で、"mstdn"というコンテナの詳細が出力されたかと思います。

5. ストレージにデータを転送していく

自分一人で使っているサーバなので、気軽にmastodonを停止してアップロードしていきます。

sudo systemctl stop mastodon-*

をしたあと、次のディレクトリに移動します。

cd live/public/system/

このディレクトリには

accounts
custom_emojis
media_attachments
preview_cards
site_uploads

などのディレクトリが入っているかと思います。
その状態で、

swift --os-auth-url https://identity.tyo1.conoha.io/v2.0 --os-tenant-name gnct[xxxxxxxx]  --os-username gncu[xxxxxxxx] --os-password [password] upload --object-threads 1 -c [コンテナ名] *

と、入れることでアップロードが始まります。

さて、だいたい5GB程度のファイルがあったため、だいたい4時間ちかくかかりました。
だるだるですね。

アップロードが完了しだい、

swift post -r '.r:*' [コンテナ名]

を行い、コンテナ内のオブジェクトにブラウザからアクセスできるようにします。

くわえて、先ほど挙げたフォルダ以外のファイルは必要ないので削除します。

6. Mastodon、nginxの設定を行う

  • .env.production の設定
SWIFT_ENABLED=true
SWIFT_USERNAME=gncu[xxxxxxxx]
SWIFT_TENANT=gnct[xxxxxxxx]
SWIFT_PASSWORD=[password]
SWIFT_AUTH_URL=https://identity.tyo1.conoha.io/v2.0
SWIFT_CONTAINER=mastodon
SWIFT_OBJECT_URL=https://[hogehoge.moge]/multimedia

参考にした記事を見ると、SWIFT_AUTH_URL= に関して、https://identity.tyo1.conoha.io/v2.0/tokensを指定している人がほとんどだと思うのですが、うちの場合はなぜか、https://identity.tyo1.conoha.io/v2.0を指定しないと動きませんでした。謎。
SWIFT_OBJECT_URL=はnginx 設定のlocationと合わせます。

ここで追記です。2018/12/18 01:45

が!、ここで、SWIFT_OBJECT_URLを/media/なんかにすると、Mastodonで使用されているメディアの短縮URL(?)とかぶってしまい、問題が発生するそうなので、/media/以外の文字にします。
(最初してしまっていた… 上の.env.production と 下のnginx の設定は修正しました。)

mstdn.precure.fun

precure.ml

からすがわさんありがとうございます。
これ書いてよかったー
---------- 追記ここまで ----------

  • nginx の設定
location /multimedia/ {
        proxy_pass  https://[Object Storage ServiceのURL]/[コンテナ名]/;
        proxy_buffering off;
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_set_header Host $proxy_host;
        tcp_nodelay on;
    }

を入れて、リダイレクトさせます。

ここも追記です。2018/12/18 01:45

また、

  location ~ ^/system/media_attachments/files/ {
    rewrite ^/system/(.*)$ /image/$1 redirect;
  }

などで今までのURLに対してリダイレクトさせます。
(ここも追記しました。最初やっていませんでしたね…)

また、自分の追記前のように、リバースプロキシを/media/で運用してしまった人は…

  location ~ ^/media/media_attachments/files/ {
    rewrite ^/media/(.*)$ /multimedia/$1 redirect;
  }

すると、良いそうです。
---------- 追記ここまで ----------

7. 動作を確認

画像がアップロード、表示出来るかを試します。 うまくいかなかったときは画像が表示されなかったので、すぐに気づきますね。

8. 念のため、tootctl media remove する

RAILS_ENV=production bundle exec bin/tootctl media remove

というコマンドで別インスタンスのメディアを削除できるか試します。

ローカルから削除するのと比べるとちょっと時間がかかってしまうので、気長に待ちます。

まとめ

これによって、メディアが増えてもディスクを圧迫しなくなりました。
永続的なMastodon ライフにまた一歩近づきましたね。

さて、明日の あるさば交換日記 Advent Calendar 2018 は、Zumochi_F_nico さんです。
銀だこおいしいですよね。
以上、よろしくお願いいたします。