いろいろと勉強になりそうなので勢いで立てた。詳細は今度記事にする。
Mastodonを構築、運用できてるってだけである程度の技術アピールになる気もするので、エンジニアがいる会社のブランディングなんかにも使えるのではないかと思った。
最初ローカルのDocker環境で動かすのはdocker-composeを使って半日もかからなかったけど、公開ドメインがないとリモートフォローができないので必要になった。
いろいろとクラウド化周りで1日半ぐらいかかってしまった。
アカウントはこれ
uyamazak - Mastodon@bizocean.co.jp
ざっくり構成としては
- Google Container Engine
- HTTPS LoadBalancer + Let's Encryptの証明書
- Cloud Storage(画像ファイルとか)
- Cloud SQL (ベータのPostgres)
最初マシンタイプをケチったらPODが立ち上がらなくなったので、スタンダード2台も使ってしまっている。
Cloud SQLも最低が4GBのマシンだったからオーバースペック気味。
月5000円くらいか。
いくつかトピックを。
登録できるメールアドレスを制限する
違法画像がとか、いろいろと不安もあるので、自社社員専用に会社のメールアドレスがないと登録できないようにする。
EMAIL_DOMAIN_WHITELIST
で指定できる。"bizocean.co.jp"を指定した。
EMAIL_DOMAIN_BLACKLIST
もある。
ソースコード上はここ
https://github.com/tootsuite/mastodon/blob/master/config/initializers/blacklists.rb
ストリーミングを同ドメインに
ストリーミング用サーバーを別ドメインにしているところが多いけど、ドメインが別だと証明書が面倒なので、ロードバランサーでパス指定でバックエンドサービスの切り替えをして、同じドメインで動くようにしてある。
ただバックエンドごとにポートを変えるにはノードプールも分ける必要があったので、ノードプールを2つ使っている。
うまく説明できないので、ロードバランサー設定をキャプチャ↓
/mastodon/public/assetsと/mastodon/public/systemをちゃんとマウントしておかないとロゴとかの画像が表示されない
これでしばらくハマった。
上記の設定で画像はクラウドストレージにできたと思ってたら、サイトのシステムで使う画像は別だった。
2つを永続ディスクでマウントして、bundle exec rails assets:precompileを実行、さらにコンテナ再起動が必須なもよう。
cronの設定
認証の更新なんかで1日1回必要なコマンドがある。
現在、KubernetesのCronJobで出来ないか調べてる。
操作は基本Cloud Shell
主にkubectlとか。
なんとかなる。
社内サーバーは他プロジェクトで使ってるので、いろいろと切り替えが面倒だった。
ただ、Cloud Shellを実行しているコンテナが裏で変更されているのか、頻繁にgcloud周りの認証が切れてしまうので下記のようなshスクリプトを置いて、すぐ実行できるようにした。
gcloud config set compute/zone asia-northeast1-b gcloud config set container/cluster bizocean-mstdn gcloud container clusters get-credentials bizocean-mstdn
Cloud SQLへの接続はプロキシで
Google Container Engine から接続する | Cloud SQL ドキュメント | Google Cloud Platform
ちょっと面倒だけど、セキュリティ上IPで接続せずにこうした方がいいらしい。
一つのDeployment上に複数コンテナを動かしたり、KubernetesのSecurityを使うのが始めてだったので勉強になった。
上の説明だと設定ファイルの全体が出てこないけど、下記レポジトリに入ってた。
container-engine-samples/cloudsql at master · GoogleCloudPlatform/container-engine-samples · GitHub