Ubuntu Weekly Recipe

第702回Mattermostの基本的な設定とバックアップ・リストア

第700回でも紹介したように、Mattermostと言えば、Slackと双璧をなすFLOSSでセルフホスト可能なチャットサービスであり、定型ワークフローを管理する「Playbook」と、かんばんライクなタスク管理ツールである「Boards」が統合され、⁠オンラインコラボレーションツール」でもあります。今回はMattermostの基本的なカスタマイズ方法を紹介しましょう。

Mattermost Omnibusのカスタマイズ

第700回ではDebianパッケージ版のMattermostであるMattermost Omnibusをインストールしました。今回はまず、このMattermost Omnibusをカスタマイズしてみましょう。改めてリストアップすると、基本的な設定方法は次の4パターンになります。

  • Mattermost Omnibusの設定ファイルは/etc/mattermost/mmomni.yamlで、変更後の反映コマンドはsudo mmomni reconfigure
  • 環境変数/etc/mattermost/mmomni.mattermost.envで一部のMattermostの設定を行っている
  • Mattermost本体の設定は、sudo mmctl --local config editで編集すると反映される
  • Mattermost本体の設定は、Web UIのシステムコンソールからも変更できる

最初のMattermost Omnibusで設定できる項目は次のとおりです。

  • db_user/db_password:PostgreSQLのデータベースのユーザーとパスワードです。インストール時に自動生成されるため、それをそのまま使えば良いでしょう。
  • fqdn:Mattermost本体のドメインネームです。インストール時に設定した値が使われます。
  • email:Let’s Encryptによるサーバー証明書の取得の際に使われるメールアドレスです。HTTPSを別途設定する場合は空のままでかまいません。
  • https:HTTPSを利用するかどうかをtrue/falseで設定します。リバースプロキシー側でHTTPSを担うなら、falseでもかまいません。
  • data_directory:Mattermostがデータを保存するディレクトリです。バックアップ対象となるディレクトリだと考えれば良いでしょう。
  • enable_plugin_uploads:Mattermost側のPluginSettings.EnableUploadsの値を設定します。これは自前のプラグインをアップロードできるかどうかの設定項目です。プラグインを自作しない限りfalseで問題ありません。
  • enable_local_mode:Mattermost側のServiceSettings.EnableLocalModeを設定します。mmcliコマンドの認証に関する設定コマンドです。trueの場合、Mattermostが動いているサーバー上で、Unixドメインソケットを経由してmmcliコマンドを実行した時、ユーザー認証を行わないことになります。⁠Mattermostサーバーにログインできる=管理者である」が成り立つのであれば、trueのままで良いでしょう。

このようにMattermost Omnibusはインストール時に設定しておいたほうが良い項目だけ、YAMLファイルでも設定できるようになっています。基本的にインストールが完了し、Mattermostにログインしたあとは特に変更しないと思っておいて問題ありません。

Mattermostのカスタマイズ

Mattermost本体はWeb UIもしくはmmcliによる設定ファイルによって内容を変更します。重要な項目の多くはWeb UIから変更可能ですが、一部の設定はファイルを直接編集しなくてはなりません。また一部の設定は/etc/mattermost/mmomni.mattermost.envで設定しており、これはmattermost.serviceを起動する時に読み込まれています。

一部の設定はsudo mmctl --local config editで編集する必要があるものの、こちらも変更することはほとんどないでしょう。よってだいたいのことはWeb UIのシステムコンソールで完結できます。

そこで代表的なものをいくつか見ていきましょう。

サイト本体の設定

まずはサイト全体の設定を行いましょう。具体的には画面左上のグリッドメニューから、⁠システムコンソール」を選択し「サイト設定」「カスタマイズ」に移動します。次の画像のように、メールアドレス等が設定されていないと、この設定を促されるようです。

図1 メールアドレスを設定していないと、mattermost-advisorが通知してくれる
図1

設定自体は各項目に丁寧な説明がついているため、そこまで難しいことはないでしょう。ここで重要なのは「サポート電子メールアドレス」です。これはメール通知等が送られたときの、連絡アドレスとして表示されます。サーバーの管理者が確認できるアドレスを設定しておきましょう。その他プライバシーポリシーや、アイコン・サイト名などなどサイト固有の設定を変更できます。

図2 設定項目には詳細なガイドが記述されている
図2

「サイト設定」では他にも「言語」でアカウント作成時の初期設定等、⁠ユーザーとチーム」でユーザー情報の表示範囲、⁠通知」で通知メールの内容の調整、⁠投稿」でメッセージに投稿したURL等の扱いを、⁠お知らせ」でMattermostアップグレード時の通知に関する情報をコントロールできます。

