表題のとおり、GCE上にMastodonのインスタンスを立てたけど、なんだかんだ試行錯誤で4日くらいかかったので自分のために記録を残す。
立てたインスタンスは https://activitypub.lacolaco.net。ひとり用に作ったので新規ユーザーは作成できない。 アカウントは https://activitypub.lacolaco.net/@lacolaco。mstdn.jpからのお引越し。
参考にしたのは以下のドキュメント。Googleでいろいろ調べると2017年ごろの記事が多く、いまではやらなくていい無駄やいまだとやらないといけない不足があったので苦労した
- documentation/Docker-Guide.md at master · tootsuite/documentation · GitHub
- documentation/Production-guide.md at master · tootsuite/documentation · GitHub
- Google Cloud Platform で Mastodon を立てる – WWW.YAMBAL.NET
- Mastodonとか建てたので適当にメモ
Mastodonのバージョンは v2.5.0
- 仮想マシン: Google Compute Engine
- ストレージサーバー: Google Cloud Storage
- メール送信: Mailgun
- DNS: Google Domain
- SSL証明書: Let's Encrypt
GCP準備
インスタンス作成
あんまりよく考えずにus-east1-bにg1-small、Ubuntu 16系で立てた。f1-microではセットアップするのにスワップが必要になって面倒なのでRAM 1.7GBは用意した。 スペックを上げろと案内されてるけどg1-small(vCPU x 1、メモリ 1.7 GB)で今の所動いている。 たぶんリモートフォローが増えていくともっと処理能力が必要になりそう。
ファイアウォール
HTTPとHTTPSさえ空いていれば特にファイアウォールの設定は必要なかった。 v2.5.0時点だとLOCAL_HTTPSの設定がなくなっているので、3000番ポートで接続確認するステップがない。
DNS設定
GCEインスタンスに固定の外部IPを割り当てた後、好きなDNSで好きなドメインにAレコードを設定する。
今回は activitypub.lacolaco.net
とした。
ストレージ
GCSに適当なBucketを作る。Regional
にしておく。
設定で相互運用性の設定をして、APIキーと秘密鍵を生成する。これでS3の代わりにGCSが使える。
Mailgun準備
おひとり用だとどういうプランでも普通に無料枠なので、適当に登録する。 カスタムドメインも設定して、次の状態にした。
あとでここの情報を使う。
VM内作業
インスタンスが出来上がったら、SSHでログインして作業を始める。
Docker準備
UbuntuにDockerとDocker Composeをインストールする。変に日本語記事を当てにせず、普通に公式ドキュメントを読んだほうがよかった。
Get Docker CE for Ubuntu | Docker Documentation
Docker CEをインストールしたあと、docker
コマンドをsudo以外で呼び出せるようにする。
Post-installation steps for Linux | Docker Documentation
$ docker run hello-world
が実行できればゴール
次にDocker Composeも公式ドキュメントのとおりでよい。
Install Docker Compose | Docker Documentation
nginx準備
Ubuntuにnginxをインストールする。apt-getで適当に入れる。
$ apt-get update $ apt-get upgrade $ sudo apt-get install nginx // 一旦止める $ sudo nginx -s stop // 再開 $ sudo nginx
この時点で、http://activitypub.lacolaco.net
にアクセスすればnginxのデフォルト画面に到達できるはず。
証明書準備
あらかじめnginxを停止して、80番ポートを開放する。sudo lsof -i:80
でnginxが出ないことを確認する。
$ sudo apt install letsencrypt $ sudo letsencrypt certonly
メールアドレスと activitypub.lacolaco.net
を入力してうまくいくはず。
続いて、継続的に証明書を更新するためのcron設定をする。
# これが通るかどうかをまずチェックする $ sudo letsencrypt renew --force-renewal $ sudo crontab -e
次の1行を追加する
# 毎月1日の朝5時にSSL証明書を自動更新する 00 05 01 * * sudo nginx -s stop; sudo letsencrypt renew --force-renewal; sudo nginx
これで証明書が毎月更新されるようになる
Mastodon準備
いよいよMastodonの準備。基本的に公式ガイドどおりにやるだけ。
Gitのクローン。 live
である意味は特にないんだけど、後続のいろんな設定ファイルが ~/live
前提なのでいじらなくていいようにそのままにする。
# Clone mastodon to ~/live directory git clone https://github.com/tootsuite/mastodon.git live # Change directory to ~/live cd ~/live
docker-compose.ymlの修正
まずデータの永続化を有効化する。 volumes
プロパティがコメントアウトされているのをアンコメントする。
### Uncomment to enable DB persistance volumes: - ./postgres:/var/lib/postgresql/data redis: restart: always image: redis:alpine ### Uncomment to enable REDIS persistance volumes: - ./redis:/data
Dockerイメージの準備
今回は特にMastodonをカスタマイズしたい気持ちはないのでprebuiltイメージを使った。完全に公式ガイドのとおり。
バージョンは image: tootsuite/mastodon:v2.5.0
とした。
Mastodonセットアップ
次のコマンドを実行する。
docker-compose run --rm web bundle exec rake mastodon:setup
いろいろ聞かれる。聞かれるままにそのまま進めていけば、あとで .env.production
にペーストする用の設定が出力される。
注意が必要なのは、メール送信のポート番号は587だとGCPにブロックされるので2525を使うこと。
最終的に、 .env.production
は次のようになった。redisとかパスワードかけてなくて危ない気もするけど、そもそもGCEのファイアウォールで外から見えないので今回は無視している。
GCSを使うために手で編集する必要がある部分は2017年ごろの記事には書かれていないことが多い。
# Generated with mastodon:setup on 2018-09-07 00:46:28 UTC LOCAL_DOMAIN=activitypub.lacolaco.net SINGLE_USER_MODE=true SECRET_KEY_BASE=(mastodon:setupで生成される) OTP_SECRET=(mastodon:setupで生成される) VAPID_PRIVATE_KEY=(mastodon:setupで生成される) VAPID_PUBLIC_KEY=(mastodon:setupで生成される) DB_HOST=db DB_PORT=5432 DB_NAME=postgres DB_USER=postgres DB_PASS= REDIS_HOST=redis REDIS_PORT=6379 REDIS_PASSWORD= S3_ENABLED=true S3_PROTOCOL=https S3_BUCKET=(自分で作ったGCSのBucket) S3_REGION=(自分で作ったGCSのBucketのリージョン) S3_HOSTNAME=storage.googleapis.com AWS_ACCESS_KEY_ID=(自分で作ったGCSの相互運用性APIキー) AWS_SECRET_ACCESS_KEY=(自分で作ったGCSの相互運用性秘密鍵) SMTP_SERVER=smtp.mailgun.org SMTP_PORT=2525 SMTP_LOGIN=(MailgunのDefault SMTP Login) SMTP_PASSWORD=(MailgunのDefault Password) SMTP_AUTH_METHOD=plain SMTP_OPENSSL_VERIFY_MODE=none SMTP_FROM_ADDRESS=Mastodon <notifications@activitypub.lacolaco.net> # 自動セットアップ後に手で追加する S3_ENDPOINT=https://storage.googleapis.com/ S3_SIGNATURE_VERSION=s3
ここまでできたら一旦立ち上げる。
$ docker-compose up
エラーにならなければOK。Ctrl+c
で一旦終了し、改めて $ docker-compose up -d
でデーモン実行する。
nginx設定の追加
Mastodonの公式設定にしたがってnginxの設定をおこない、3000番ポートでホストされているMastodonを外部からアクセス可能にする。
documentation/Production-guide.md at master · tootsuite/documentation · GitHub
以上で https://activitypub.lacolaco.net
が docker-compose up -d
で動くMastodonに接続された。
ざっくりと構成図はこういう感じだと思う
苦しんだところ
- 外部IPがエフェメラルになっていることに気づくのに時間がかかって、全然nginxが確認できなくてつらかった
- 上記理由でLet's Encrypt失敗しまくるとレートリミットに引っかかった。最初は
--staging
オプションをつけるとレートリミットがゆるくなるので実験しやすい S3_ENDPOINT
とS3_SIGNATURE_VERSION
に気づくのに時間がかかった。Mastodon自体は立ち上がるけどアイコン画像アップロードしようとしたら死ぬので気づくのが遅れた- アセットのプリコンパイルは長い
改善できそうなところ
- StackDriverと繋いでみたのでモニタリングとアラートとかやってみたい
- 1ヶ月どれくらいのコストになるかわかったらまたいろいろ調整したい
- Mastodonのアップロードにもできるだけ追従していきたいので必要になったら手順を追う