2022年8月25日木曜日

GCPを用いたMattermostの構築方法



先月、Slackからフリープランの仕様を「過去90日間の投稿しか閲覧できない」ように変更するとの発表がありました。
個人でSlackのフリープランを利用しており、メモやToDoリストをいつも書いているのでこの仕様変更は結構痛いと感じました。Scrapboxなどメモを書き留められるツールは他にもありますが、Slackの使い心地をとても気に入っているためSlackライクな「Mattermost」を使うことにしました。

Mattermostの構築方法にはいくつかあると思いますが、今回はGoogle Cloud(GCP)のサービスの1つである「Compute Engine(GCE)」のVMインスタンス上に構築してみました。その手順を書き留めていきたいと思います。

■構築手順(目次)

  1. Google Cloud Platform上にプロジェクトを新規作成する
  2. Marketplaceから「Mattermost Team Edition Certified by Bitnami」を選択し、Compute Engine上で起動する(VMインスタンスを作成する)
  3. VMインスタンスに外部IPアドレスを設定する
  4. ドメインを取得し、ドメインに対してサーバーのIPアドレスを設定する
  5. SSL証明書を発行し、VMインスタンスをSSL化する

※2022.08時点の内容のため、Mattermostのファイル構成やGCPのUI等が執筆時点と異なる可能性があります。


■1. Google Cloud Platform上にプロジェクトを新規作成する

Google Cloudにログインし、プロジェクトを新たに作成してください。

Google Cloudの利用登録が完了していない方は、上記URLからGoogle Cloudにアクセスして「無料で開始」ボタンを押し、案内に従って利用登録をしてください。途中でクレジットカードの登録が求められますが、手動で有料アカウントにアップグレードしない限り請求されることはありません。
利用登録後は一定期間の無料トライアルが開始されます。






プロジェクト作成画面にて「プロジェクト名」(後で変更可)と「プロジェクトID」(変更不可)、「場所」を入力して作成ボタンを押せばプロジェクトを作成できます。



上記画像の「編集」を押せばプロジェクトID編集フォームが表示されます。

※なお、無料トライアル終了後に有料アカウントに切り替えない場合はGCE等に作成したリソースが自動的に削除されることがあるみたいです。そのため、

  • 無料トライアル期間の終了後は有料アカウントにアップグレードする
  • GCE上にVMインスタンスを作成する際、無料枠を利用する(詳細は後述します)
ことが必要になります。

Google ヘルプ:https://support.google.com/cloud/answer/7006543



■2. Marketplaceから「Mattermost Team Edition Certified by Bitnami」を選択し、Compute Engine上で起動する(VMインスタンスを作成する)

GCPのナビゲーションメニューの「マーケットプレイス」をクリックしてマーケットプレイス画面に移動し、「Mattermost Team Edition Certified by Bitnami」を検索します。




画面が切り替わったら「運用開始」をクリックします(「必要なAPIの有効化」が表示された場合は「有効にする」をクリックします)。

デプロイ内容を設定する画面が表示されたら、VMインスタンス名やゾーンなどをそれぞれ設定します。
デプロイ後、VMインスタンスが作成されると実行時間ごとに料金が発生します。しかし、VMインスタンスを作成する際に特定の条件でインスタンスを作成することでGCPの無料枠を利用することができます。

無料枠で利用するための条件(2022.08時点):
  • リージョン:以下のいずれかのゾーン(日本から近いリージョンを選択することでネットワークレイテンシを短縮できます。以下の中で最も近いのはオレゴンです。)
    • オレゴン(us-west1)
    • アイオワ(us-central1)
    • サウスカロライナ(us-east1)
  • マシンの構成:
    • e2-micro
  • ブートディスク:
    • 30GBまでの標準永続ディスク(Standard Persistent Disk)
※無料枠で利用するための条件が変更されていることがあります。設定前にGoogleや他サイトでも念のためご確認ください。


月間の推定合計額に金額が表示されると思いますが、「ゾーン」「マシンタイプ」「ブートディスク」が上記の内容で設定されていれば課金されません。

※上記ヘルプを参考に無料枠でVMインスタンスを作成したのですが、自分の場合月あたり30円弱の請求が来ています。GCEの仕様に詳しくないため設定に不備があるのかもしれないですが、完全無料ではない可能性があるということだけお伝えしておきます。




■3. VMインスタンスに外部IPアドレスを設定する

構築したVMインスタンスに外部IPアドレスを割り当てます。
GCPのナビゲーションメニューの「VPCネットワーク」の「IPアドレス」をクリックしてIPアドレスの設定画面を開きます。


画面上部にある「外部静的アドレスを予約」をクリックします。



任意の名前(例:mattermost-ip など)を入力し、「リージョン」は先ほど構築したVMインスタンスと同じものを、「接続先」は構築したVMインスタンスを指定します(他の項目は任意の設定で大丈夫です)。
「予約」をクリックすることで、構築したVMインスタンスに静的IPアドレスが割り当てられます。

ここまで設定が完了すればMattermostにアクセスできるようになります。
https://<上記で割り当てたIPアドレス>

ただ、このままだと通信が保護されていない状態になっているため以下の手順で保護された状態にしていきます。



■4. ドメインを取得し、ドメインに対してVMインスタンスのIPアドレスを設定する

ドメインはお好きなサービスを用いて取得して大丈夫です。
自分は今回フリードメインを取得してみました。
freenomを用いて取得しようと思ったのですが、なぜかうまくできなかったのでNo-IPというサービスを用いて取得しました。そのためここではNo-IPで取得する例を書きたいと思います。