サーバー関連の設定

「環境」ではウェブサーバーやデータベースなど、より下回りの設定を行います。

ただしウェブサーバーに関しては、/etc/mattermost/mmomni.mattermost.envで設定しているものがいくつかあり、Web UIは使えない点に注意してください。設定画面でも「この設定は環境変数を通じて設定されています。システムコンソールから変更することはできません。」と表示されます。

基本的にインストール時の設定から変更する必要はありませんが、いくつか検討したほうが良い項目もあります。

  • ファイルストレージ:添付ファイルや画像をAmazon S3に保存するモードが存在します。
  • SMTP:通知メールを送るために必要な設定です。詳細は後ほど説明します。
  • プッシュ通知サーバー:モバイルアプリ向けにプッシュ通知を送るための設定です。詳細はMattermostのモバイル通知に関するドキュメントを参照してください。
  • セッション維持期間:ログインセッションを維持する期間です。⁠活動中はセッション維持期間を延長する」を有効にしておくと、常時アクティブな場合はログイン状態を維持します。セキュリティポリシーとの兼ね合いで有効にするかどうかを判断してください。

ちなみにMattermostのモバイルアプリはGoogle PlayやApple Storeで公開されているものを、セルフホスト環境でもそのまま利用できます。ソースコードは公開されているため、自分でビルドして利用することも可能です。

メール送信設定

Mattermostはログインや通知処理のためにメールを送信することがあります。このため「SMTP」のメール送信設定はほぼ必須の項目です。ここで選択肢は次の二種類になります。

  • ローカルにSMTPサーバーをインストールする
  • 外部のSMTPサーバーを利用する

前者の場合は、sudo apt install postfixなどでSMTPサーバーをインストールします。Postfixを使うのなら、インストール時の設定として「Internet Site」を選択し、ドメイン名に「@」より後ろの名前を指定しましょう。

また/etc/postfix/main.cfに最低限myで始まる設定だけ修正したら、sudo systemctl reload postfix.serviceするだけで、最低限の設定は完了です。

ただしインターネットに公開した状態でSMTPサーバーを適切に運用するのはそれなりに能力が必要です。今回のケースだけならSMTPサーバーをローカルに閉じ込めてしまって、送信は行えるけれども受信はしないという運用でも問題はありません[1]⁠。ただし、後者のように別途適切なSMTPサーバーを使う方法もあります。

Mattermostのメール設定に関するドキュメントにはAmazon SESやGmailなど、メジャーどころの設定方法が網羅されているため、これを参考に設定してみると良いでしょう[2]⁠。

図3 Mattermostを運用する上で事実上必須となるメールの設定
図3

認証設定

「認証」ではアカウントの作成やログイン方法を設定します。

「利用登録」はアカウントの作成方法についての説明です。初期設定だと、⁠招待されない限りアカウントは作成できない」状態になっています。つまり「アカウントの作成を有効にする」は有効で、⁠オープンサーバーを有効にする」が無効、⁠招待メールを有効にする」が有効の状態です。

このうちオープンサーバーは、有効にしてしまうとサーバーにアクセスできる人は誰でもアカウントを作れる状態になってしまいます。ローカルネットワークでしか使わない場合など特殊な事情を除いて、有効にすることはないと思ったほうがいいでしょう。

図4 アカウントの作成関連の設定
図4

アカウントは「メールアドレス・ユーザー名・パスワード」から構成されます。アカウント作成時のメールアドレスの確認等を担うのが「電子メール認証」の設定です。メール送信設定が完了したら「電子メールアドレスの確認が必要」を有効にしておくと良いでしょう。⁠パスワード」ではパスワードの複雑さなどを設定できます。

Mattermostは「電子メール・ユーザー名」以外のログイン方法もサポートしています。とは言え、AD/LDAPやSAML 2.0、OpenIDを使う場合は有償ライセンスが必要です。ちなみにGitLabを利用した認証は無償で利用可能です。またGitLab自身も様々な認証をサポートしているため、認証はGitLabにすべて任せるという運用でもいいかもしれません。

多要素認証にも対応しています。システムコンソールから多要素認証を有効にしておくと、個々のユーザーが画面右上の「プロフィール」から多要素認証を使えるかどうかを変更できるようになります。

図5 多要素認証の有効化
図5

