小規模Mastodonインスタンスを運用するコツ

補足:ドキュメント移行によりリンク変更と、tasksに関しての追記を行いました。

最近は、twitterクローンであり分散型のSNSであるMastodonが勢力を伸ばしてきているところであり、自分もハマりつつあります。

実際に運用してみてわかった、大規模Mastodonインスタンスを運用するコツとしてpixiv.netが運営しているサーバpawoo.netでは、現時点で6万人以上のユーザ数を誇るほどの規模です。

その一方で、サーバ自体はオープンソースのため、誰でも立てることができ、立てたサーバはインスタンスとして他のサーバとつながることが出来ます。

実際に私も2,3日程運用して、おひとりさまで運用しております。その時のコツというレベルでもないですが、
これから構築する人に向けてはまりそうな点などをまとめておきます。

https://mastodon.potproject.net/@potpro

では、大規模に対してここでいう小規模とは何か、というと
・主に使用ユーザは1~100人程度を想定
・気軽に構築するため、公式のDockerを使用して構築
・SSLは無料のもの(Let’s Encrypt)を使用する
・サーバはVPS、月1000円~2000円程度
そして、
・ちょっとくらいのダウンは問題なし、データは出来るだけふっ飛ばさないようにする

とします。

VPSとコストに関して

基本的に小規模で運用している方々を見るに、

さくらVPSの1GB(972円/月)やAmazon EC2(従量課金、無料枠あり)が多いと思います。

私はコスパ重視で、お名前.com VPS メモリ 2GBプラン(1,099円/月、年払い)を使用しています。

メモリ2GBと仮想3コアあれば一人でロードアベレージは通常時0.1以下です。1-10人程度であればメモリ1GB以上の好きなVPSを選べばいいと思います。

自宅で管理したいなら、自宅鯖を構築するのも手ですが、固定IPアドレスの問題や安定稼働(停電で使えなくなるとか)を考えなくてはならないため、

その点ではVPSの方が優れているでしょう。

