GAミント至上主義

Web Monomaniacal Developer.

Mastodonで/public以下の静的ファイルの画像やjs等が表示されない時

GCPで動かしている自社社員用インスタンス(
https://mstdn.bizocean.co.jp
)のバージョンアップ時にはまった
nginx等を使わずrailsのサーバーで画像も返すときは、下記の環境変数を追加する必要があった。

RAILS_SERVE_STATIC_FILES "true"

railsのサーバーで画像等を返すのは重いので、ロードバランサー側でキャッシュしたほうが良さげかな

gcloudコマンドで複数の設定の切り替え

いろいろ作ってると、GCPのプロジェクトが増えてきて、切り替えとかが面倒になる。

gcloud init

を打つと、設定ファイル(configuration)が出てきて、切り替えと再認証(Switch to and re-initialize existing configuration)は出来るけど、切り替えだけの方法がわからなくて嵌ったのでメモ。


すでに使っている環境でgcloudを打つと下記のように出てくる。

% gcloud init
Welcome! This command will take you through the configuration of gcloud.

Settings from your current configuration [gae] are:
[compute]
region = asia-northeast1
zone = asia-northeast1-a
[core]
account = yu_yamazaki@example.com
disable_usage_reporting = False
project = oceanus-example

Your active configuration is: [gae]

Pick configuration to use:
 [1] Re-initialize this configuration [gae] with new settings
 [2] Create a new configuration
 [3] Switch to and re-initialize existing configuration: [default]
 [4] Switch to and re-initialize existing configuration: [sample]

新しく設定ファイルを作りたいときは[2] Create a new configurationを選択して、言われたとおりにいろいろやる。

今回はすでにある設定sampleに切り替えたいので、下記を打つと既存のものにできる。

% gcloud config configurations activate sample

コマンドが長過ぎる。

google compute engine - How to change the active configuration profile in gcloud? - Stack Overflow

面倒なのでシェルのエイリアスに追加する。私の場合はzshなので

% vim ~/.zshrc

#追加
alias gchange='gcloud config configurations activate'

#読み込み
% source ~/.zshrc

で、

gchange 設定名

で切り替えできるようになった。

最初gswitchにしたけど、長いしつづりが直感的じゃないので、gchangeにした。


現在どんな設定があるかとか、削除の方法とかは下記で出てくる

% gcloud config configurations
ERROR: (gcloud.config.configurations) too few arguments
Usage: gcloud config configurations [optional flags]
command may be activate | create | delete | describe | list

For detailed information on this command and its flags, run:
gcloud config configurations --help

Google Container Engineで自社用Mastodon立てた

いろいろと勉強になりそうなので勢いで立てた。詳細は今度記事にする。

Mastodonを構築、運用できてるってだけである程度の技術アピールになる気もするので、エンジニアがいる会社のブランディングなんかにも使えるのではないかと思った。

mstdn.bizocean.co.jp

最初ローカルの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つ使っている。

うまく説明できないので、ロードバランサー設定をキャプチャ↓

f:id:uyamazak:20170427110055p:plain

ユーザーの画像等をクラウドストレージに

下記記事を参考にそのままできた

qiita.com

/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

ロゴとか、トップの画像を変える

まだやってないけど、mastodonのレポジトリを取ってきて

app/assets/images/

内の画像を差し替えれば行けそう。


質問は下記まで。

mstdn.bizocean.co.jp