多要素認証にはAndroidやiOSにGoogle Authenticatorをインストールして実現します。ログインする際にAuthenticatorが生成したコードを追加で入力するような形です。ちなみにスマートフォンでなくて、PC上のUbuntuを使ってコードを生成する方法もあります。詳細は第508回のUbuntuでコマンドラインからワンタイムパスワードを扱うを参照してください。

実験的機能

「実験的機能」には正式対応とは言えないものの、将来的に正式な機能として取り込まれる可能性のある設定が一覧できます。そのうち便利なものをいくつか紹介しておきましょう。

「プレビュー機能を有効にする」を有効化すると、画面右上の歯車アイコンから「詳細」「プレリリース機能をプレビューする」にMarkdownプレビューの表示オプションが追加されます。これにチェックを入れておくと、チャットにメッセージを記述する際、⁠プレビュー」リンクをクリックするとMarkdownのレンダリング結果が表示されます。

「返信スレッドの折りたたみ」を有効化すると、返信スレッドを折りたためるようになります。Slackと異なりMattermostは返信スレッドの内容もすべてチャンネル内に表示されます。チャンネルに表示されたり表示されなかったりするのが個人の操作に依存せず、文脈のよくわからない返信がいきなりチャンネルに登場することがない点で、Mattermostの良い仕様のひとつではあるのですが、流量が多いとわずらわしくなります。

折りたたみ機能を使うと、必要なスレッドだけ表示できて便利です。この機能の利点は、発言者側ではなく閲覧者側にコントロール権があることです。

日本語検索機能

Mattermostはそのままだとメッセージの日本語検索に対応していません。

図6 日本語のコメントを検索できない
図6

ただし「実験的機能」「Bleve」から「Bleveのインデックス付与を有効にする」を有効化すると、日本語も含めて検索が可能になります。

図7 Bleveの設定画面
図7

まずあらかじめ、インデックスを保存するディレクトリを作っておきます。場所はどこでも良いのですが、/var/opt/mattermost/bleveindexesあたりが無難でしょう。

$ sudo mkdir /var/opt/mattermost/bleveindexes
$ sudo chown mattermost: /var/opt/mattermost/bleveindexes

Mattermostのプロセスが読み書きできるように、オーナーも変更しています。あとはこのディレクトリパスを「IndexDir」に入力して、⁠保存」ボタンを押します。そうすると「インデックス付与を今すぐ開始する」が押せるようになるので、開始してみましょう。

ちなみにメッセージ数が多い場合は、インデックス付与の完了まで相当時間がかかります。今回のケースだと、メッセージが一個だけなので準備も含めて数分で完了しました。一度インデックス化が完了したら、あとはメッセージが追加されるたびに自動的にインデックスが更新されます。

Bleveでインデックスされたデータを検索対象にするためには、⁠Bleveの検索クエリを有効にする」「Bleveの自動補完クエリを有効にする」も有効化しておく必要があります。

図8 日本語のコメントを検索できるようになった
図8

バックアップとリストア

一通り設定が完了したら、本番運用を開始する前にバックアップとリストアの準備・動作確認を行っておきましょう。手順についてはMattermostのドキュメントにあるバックアップとリストアの項目に詳細な方法が記述されています。

バックアップが必要なものはかんたんにまとめると次の項目です。

  • データベース上のデータ
  • 設定ファイルであるconfig.json
  • データディレクトリ以下のアップロードされた画像等のコンテンツ

また、前項で紹介したようにBleveを使っているならそのインデックスデータの保存も考えなければいけませんが、リストア後に再インデックスするのであれば必須ではありません。

Mattermost Omnibusでのバックアップ

ただし、Mattermost Omnibusをインストールしているのであれば、上記のバックアップ処理はmmomniコマンドでかんたんに実現できます。

$ sudo mmomni backup -o $(date +'%Y%m%d%H%M%S').tgz
Backup created at "20220129214133.tgz"

$ tar tvf 20220129214133.tgz
-rw------- 0/0             211 2022-01-29 21:41 mmomni.yml
-rw-r--r-- 0/0          169872 2022-01-29 21:41 database.dump
-rw------- 0/0            3372 2022-01-25 02:13 data/users/7mqkxu5kypbfpgtqssn9efns6w/profile.png
-rw------- 0/0            2011 2022-01-18 02:41 data/users/h67i73usjffx9paznnwe13f5br/profile.png
-rw------- 0/0            2523 2022-01-18 02:13 data/users/phh1qpcyztnajp1ddwnismxeoa/profile.png
-rw------- 0/0            2930 2022-01-18 02:13 data/users/tog1cs8gtinofpikhcycczsr4h/profile.png

