22
Mastodonインスタンス 立ててみた in Azure Aki@nekoruri 2017-05-29 #ssmjp

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

Embed Size (px)

Citation preview

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

Mastodonインスタンス立ててみた

in Azure

Aki@nekoruri2017-05-29 #ssmjp

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

Mastodon

• Twitterっぽいアレ• 高頻度で短文が更新されるマイクロブログ• 添付ファイル(画像や動画)が付いたりする• 「フォロー」に基づいた購読・通知と雑なアクセスコントロール

•分散SNS(Federated Social Web)• 「Twitterっぽいアレ」をブログ更新通知などの仕組みで分散化を実現• 割と死に体だったプロトコルも流用採用している• Rails上に教科書通りに分散システムを実装(非同期処理の多用)

•微妙な言い換え(ツイート⇒トゥート、等)

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

日本におけるMastodon

• 4月中旬に過剰とも言える流行の波

• 猫も杓子もといった流行期は脱出

• PixivのPawooやドワンゴのfriends.nicoなど、CGMサイトに対応するSNSとして一定の存在感は引き続き確保

• 分散SNSの実現可能性を十分に示した

出典:https://friends.nico/@TaiseiMiyahara/10996911

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

Mastodon用語

• インスタンス• 一つのドメインを持つMastodonシステム(例:mstdn.jp、pawoo.net)• インスタンス毎にその管理者が運用し、ポリシーを持つ• ネットワーク屋っぽく言えばAS(自律システム)

• リモートフォロー• 別のインスタンスのユーザをフォロー(購読)する

• ローカルタイムライン• 自分と同じインスタンスで発言された全ての公開トゥートのタイムライン

• 連合タイムライン• ローカルタイムライン+インスタンス内の誰かがリモートフォローする全ての公開トゥート

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

AzureにMastodonを立ててみよう

1. まず服を脱ぎますUbuntuのVMを立てます。

2. 外部からのHTTPSの接続を許可します。

3. Dockerとdocker-composeを入れます。

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

あとは神チュートリアル資料の通り

http://qiita.com/zembutsu/items/f1f1ede26102ba27fce2

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

ほい

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

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

んなわけはない

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

運用こそが本当の戦い

• スケールアウト対応• 添付ファイルがローカルファイル• DB(PostgreSQL/Redis)が同一ホスト内のコンテナ間接続

• ドメインの分離• 「添付」画像は、トゥートに直接URLとして含まれる。⇒あとからドメインの変更・分離は難しいので最初に対応すること

• バックアップとか冗長化とか• ぶっちゃけもうデータベースの面倒なんて自分で見たくない⇒マネージドDB使おう

• ぶっちゃけもうメール配信キューの面倒なんて(ry⇒マネージドSMTPサービス使おう

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

オブジェクトストレージの変更

• Mastodon自体の機能としてはAmazon S3に対応• S3互換のなにかを持ってくれば良い

• Google Cloud Storageは標準のS3互換APIでそのまま通る模様

• s3proxy• S3互換APIを提供するプロキシサーバ

• Azure BlobやOpenStack Swiftなどに保存できる

• ローカルファイルにも保存できる

⇒クラウド使わない場合もひとまずs3proxyでドメイン分離が可能

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

オブジェクトストレージの変更

• 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へのパッチは既に不要

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

データストアのマネージドサービス化

•メインのDBはPostgreSQL• いやっふう!

Azure Database for PostgreSQLプレビュー来た!

•内部のPubSubなどにRedis

• Azure Redis Cache

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

PostgreSQLの切り替え

• PortalからAzure Database for PostgreSQL構築• 接続のセキュリティとか適当に設定

•データ移行• とりあえずpg_dumpで吸ってpsqlで投入

•設定変更してdocker-composeあげ直し• docker-compose.ymlでdbを削除

• .env.productionに接続情報

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

Redisの切り替え

• Redis Cacheを構築• とりあえずテストでSSL無しで検証(時間不足)

•設定変更してdocker-composeあげ直し• docker-compose.ymlでredisを削除、.env.productionに接続設定

•注意点• Mastodon側で利用するRedisライブラリがSSL非対応「NotImplementedError (SSL not supported by hiredis driver)」

• アクセスキーに「+/」が入ると駄目• URLエンコードすればParseは通るが、デコードされずにサーバに投げられる!• ライブラリ周りの組み合わせのバグっぽい• 当たりを引けるまでアクセスキー再生成ガチャを回せば回避可能(ひどい)

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

メール配信の切り替え

• みんなだいすきSendGrid• Azureマーケットプレイス経由でも利用できるけど、今回は構造計画研究所さん経由

• 設定変更してdocker-composeあげ直し• docker-compose.ymlでmtaを削除、.env.productionに接続情報• ルート証明書ストアを適切に設定する必要がある(が、所詮通知だけと割り切って検証しない設定も可能)

• メールなのでDNS設定も• SendGridのDomain Whitelabel機能を設定⇒DNSにレコード登録• SPF/DKIMともにPASSできる

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

最終的な構成

frontend

(nginx)

streaming

(node)

web

(rails)

SendGrid

s3proxysidekiq

(worker)

PostgreSQL

(managed)

Azure Blob

Redis

(managed)

docker-compose管理

AzureCDN

画像など

Web/Streaming

外部インスタンス

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

その他の課題

•コンテナ管理

•監視

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

コンテナ管理

•コンテナ数などの管理• ウェブアプリだけでなく、非同期タスクのスループットが重要

• 負荷に応じたワーカーの制御が必要

•そもそもdocker-composeとか手で叩く時代じゃない• GKEみたいなのが欲しい

• Azure Container Serviceでそれっぽくできそう

• 結局はコンテナのスケジューリングの問題に行き着く

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

監視

• 一般的なサーバ性能メトリクス• CPU、メモリ

• Sidekiqキュー• 規模が大きくなるとここが詰まる模様• 複数のキューごとにプロセス分離など

• マネージドサービスのメトリクス• PostgreSQL• Redis

• サービス死活• ユーザの投稿内容

• 自インスタンスのユーザの投稿の違法性• Federate先のユーザから流れてきた投稿の違法性

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

まとめ

• Azureでもクラウドっぽくできマストドン• Azure Database for PostgreSQL万歳!• AWS Certificate Managerの影に隠れているけど、

Azure CDNもDigiCertのフルマネージド証明書が取得/利用可能• 手抜きしたけどLB最初から挟んだ方が良い

• もうステートレスになってるから、LB挟んで増やせばOK

•ちなみに1月からMicrosoft MVPになりました• みんな祝って!• 今後も基本はベンダーニュートラルでやっていきます。

<良いモノは良い>

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

で、誰?

• Aki (@nekoruri)

• BLEなIoTシステムのクラウド側担当

• ちょろっと執筆も• 「薄い本」も出しています

• 最近はすっかりセキュリティ教育畑に……• セキュリティ・キャンププロデューサー

• SecHack365 実施協議会委員

• ProjectDIVA Arcade LV.623

NEW!