Mastodonインスタンス
立ててみた
in Azure
Aki@nekoruri
2017-05-29 #ssmjp
Mastodon
• Twitterっぽいアレ
• 高頻度で短文が更新されるマイクロブログ
• 添付ファイル(画像や動画)が付いたりする
• 「フォロー」に基づいた購読・通知と雑なアクセスコントロール
• 分散SNS(Federated Social Web)
• 「Twitterっぽいアレ」をブログ更新通知などの仕組みで分散化を実現
• 割と死に体だったプロトコルも流用採用している
• Rails上に教科書通りに分散システムを実装(非同期処理の多用)
• 微妙な言い換え(ツイート⇒トゥート、等)
日本におけるMastodon
• 4月中旬に過剰とも言える流行の波
• 猫も杓子もといった流行期は脱出
• PixivのPawooやドワンゴのfriends.nico
など、CGMサイトに対応するSNSとして
一定の存在感は引き続き確保
• 分散SNSの実現可能性を十分に示した
出典:https://friends.nico/@TaiseiMiyahara/10996911
Mastodon用語
• インスタンス
• 一つのドメインを持つMastodonシステム(例:mstdn.jp、pawoo.net)
• インスタンス毎にその管理者が運用し、ポリシーを持つ
• ネットワーク屋っぽく言えばAS(自律システム)
• リモートフォロー
• 別のインスタンスのユーザをフォロー(購読)する
• ローカルタイムライン
• 自分と同じインスタンスで発言された全ての公開トゥートのタイムライン
• 連合タイムライン
• ローカルタイムライン
+インスタンス内の誰かがリモートフォローする全ての公開トゥート
AzureにMastodonを立ててみよう
1. まず服を脱ぎます
UbuntuのVMを立てます。
2. 外部からのHTTPSの接続を許可します。
3. Dockerとdocker-composeを入れます。
あとは神チュートリアル資料の通り
http://qiita.com/zembutsu/items/f1f1ede26102ba27fce2
ほい
完
んなわけはない
運用こそが本当の戦い
• スケールアウト対応
• 添付ファイルがローカルファイル
• DB(PostgreSQL/Redis)が同一ホスト内のコンテナ間接続
• ドメインの分離
• 「添付」画像は、トゥートに直接URLとして含まれる。
⇒ あとからドメインの変更・分離は難しいので最初に対応すること
• バックアップとか冗長化とか
• ぶっちゃけもうデータベースの面倒なんて自分で見たくない
⇒ マネージドDB使おう
• ぶっちゃけもうメール配信キューの面倒なんて(ry
⇒ マネージドSMTPサービス使おう
オブジェクトストレージの変更
• Mastodon自体の機能としてはAmazon S3に対応
• S3互換のなにかを持ってくれば良い
• Google Cloud Storageは標準のS3互換APIでそのまま通る模様
• s3proxy
• S3互換APIを提供するプロキシサーバ
• Azure BlobやOpenStack Swiftなどに保存できる
• ローカルファイルにも保存できる
⇒ クラウド使わない場合もひとまずs3proxyでドメイン分離が可能
オブジェクトストレージの変更
• Azure BlobがカスタムドメインのHTTPSができない
• とりあえずCDNを挟んで回避
• Azure CDN from Verizonなら無償でHTTPS証明書取れます
• 解説記事の通りにやれば良い
• http://blog.tmyt.jp/entry/2017/04/19/202922
『今話題のMastodonインスタンスを建ててS3の代わりに
Azure Blob Storageを使う』
• paperclip.rb へのパッチは既に不要
データストアのマネージドサービス化
• メインのDBはPostgreSQL
• いやっふう!
Azure Database for PostgreSQLプレビュー来た!
• 内部のPubSubなどにRedis
• Azure Redis Cache
PostgreSQLの切り替え
• PortalからAzure Database for PostgreSQL構築
• 接続のセキュリティとか適当に設定
• データ移行
• とりあえずpg_dumpで吸ってpsqlで投入
• 設定変更してdocker-composeあげ直し
• docker-compose.ymlでdbを削除
• .env.productionに接続情報
Redisの切り替え
• Redis Cacheを構築
• とりあえずテストでSSL無しで検証(時間不足)
• 設定変更してdocker-composeあげ直し
• docker-compose.ymlでredisを削除、.env.productionに接続設定
• 注意点
• Mastodon側で利用するRedisライブラリがSSL非対応
「NotImplementedError (SSL not supported by hiredis driver)」
• アクセスキーに「+/」が入ると駄目
• URLエンコードすればParseは通るが、デコードされずにサーバに投げられる!
• ライブラリ周りの組み合わせのバグっぽい
• 当たりを引けるまでアクセスキー再生成ガチャを回せば回避可能(ひどい)
メール配信の切り替え
• みんなだいすきSendGrid
• Azureマーケットプレイス経由でも利用できるけど、
今回は構造計画研究所さん経由
• 設定変更してdocker-composeあげ直し
• docker-compose.ymlでmtaを削除、.env.productionに接続情報
• ルート証明書ストアを適切に設定する必要がある
(が、所詮通知だけと割り切って検証しない設定も可能)
• メールなのでDNS設定も
• SendGridのDomain Whitelabel機能を設定⇒DNSにレコード登録
• SPF/DKIMともにPASSできる
最終的な構成
frontend
(nginx)
streaming
(node)
web
(rails)
SendGrid
s3proxy
sidekiq
(worker)
PostgreSQL
(managed)
Azure Blob
Redis
(managed)
docker-compose管理
AzureCDN
画像など
Web/Streaming
外部
インスタンス
その他の課題
• コンテナ管理
• 監視
コンテナ管理
• コンテナ数などの管理
• ウェブアプリだけでなく、非同期タスクのスループットが重要
• 負荷に応じたワーカーの制御が必要
• そもそもdocker-composeとか手で叩く時代じゃない
• GKEみたいなのが欲しい
• Azure Container Serviceでそれっぽくできそう
• 結局はコンテナのスケジューリングの問題に行き着く
監視
• 一般的なサーバ性能メトリクス
• CPU、メモリ
• Sidekiqキュー
• 規模が大きくなるとここが詰まる模様
• 複数のキューごとにプロセス分離など
• マネージドサービスのメトリクス
• PostgreSQL
• Redis
• サービス死活
• ユーザの投稿内容
• 自インスタンスのユーザの投稿の違法性
• Federate先のユーザから流れてきた投稿の違法性
まとめ
• Azureでもクラウドっぽくできマストドン
• Azure Database for PostgreSQL万歳!
• AWS Certificate Managerの影に隠れているけど、
Azure CDNもDigiCertのフルマネージド証明書が取得/利用可能
• 手抜きしたけどLB最初から挟んだ方が良い
• もうステートレスになってるから、LB挟んで増やせばOK
• ちなみに1月からMicrosoft MVPになりました
• みんな祝って!
• 今後も基本はベンダーニュートラルでやっていきます。
<良 い モ ノ は 良 い>
で、誰?
• Aki (@nekoruri)
• BLEなIoTシステムの
クラウド側担当
• ちょろっと執筆も
• 「薄い本」も出しています
• 最近はすっかり
セキュリティ教育畑に……
• セキュリティ・キャンプ
プロデューサー
• SecHack365 実施協議会委員
• ProjectDIVA Arcade LV.623
NEW!

Mastdonインスタンス立ててみた in Azure #ssmjp