Google Cloud Platform で Mastodon を立てる

なぜそんな気分になったのか覚えていませんが、Google Cloud Platform 上で公開/運用可能な Mastodon を構築してみましょう。

僕は普段フロント側を担当するヒトなので、Linux 周辺については詳しくありませんが、何度かインスタンスを作っては壊し、いろいろ手順を変えて試してみました。(何度でも新品の環境をサッと入手できるのが VMインスタンスの良いところ)


事前に準備しておきたいもの

  •  DNS設定を変更できるドメインを所有している
    • GCP の外部IPだけで運用できなくはないですが、もし SMTP に Mailgum を使用するならDNS設定は必須です。他のSMTPを使用することも可能ですが、GCPにはポート制限があって、ちょいとよく分かりません…
    • Mastodoに使用するドメインドメインを決めておきましょう
      • サブドメインを使わないのがトレンドの様子ですが、ドメイン運用の都合で僕はサブドメインを割り当てました。
  • Google Cloud Platform のアカウント
    • 無料枠を使うと幸せですね

ざっと手順の流れ

  • VMインスタンスを作成
  • nginx をインストして、WEBサーバとして稼働することを確認
  • Docker をインスト
  • Mastodon をインストして、とりあえず ポート3000番で確認
  • nginx の設定で ポート80番 を 3000番にプロキシ、ポート80番で確認
  • Let’s Encrypt で HTTPS 接続を設定、確認
  • SMTP(メール)の設定
  • ファイル保存先(Google Strage)の設定
  • WEBブラウザでユーザー登録し、確認する
  • ユーザーを管理者に任命する
  • Let’s Encrypt の証明書を自動更新する設定
  • ポート3000番を閉じる

先人の知恵


VMインスタンスを準備する

Compute Engine で VMインスタンスを作成する

以下の内容でVMインスタンスを作成します

  • vCPU x 1 (メモリ3.75GB, m1-standard-1)
    • small だとわりとすぐにスケールアップを求められた
    • small でも構築はできた
  • Ubuntu 16.04 LTS
    • DockerがUbuntu17.04を正式サポートしていない
  • HTTP トラフィックを許可する > チェック
    • 最初 HTTP で確認しながら構築します
    • HTTPS 設定後は HTTPS に転送設定します
  • HTTPS トラフィックを許可する > チェック
    • のちに HTTPS を設定します

3000番ポートを開く

Mastodon は3000番ポートを使用します。

ファイアウォールルールを作成

VPC ネットワーク > ファイアウォールルール で 3000番 を作成します

  • 名前 > mastodon
    • 識別できるならなんでもよい
  • ターゲットタグ > mastodon
    • 識別できるならなんでもよい
    • VM インスタンス の 「ネットワーク タグ」で使います
  • ソース IP の範囲 > 0.0.0.0/0
  • プロトコルとポート > 指定したプロトコルとポート / tcp:3000

ファイアウォールルールを VM インスタンス に適用する

ファイアウォールルール で設定したターゲットタグを VM インスタンス の ネットワークタグ に追記します(VMインスタンス を編集)

外部IPアドレスを割り振る

VMインスタンス には自動的に「エフェメラル外部 IP アドレス」が割り当てられますが、これは一時的なもので終了、再起動、停止などで変わってしまいます。

VPCネットワーク > 外部IPアドレス で静的アドレスを予約して、対象の VMインスタンスに割り当てておきます。

その後、DMSサーバー側でドメインを 外部IPアドレス に向けておきます。

nginx をインストールする

「nginx」は処理性能・高い並行性・メモリ使用量の小ささに焦点を当てて開発されたWEBサーバ。
Mastodonを構築した後でも良いのだけれども、ボクは先にインストして確認しておきたい派です。

SSHで接続してインストールします

インストして、ブラウザでアクセスして確認します。nginx のデフォルト画面が表示されればOKです。
確認できたら停止しておきます。

Docker 関連をセットアップする

Docker とは、ビルドの自動化などを提供する軽量仮想環境です。ようするに、Mastodonをサービスとして起動するためのパーツや設定を管理してビルドしたり起動するための手続きを一切合切受け持ってくれるものです。

Mastodon のインストール

とりあえず、3000ポートで確認できるトコロまでやってみます。
3000ポートで確認とは、ブラウザで、例えば「http://1.2.3.4:3000」などポートを指定したアクセスです。
結構モタつくので気長に…

この時点で3000ポートでMastodonが表示されれば成功です

80番ポートをnginxで3000番に通します(プロキシ)

このまま3000番では運用できないので、先にインストした nginx の設定で、80番(通常のWebアクセスで利用されるポート)を 4000番に通します。
Mastodonはサーバ内部では http://127.0.0.1:3000 で待っているので、指定ドメインの80番アクセスをリレーするカンジですね。

これで指定したドメインでマストドンにアクセスできれば、成功です。

Let’s Encrypt でセキュアに

一旦 nginx を停止して 80番ポートを開けておかないと失敗するので nginx は停止しておきます。($ sudo nginx -s stop)

証明書情報を nginx に反映する

さきほど作成した「/etc/nginx/conf.d/mastodon_proxy.conf」ですが、証明書関連の設定で書き換えます。
Mastodon Production Guideのサンプルそのままです。
HTTPをHTTPSに転送する設定も含まれていますね。
先の Let’s Encrypt で取得した証明キーなどは以下に保存されているので、ソレを設定しているわけです。

  • /etc/letsencrypt/live/{■■運用ドメイン■■}/fullchain.pem;
  • /etc/letsencrypt/live/{■■運用ドメインm■■}/privkey.pem;


さて、これで nginx を起動します。
HTTPSで Mastodon が表示されれば成功です。

Mailgum でメール送信設定を行う

ユーザーを登録は確認メールの送信が成功しないと進みませんから、SMTP設定は必須です。

Mailgun は、毎月最大 30,000 件の無料メールを Compute Engine ユーザーに提供するサードパーティのメールサービスです。Mastodon とも相性が良いようです。Mailgun でのメールの送信を参考にしてください。

登録、DNS周りの設定等をへて、「Default SMTP Login」「Default Password」を取得します。(DNSの設定でDNSの所有者認証するのがちょいと厄介でした)

Mastodon側の設定は以下のような感じです。
GCP の環境では 2525番 を指定するのがポイントです。

Strage の設定を行う

Google Strage を画像などの保存場所として使用します。
基本的には Mastodon は Amazon S3 が標準のようですが、Google Strage には互換性を適用する方法が用意されています。

  • Strage でバケットを作成します。「ストレージ クラス」は「Regional」にしておきます。
  • Strage > 設定 > 相互運用性 を設定し、「アクセスキー」と「非公開」を取得しておきます。

ユーザー登録を行う

SMTPの設定が完了したならば、ユーザー登録してみます。確認メールが届けば成功です。
おめでとう!

管理者を任命する

登録したユーザーを管理者に任命します。
管理者はWEBのインターフェイスで、いくつかのインスタンスの設定が可能になります。

Let’s Encrypt の証明書を定期的に更新する

Let’s Encrypt の証明書は90日です。このままでは期限を超えるとHTTPS接続が無効になっちゃいます。
cron(定期的に実行するしかけ)に更新ジョブを登録しておきます。

ポート3000番を閉じる

外部から 3000番でアクセスすることは必要なくなりましたから、VM インスタンス の 「ネットワーク タグ」から該当タグを削除しておきます。