MastodonでConoHaオブジェクトストレージを使ってみる

2017年4月頃、Mastodonが一瞬流行った頃から、個人用+一部友人用としてMastodonインスタンスを運用しておりますけーのです、こんにちは。

ちなみにこれ→ https://39sounds.net/ です。

Mastodonを運用しているとストレージ容量が増えていく…

基本価格が安くてデータ転送料が無料のConoHa VPSで運用していますが、デフォルトで付属しているストレージは50GBです。個人でテキトーに運用するWebサーバーとしては十分な容量で、今まで特に困ったことはありませんでした。

しかし、Mastodonの場合はメディアデータが無限に増えていきます。別のMastodonインスタンスから流れてきた画像等のメディアデータが徐々にサーバーストレージ容量を圧迫してきてヤバくなりました。

ストレージを追加することも考えましたが、追加ストレージは割と高い(200GBで2500円/月)し、通常のファイルシステム上に置いておくとストレージの使用量は実際のファイル容量の150%くらいになっているようでした。詳しくは追っていませんが、ファイルシステムのブロックサイズによる無駄やメタデータのせいですね。

『おうちにサーバーを用意してiSCSIやNFSで接続すっか』みたいな雑な発想もありましたが、今現在おうちサーバーは無いし、ローレベルなプロトコルによる接続をすると安定性や切断されてしまった時のリカバリーが面倒そうといった心配がありました。

また、おうちサーバーはなんだかんだで面倒です。ほこりかぶるので掃除したり、たまに移動したくなったり何か壊れて直す時にシャットダウンしないといけないなーとか思うともう面倒くさくなってやる気を失います。そもそも、それらをしなくていいのがVPSを借りている理由の一つだし。

オブジェクトストレージとは

AWS S3みたいなやつですね。REST APIでファイルをアップロードして保存したりダウンロードしたりできます。

オブジェクトストレージは『疎結合なシステムで画像などのメディアファイルを置いておくためのストレージとして使用すれば、スケールアウトや多重化などが容易になる』とかが利点だと思いますが、個人でも仕事でも一人で全部やっているとあまり嬉しい場面が発生しないので、実際に使ってみるまでイマイチ合点が行ってなかったです。

ConoHaオブジェクトストレージのようなサービスであれば、ブロックサイズやメタデータサイズを考慮しなくてもデータ量の分だけの料金で済みますし、バックアップは自動ですし、将来ストレージ単価が安くなることによる値下げも期待できます。便利な世の中ですね。

MastodonでConoHaオブジェクトストレージを使う

MastodonはオブジェクトストレージとしてAWS S3に対応していますが、他にもOpenStack Swiftという実装にも対応しています(v1.6.0からのようです)。ConoHaオブジェクトストレージは、OpenStack Swiftで実装されているのでそのまま使えます。pull requestを送ってくれた人に感謝しながら使います。

.env.production に以下のように設定するだけ。かんたん。値はConoHaのWebコンソール画面の API情報 のところからコピペしましょう。

# Swift (optional)
SWIFT_ENABLED=true
SWIFT_USERNAME=gncu********
SWIFT_TENANT=gnct********
SWIFT_PASSWORD=**********
SWIFT_AUTH_URL=https://identity.tyo1.conoha.io/v2.0/tokens
SWIFT_CONTAINER=39sounds  # 適当な名前に
SWIFT_OBJECT_URL=https://39sounds.net/media  # 適当なURLに

リバースプロキシの設定変更(nginx)

SWIFT_OBJECT_URL で指定しているURLをConoHaオブジェクトストレージにreverse proxyするようにしてやります。ConoHaのWebの管理コンソールから “Object Storage Service” のURLをコピペし、 SWIFT_CONTAINER で指定したコンテナ名をURLに付加してやります。

私の環境はnginxなので、以下のようになりました。

location /media/ {
    proxy_pass https://object-storage.tyo1.conoha.io/v1/nc_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/39sounds/;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    tcp_nodelay on;
}

MastodonのローカルストレージからConoHaオブジェクトストレージにデータ移行する

OpenStack Swiftを使って public/system 以下を https://39sounds.net/media 以下に持ってくるようにコピーします。

環境が Container Linux (CoreOS) だったので、適当なdocker imageを使おうと思ったんですが、なんかcronが動いたりするよくわからんimageしか見つからなかったので、以下のDockerfileから自分で作りました。あれはサーバーを含むimageなんだろうなあきっと。OpenStack使ったことないからわからん。

FROM ubuntu:xenial
MAINTAINER "Shinsuke KAWANO" <kno@2502.net>

RUN apt update && apt -y upgrade && apt clean
RUN apt -y install python-pip
RUN pip install python-swiftclient
RUN pip install python-keystoneclient # これは要らないような気もする

CMD ["/usr/local/bin/swift"]

こんな感じで動作確認します。

$ docker run -e OS_AUTH_URL='https://identity.tyo1.conoha.io/v2.0' -e OS_TENANT_NAME='gnct********' -e OS_USERNAME='gncu********' -e OS_PASSWORD='**********' swift /usr/local/bin/swift post 39sounds
$ docker run -e OS_AUTH_URL='https://identity.tyo1.conoha.io/v2.0' -e OS_TENANT_NAME='gnct********' -e OS_USERNAME='gncu********' -e OS_PASSWORD='**********' swift /usr/local/bin/swift stat 39sounds

あとは public/system 以下をコピーしていきます。実は最初、volumeをmountし忘れててなんで動かねえんだーって悩んだ。

$ for DIR in accounts preview_cards custom_emojis media_attachments; do docker run -e OS_AUTH_URL='https://identity.tyo1.conoha.io/v2.0' -e OS_TENANT_NAME='gnct********' -e OS_USERNAME='gncu********' -e OS_PASSWORD='**********' swift -v /home/core/docker/mastodon/public/system/$DIR:/$DIR swift /usr/local/bin/swift upload --object-threads 1 --changed 39sounds /$DIR > /tmp/$DIR.log; done
  • --object-threads 1 これ付けないとなんかエラーが出ました。SwiftかConoHaにバグがあるのかも知れない。
  • --changed これ付けとくと、中断した時とかにコピー済みのものを再度コピーしなくて済みます。

こうして最終的に21GBくらいのメディアファイルを移行できました。ストレージ空きを気にしなくて済むようになってしあわせ。データ移行中も画像が表示できないだけでMastodon自体は使えるので、クリティカルでない用途であればテキトーに移行できるでしょう。

同じような状況の人の参考になれば幸いです。

コメントを残す