Mastodonインスタンス立ててみた
in Azure
Aki@nekoruri2017-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
s3proxysidekiq
(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!