No-IPにアクセスし、取得したいホスト名を入力・ドメインを選択してサインアップしてください。
取得が完了したら、「Dynamic DNS」の「No-IP Hostnames」画面で取得したドメインの「Modify」をクリックし、VMインスタンスに割り当てたIPアドレスを「IPv4 Address」に入力してUpdateボタンを押してください。







これにより、取得したドメインにアクセスするとMattermostにアクセスできるようになります。

※No-IPの注意点
No-IPは30日ごとにドメインの更新を行う必要があります。ドメインが失効する1週間前にメールが届くので、案内に従ってNo-IPにログインして更新作業を行います。



■5. SSL証明書を発行し、VMインスタンスをSSL化する

SSL証明書を発行することで通信を保護することができます。今回は「lego」を用いて「Let’s Encrypt」のSSL証明書を発行し、自動更新するように設定していきます。

ナビゲーションメニューの「Compute Engine」の「VMインスタンス」をクリックし、VMインスタンス管理画面に移動します。


構築したMattermostのVMインスタンスの「接続」の項目にある「SSH」をクリックしてブラウザからVMインスタンスにSSH接続します。


ターミナル画面が表示されたら、以下のコマンドを順次実行してSSL化していきます。

tmpフォルダに移動
cd /tmp

「lego」をダウンロード
curl -Ls https://api.github.com/repos/xenolf/lego/releases/latest | grep browser_download_url | grep linux_amd64 | cut -d '"' -f 4 | wget -i -

ダウンロードしたファイルを解凍
tar xf lego_v*

legoを /user/local/bin に移動
sudo mv lego /usr/local/bin/lego

bitnamiのサービスを停止
sudo /opt/bitnami/ctlscript.sh stop

SSL証明書をインストール(メールアドレスとドメインは置き換える)
sudo lego --email="メールアドレス" --domains="取得したドメイン" --path="/etc/lego" --http run

// 実行後、「Do you accept the TOS? Y/n」に聞かれるので「Y」を入力してEnterを押す。

鍵と証明書をバックアップしておく
sudo mv /opt/bitnami/nginx/conf/bitnami/certs/server.key /opt/bitnami/nginx/conf/bitnami/certs/server.key.old
sudo mv /opt/bitnami/nginx/conf/bitnami/certs/server.crt /opt/bitnami/nginx/conf/bitnami/certs/server.crt.old

鍵と証明書をリンクさせる(ドメインは置き換える)
sudo ln -s /etc/lego/certificates/取得したドメイン.key /opt/bitnami/nginx/conf/bitnami/certs/server.key
sudo ln -s /etc/lego/certificates/取得したドメイン.crt /opt/bitnami/nginx/conf/bitnami/certs/server.crt

鍵と証明書の権限を変更する
sudo chown root:root /opt/bitnami/nginx/conf/bitnami/certs/server*
sudo chmod 600 /opt/bitnami/nginx/conf/bitnami/certs/server*

bitnamiのサービスを起動する
sudo /opt/bitnami/ctlscript.sh start

■証明書を自動で定期更新するように設定

 スクリプトの作成
sudo vi /etc/lego/renew-certificate.sh

スクリプトには以下を記述する:
#!/bin/bash

sudo /opt/bitnami/ctlscript.sh stop
sudo /usr/local/bin/lego --email="メールアドレス" --domains="取得したドメイン" --path="/etc/lego" --http renew
sudo /opt/bitnami/ctlscript.sh start

スクリプトファイルの権限変更
sudo chmod +x /etc/lego/renew-certificate.sh

crontabを開く
sudo crontab -e

// 「Select an editor.  To change later, run 'select-editor'.」のように表示されたら「1(nanoエディタ)」を入力してEnterを押す。

crontabファイルが開いたら以下の内容を最終行に追記する:
0 0 1 * * /etc/lego/renew-certificate.sh 2> /dev/null

// 追記したら Cntl+X → Y → Enter で保存できる。
nanoエディタの操作方法の参考:

これにより、毎月1日の00:00に証明書が自動で更新されるようになります。
(2022/11/11追記:スクリプトファイルの内容を一部修正)



 ここまで完了すればサーバー側の設定は終了です。4で取得したドメイン(https://ドメイン名)にアクセスすることでMattermostのログイン画面が表示されます。
初期状態のユーザー名は「user」で、パスワードはVMインスタンスの詳細画面の「カスタムメタデータ」の「bitnami-base-password」の項目に書かれています。いずれも変更可能です。

なお、現時点では通知メールの設定を行っていないため「プレビューモード」で動作している状態になっています。
「マーケットプレイス」にある「SendGrid Email API」を用いることで設定ができるみたいなのですが、自分はまだ設定できていないため設定でき次第追記させていただきます。


Mattermostを触ってみているのですが、カスタム絵文字を自由に追加できたりファイルを添付できたりと、使い心地がSlackにとても似ていて使いやすいです。Backlogのボードに似た機能が実装されているのにはビックリしました。BacklogもToDo管理用によく使っているサービスなのでありがたいです。

新たに分かったことや変更点等あれば追記・修正していきたいと思います。
Mattermostはまだまだ進化していくと思うので今後も楽しみです。


作業する上で参考にさせていただいたページ:
GCP無料枠を使ってたったの30分でOSS版Slack「Mattermost」を構築する【SSL化も対応】
これから始めるGCP(GCE) 安全に無料枠を使い倒せ

このエントリーをはてなブックマークに追加

0 comments:

コメントを投稿