config.jsonが存在しませんが、これはMattermost Omnibusの場合、設定項目がデータベースの中に組み込まれているためです。

ちなみにアーカイブフォーマットは現状tar.gzだけサポートしています。

Mattermost Omnibusでのリストア

何か別のサーバーにMattermost Omnnibusを用意して、上記のバックアップをリストアしてみましょう。

$ sudo mmomni restore 20220129214133.tgz
Backup extracted into temporal directory "/tmp/mmomni_825526278"
Configuration restored in "/etc/mattermost/mmomni.yml"
Database backup restored
Data directory restored in "/var/opt/mattermost/data"

Please run "mmomni reconfigure" to apply the restored configuration

リストアに成功したら再構築を行います。

$ sudo mmomni reconfigure
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

(中略)

PLAY RECAP *********************************************************************
localhost                  : ok=12   changed=3    unreachable=0    failed=0    skipped=4    rescued=0    ignored=0

$ sudo mmomni status
[8158] nginx: running
[5796] postgresql@13-main: running
[8461] mattermost: running

これだけでリストは完了です。とてもかんたんですね。きちんとリストアできているかどうかを確認するためにも、システムコンソールの変更した設定等も確認すると良いでしょう。

バックアップの定期実行

ついでに定期的にバックアップするようにしておきましょう。まずはバックアップ用のスクリプトを作成します。

$ cat <<'EOF' > mm_backup.sh
#!/bin/bash

BACKUP_DIR="${BACKUP_DIR:-/var/opt/mattermost/backups/}"
BACKUP_NUM="${BACKUP_NUM:-3}"

set -e

[ ! -d "$BACKUP_DIR" ] && mkdir -p "$BACKUP_DIR"
cd "$BACKUP_DIR"

# Backup Mattermost Omnibus
mmomni backup -o "$(date +'%Y%m%d%H%M%S').mm.tgz"

# Remove oldest backup archives
count=0
while read -d '' -r file; do
  [ -f "$file" ] || continue
  ((++count <= BACKUP_NUM)) && continue
  echo "Removing old backup archive '$file'"
  rm -f -- "$file"
done < <(find . -maxdepth 1 -name '*.mm.tgz' -type f -print0 | sort -nrz)
EOF
$ chmod +x mm_backup.sh
$ sudo cp mm_backup.sh /usr/local/sbin/

これはBACKUP_DIRに指定したディレクトリに、最大BAKCUP_NUM個のバックアップアーカイブを作成するスクリプトです。個数を超える古いアーカイブは実行時に削除します。

試しに、/var/opt/mattermost/backups/の中身を確認しながら、sudo ./mm_backup.shを管理者権限で何度か実行してください。最大3個しかアーカイブが保存されないことがわかるはずです。

あとはこれをsystemd用のタイマーユニットを作成し、定期実行します。

$ cat <<'EOF' | sudo tee /etc/systemd/system/mm-backup.timer
[Unit]
Description=Backup Mattermost data

[Timer]
OnCalendar=*-*-* 04:00:00
RandomizedDelaySec=30

[Install]
WantedBy=timers.target
EOF

$ cat <<'EOF' | sudo tee /etc/systemd/system/mm-backup.service
[Unit]
Description=Backup Mattermost data
RefuseManualStart=no
RefuseManualStop=no

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/mm_backup.sh
EOF

上記設定では毎朝4時に/usr/local/sbin/mm_backup.shを実行するようにしています。時刻等は適宜調整してください。動作確認した上で、タイマーを有効化します。

$ sudo systemctl daemon-reload
$ sudo systemctl start mm-backup.service
$ ls -1 /var/opt/mattermost/backups/
  => 最新のバックアップアーカイブが作られていることを確認

$ sudo systemctl enable mm-backup.timer
$ sudo systemctl start mm-backup.timer
$ systemctl list-timers mm-backup.timer
NEXT                        LEFT          LAST PASSED UNIT            ACTIVATES
Sun 2022-01-30 04:00:02 JST 5h 28min left n/a  n/a    mm-backup.timer mm-backup.service

1 timers listed.
Pass --all to see loaded but inactive timers, too.

タイマーがきちんと期待通りの時刻にセットされていたら準備完了です。後日、バックアップが取れていること、またそのバックアップデータでリストアできることを確認しましょう。

このようにMattermost Omnibusを使うと比較的かんたんにMattermostをプロダクションで使うまでの準備が整います。

おすすめ記事

記事・ニュース一覧