このレベルでどのくらい運用できるのかはまあやっぱり実際に試してみないとわかりませんが、100ユーザくらいなら多分大丈夫(と思いたい。

この部分に関しては公式ドキュメントのResources-needed.mdが参考になります。まだ3つしか参考がありませんが、多分増えていくと思います。
https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Resources-needed.md

この記事はあくまで小規模が目的のため、ユーザ1000くらいを目指すなら、
脱Docker、PostgreSQLやRedisの別サーバー管理、Sidekiq threadsの増加、nginxのチューニング、ロードバランスなどが必要になってきますので、
その部分は他の誰かが解説してくれることでしょう。

Dockerコンテナの作成と構築

基本的に、公式DocumentのDocker Guideを読んで作成してください。
更新が激しいので、ここでは構築方法は解説しません。
何故なら構築方法が変更され、この記事の情報が古くなる可能性が高いからです。

自分がハマった点は、必ず公開用に立てるのであれば、タグ付きのリリース版を使用してください。
https://github.com/tootsuite/mastodon/releases
単純にgit cloneをしてクローンした最新のmasterブランチはうまく動作しない可能性が高いです。
タグ付きのreleaseブランチは、このようなコマンドでチェックアウトできます。

git clone https://github.com/tootsuite/mastodon.git
cd mastodon
git checkout $(git tag | tail -n 1)

アップデート

アップデートも余計なことはせず、公式ドキュメントのDocker Guide – updatingを見て行ってください。
公式DocumentにあるThings to look out for when upgrading Mastodon(Mastodonをアップデートするときの注意点)に記載されていることも重要なので参考にしましょう。
ミスったらデータ消えたり上手く動かなくなるのでここは慎重に。
https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Production-guide.md#things-to-look-out-for-when-upgrading-mastodon

このアップデート手順通りに行えば、すぐに新しくコンテナが立ち上がることでダウンタイムも数秒で済みますし、
まず失敗することはないと思われます。

しかし、万が一の時を含め、バックアップとデータ永続化は行っておきましょう。

データ永続化

一部のデータをホストOS側にマウントすることで、コンテナを誤って削除してもデータが保持される状態にします。
docker-compose.ymlの最初のコメントアウト部分を外すことで、ホストOS側のディレクトリに保存されます。
左側がホストOSのパスとなっているので、変更すれば好きな部分におけます。

version: '2'
services:

  db:
    restart: always
    image: postgres:alpine
### Uncomment to enable DB persistance
    volumes:
      - ./postgres:/var/lib/postgresql/data

  redis:
    restart: always
    image: redis:alpine
### Uncomment to enable REDIS persistance
    volumes:
      - ./redis:/data
(略)

この作業を忘れたまま本番稼働させてしまった場合は、次で紹介するdocker cpコマンドでバックアップを取り、
バックアップをマウントするディレクトリと同じ場所に置き、アップデートを行ってください。

バックアップ

小規模といえど、データのバックアップは行いたいです。

#データベース
PostgreSQLコンテナ : /var/lib/postgresql/data
#キャッシュデータ
Redisコンテナ : /data
#取得した画像等のデータ
Mastodon-webコンテナ :  /mastodon/public/system
#sidekiqデータ
sidekiqコンテナ :  /mastodon/public/system

この4つが基本的なバックアップ対象のデータです。
一番重要なのはデータベースですが、
現バージョンでは、取得した画像等のデータも一度紛失すると再取得を行ってくれず、
タイムラインに取得済みのアバター画像が何も表示されない悲しい状態に陥ってしまいます。

Dockerの場合、Docker cpコマンドを使用することでDockerコンテナからホストOSにコピーが出来ます。
例として、

docker cp mastodon_db_1:/var/lib/postgresql/data /mastodon_data/postgresql

という形です。
mastodon_dataディレクトリにpostgresqlデータが入っていることが確認できると思います。

その他、構築時に使用した.env.productionファイルも無くした場合は再構築が簡単ではなくなるため、バックアップしておいてください。
無くしてしまった場合は、稼働しているMastodon-webサーバから
docker exec -it mastodon_web_1 env
から取得することは一応可能です。

SSL対応

Mastodonサーバでは、SSLの対応はほぼ必須です。

一応httpでも動作しますが、httpとhttpsは共存できないため、httpsのサーバからリモートフォローすることが出来ない、などの弊害があるようです。

今ではLet’s encryptなどを使用してSSL対応は簡単にできるので、個人でも敷居はかなり下がっていると思います。

公式のProduction Guideでは、nginxをリバースプロキシにして、動作することが推奨されています。
公式のProduction Guideをメインに、SSLの設定は自分の過去の記事あたりにその辺は結構書いているので、よければ参考にしてください。

Centos+nginxでLet’s encrypt(certbot)導入と自動更新まで

証明書は期限が切れると使えなくなり、アクセスしてもエラーが出て正常に使えないため、Let’s Encryptを使う場合は自動更新の設定を行うこともおすすめします。

また、公式ではssl_protocols TLSv1.2;になっているため、ちょっと古いブラウザなどで使用できない可能性もあります。
使うべきではないとされているSSLv3を除いて、広く対応を行いたければ、ssl_protocols TLSv1 TLSv1.1 TLSv1.2;に変更することをお勧めします。

Cronjobs

運用するにつれ、他のインスタンスからデータを持ってきて表示するため、放置しているとデータはどんどん溜まっていきます。
それを解消するため、公式で要らないデータ等を削除できるRakeタスクが用意されています。
※特にmastodon:dailyタスクにはPuSHの購読更新処理が含まれるため、外部インスタンスから自分のトゥートが見えなくなる可能性があります。
自分も更新しなくても大丈夫だと思っていたのですが、mastodon:dailyに関しては必ず1日に1回は動かしてください(多くてもOK)。

https://github.com/tootsuite/mastodon/blob/master/lib/tasks/mastodon.rake

#いらないやつもろもろを消してくれるタスク(日一で動作)
0 3 * * * cd /var/www/mastodon && docker-compose run --rm web rake mastodon:daily
#1週間以上前の画像動画キャッシュを削除(週一で動作)
0 3 * * 1 cd /var/www/mastodon && docker-compose run --rm web rake mastodon:media:remove_remote

自分はこのようにしてcrontabで動作させています。

swapの設定

Mastodonに限らないことですがメモリが少なくなっても賄えるようにswapを設定しましょう。
swapがあれば仮想メモリとして退避することができ、遅くはなりますが少ないメモリでもリソースが確保できます。
Mastodonは1ユーザでもそこそこメモリを食います。最低でも1GB、よくて2GBはほしいところです。

特に上に書いているmastodon:dailyタスクは、動作するだけでかなりのメモリを食います。自分もメモリ不足ギリギリ回避な感じでした。

メモリ1GBの場合は3GB、2GBの場合はswapは2GB確保と合計4GBは確保しておけばととりあえず大丈夫と思います。
(Linuxディストリビューションでコマンドが違ったりします。これはcentos7の参考例です。)

//2GB確保、当然ストレージに2GB空きが無いと作れません
if=/dev/zero of=/swapfile bs=1M count=2048
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

まとめ

Mastodonを個人で運用するメリットとして、
・データを勝手に改ざんされたり削除される心配はない
・逆に自分の好きなようにデータを弄れる
・おひとり様サーバならサーバ負担に悩まされることもない(htmlのレスポンスは100ms以下!)
・SNSを運用してるって、なんかカッコいいじゃん。自分だけの空間にするもよし、鯖管で皆を導くのもよし。

という点があり、自分もかなり満足して使っています。

私は個人的にMastodonで個人鯖を立てる人を応援しております。もっとたくさん増えて、個人鯖連合を作ろう。

Splatoon勝敗手動記録サイト「イカステート」作りました。

ika1

勝敗手動記録サイト イカステート


http://blog.potproject.net/ikastate/

最近ずっと、WiiUのゲームであるSplatoonにハマりすぎていて、夜の間はずっとガチマッチに潜ってます。
おかげさまで、昼夜逆転してしまい、朝を迎えることが割と普通という不味い状態になってます。

splatoon、面白いのですが、他のシューターにあるような情報管理表示サイトのようなものがなく、ゲーム内でも表示できないです。
これは、つまりはキル数だけを求める人を排除するためにわざと無い気がします。

経緯としては、
勝率表示できるようなサイト公式で出ないのかなー・・・とずっと考えており、
やっとフレンド交流サイト「イカリング」というものが出来たのですが、こっちのメインはフレンドとの交流で、フレンドランキング・・・

フレンドなんていねーよ!ずっと1人でガチマッチやってるよ!

ということで、(自分にとっては)全く持って使い道ないし、公式も作る気ないっぽいので勝率管理サイトを自分で作ることにしました。

見たとおり、武器とルールとステージを選び、買ったら「勝利」ボタン、負けたら「敗北」ボタンを押すだけの簡単なお仕事です。
これで勝率を自動算出し、ルール別・武器別・ステージ別の情報を表示できます。
本日と累計、二パターン表示できます。
なお、Userstreamを使用しているので、サイトを閉じても保存されます。
その分、ローカルに保存されるだけなんで、コミュニケーションとかランキングとか無し。
ただ記録して一喜一憂するだけだ!
そういうサイトです。

もっと細かく出せればいいなと思ったのですが、とりあえずこんなもので。
今頃のスマホとかでも動くはず。(自分のスマホは古くて動かなかったが・・・)

追記:ちゃんと古いスマホ(iOS6あたりとか)なんかでも動くようにしました。
ちゃんと調べたら問題点はNumber.isNaNを使ってたところというだけでした。
標準化されてるとはいえ新しいからこれ古いブラウザは対応してないのね。こういうところ注意しなければ。

ika2
ika3
ika4
ika5

参考として自分の記録です。なんとか勝率5割をキープしているところ。
こうやって統計取ってみるといかにノヴァブラスターとかが強いかわかるし、どこのステージが苦手かわかるなあ・・・。
自分以外に使うことがいるのであれば、もっとちゃんとした奴作ろう。

更新履歴
ver1.05
古いスマホやブラウザなんかにもちゃんと対応しました。あと新ステ新武器追加とか
ver1.15
ガチマッチ合算が表示されるようになりました。
バトル-ステージ別にでも表示できるようになりました。
ver1.20
tweetボタンで戦績をtwitterに投稿できるようになりました。広めたいならこういうのがないと。
ver1.30
週間の記録が見れるようになりました。
ver1.35
ついに念願のウデマエSになりました。・・・じゃなくて、月間の記録が見れるようになりました。デザイン変えました。
ver1.40
フェスマッチに対応(今頃)。毎日の勝率とかウデマエを表示できて成長が感じられるスケジューラーでも作ろうか悩み中。
ver1.50
要望が多かったため、ボタンを間違えた時のための取り消しボタンを実装。デザインも少し変わりました
ver.1.60
スプラトゥーンのステージ情報がとれるやつ(非公式)APIを使わせていただき、「ステージを自動取得」にチェックボックスを入れると現在のステージを取得するようになりました
ver1.70
検索機能とソート機能が追加されました。
ver1.90
最近10試合の戦績が表示されるようになりました。なんと武器アイコン付きで。
アイコンはstylecase氏のアイコン(74 INK WEAPON ICONS)をお借りしています。

redditの簡単なbotを作ってみる

海外最大手のフォーラムサイトredditにも、最近大量に日本人の人口が増えました。

redditは最大手のフォーラムサイトのくせにオープンソースであり、スパム以外のソースを全部公開しているという大盤振る舞い。

APIも公開しているので、そのAPIに対するラッパー、ソフトウェア、OAuthアプリが大量にあるのです。
なので、botを作るくらいなら簡単に出来るようです。
ここを見ても、かなりの数の言語に対応したラッパーが作られていたりします。
なんというかすごくオープンな感じです。もっと日本で流行ってほしいですな。

その中でも今回は代表的なReddit APIラッパーであるPRAWを使用して作っていきます。
PRAWはpythonで動作するreddit APIラッパーです。かなり簡単にAPIを操作してコメント・submit・subredditの取得・subredditの立ち上げ・UPVOTE/DOWNVOTEなど大体のことができます。

pythonパッケージ管理ソフトpipが導入されていればコンソールから"pip install praw"でモジュールインストール完了。簡単です。

1.subreddit注目の上位5つのタイトルとスコアを取得
japanのsubredditを取得してみる。
[python]

– coding: utf-8 –

import praw

user agentを設定します。多分何にしても問題ないです

user_agent = ("Python bots")
r = praw.Reddit(user_agent=user_agent)
subreddit = r.get_subreddit("japan")
for submission in subreddit.get_hot(limit = 5):
print "Title: ", submission.title
print "Score: ", submission.score

[/python]

結果:

C:\>python C:\Python27\test.py
Title:  European products not available in Japan (for a present)?
Score:  13
Title:  For non-language teachers, how did you end up in Japan, and what do you
do for a living?
Score:  8
Title:  Prime Minister Shinzo Abe says Japan will provide 4 billion dollars in a
id for global efforts to promote disaster management over the next 4 years.
Score:  6
Title:  Japan budgets over $15 million for overseas universities in soft power p
ush
Score:  44
Title:  Extended Hokuriku shinkansen line goes into service
Score:  7

これだけで取得できます。非常に簡単です。

2.submit(テキストポストの投稿)を行う
実際に投稿も簡単にできます。投稿にはアカウント必須です。
しかし、redditは投稿数やカルマで監視してbotかどうかを判断されるため、作り立てで投稿もしていないアカウントだとほぼcapture認証を食らいます。
[python]

– coding: utf-8 –

import praw
user_agent = ("Python bots")
r = praw.Reddit(user_agent=user_agent)
r.login(‘username’, ‘password’) #ユーザー名とパスワードを入力
r.submit(‘投稿したいsubreddit’, ‘タイトル’, text="本文")
[/python]
こんな感じです。こちらも簡単。
ユーザー名パスワードをそのまま書くのはどうよって場合は、OAuth認証も可能なようです。
cronなんかを使えば定期的な自動投稿なんかが可能となると思います。・・・が、監視しておかないとcapture認証に引っかかる気もします・・・。

Onedriveの使い道☁

Office365 Personalのアカウント1年分(Windowsタブ買ったときについてきた)が適用され、

Onedriveの使用容量が1TB使用可能となりました。(いずれは無制限となるらしいです)

OneDrive 1 TB のオンライン ストレージ サービス http://www.microsoft.com/ja-jp/office/home/onedrive/default.aspx

onedrive

 

Continue reading