将Mattermost安装到Ubuntu环境中

有消息称,Slack将于2022年9月1日起改变其免费计划(从此只能查看过去90天的历史记录)。
作为Slack的替代品,Mattermost是一个经常被提及的聊天服务,通过在个人计算机上安装,您可以无限制且免费地使用与Slack相当的服务。

在我所属的团队中,我们决定在自己的计算机上进行Mattermost的本地部署运营。因为对Linux和服务器运维非常陌生的状态下开始,我一边摸索一边进行调查,最终花了大约两周时间。

この記事では、Mattermostのインストール、初期設定、Slackからのインポート作業について初心者向けに解説しつつ、最後に躓いたポイントをまとめています。

环境

以下是计算机的相关信息:
・操作系统:Linux / Ubuntu 20.04.4 LTS
・中央处理器:Intel x86_64
・Mattermost:版本 7.1.2(有关每个版本的更新信息,请点击此处)
・MySQL:版本 8.0.30

Mattermost的安装方式

整体形象

在完成安装后,先展示整体情况。

# ディレクトリ構造
root/
  ┣━ opt/mattermost/
                 ┣━ bin/mattermost (実行ファイル)
                 ┣━ config/config.json (設定ファイル)
                 ┣━ data/
                      ┣━ users/    (ユーザー情報)
                      ┣━ import/   (Slack等からのインポート用データを格納)
                      ┣━ 20220801/ (日付に対応するアタッチメントファイル)

# チャットのテキストデータはMySQLのデータベースに保存される

安装操作

我基本上按照官方的步骤进行了操作。

MySQL是一种开源的关系型数据库管理系统。

今回はインストールにaptを用いた。(環境に応じて好きなインストーラーを選択)

sudo apt update
sudo apt upgrade
sudo apt install mysql-server

在初次启动时,需要进行root用户的设置。按照执行下面的命令后出现的指示进行密码设置。

sudo mysql_secure_installation

rootユーザーでMySQLにログインし、mattermost用のユーザーアカウント(今回は”mmuser”と名付けた)を作成する:

mysql -u root -p
mysql> create user 'mmuser'@'localhost' identified by '(パスワード)';  # (アカウント作成)
mysql> create database mattermost;  # (データベース作成)
mysql> grant all privileges on mattermost.* to 'mmuser'@'localhost';  # (権限付与)
mysql> exit  # (mSQLからログアウト)

Mattermost的服务器通过这个账户来操作MySQL上的数据库。

确认命令是否正确构建的方式如下所示:

mysql> show databases;  # (データベース一覧)
mysql> select user, host from mysql.user;  # (MySQLユーザー確認)
mysql> show grants for mmuser@localhost;  # (ユーザー権限確認)

Mattermost – 怼筹

获取并解压tar镜像,执行所需的文件夹移动和创建操作。

wget https://releases.mattermost.com/7.1.2/mattermost-7.1.2-linux-amd64.tar.gz
tar -xvzf mattermost*.gz
sudo mv mattermost /opt
sudo mkdir /opt/mattermost/data

在Linux系统上创建一个用于启动Mattermost的用户组,并授予/opt/mattermost目录的操作权限。

sudo useradd --system --user-group mattermost
sudo chown -R mattermost:mattermost /opt/mattermost
sudo chmod -R g+w /opt/mattermost

使得Mattermost可以使用MySQL的管理用户mmuser。

sudo vim /opt/mattermost/config/config.json  # (Mattermostの設定ファイルを書き換える)

"SiteURL":"http://(IPアドレスorドメイン名):8065"
"Drive name":"mysql"
"DataSource":"mmuser:(パスワード)@tcp(localhost:3306)/(データベース名)?charset=utf8mb4,utf8\u0026writeTimeout=30s"

开始

既然准备工作都做好了,那就启动Mattermost试试看吧。

# mattermost(システムユーザー) で bin/mattermost を実行
sudo -u mattermost /opt/mattermost/bin/mattermost 

如果产生大约10行的输出日志,最后出现类似”Server is listening on [::]:8065″的日志,则表示正常。(→如果有错误提示并且没有出现这条日志,则可能是MySQL的设置有问题)

これは、実行状態のMattermostアプリケーションが、ポート番号8065で外部からアクセス来るのを待機している状態。

Mattermostを実行状態で、手元のパソコンのブラウザでhttp://(IPアドレス or ドメイン名):8065をURLとして打ち込めばMattermostのサインアップ画面が出現するはず。
(→ アクセス出来ない場合、ファイアウォールなどのセキュリティによって外部からのアクセスが遮断されている可能性 )

Systemdの設定

Mattermostの起動・停止に関して諸設定を自動化するためにsystemdを設定しておく。

sudo touch /lib/systemd/system/mattermost.service # 起動用の設定ファイル
sudo vim /lib/systemd/system/mattermost.service

以下の内容を書き加える:

[Unit]
Description=Mattermost
After=network.target
After=mysql.service
BindsTo=mysql.service

[Service]
Type=notify
ExecStart=/opt/mattermost/bin/mattermost
TimeoutStartSec=3600
KillMode=mixed
Restart=always
RestartSec=10
WorkingDirectory=/opt/mattermost
User=mattermost
Group=mattermost
LimitNOFILE=49152

[Install]
  WantedBy=mysql.service

これにて mattermost.service というサービス名で作成された。これ以降は以下のようなsystemctlコマンドを用いて起動・停止ができる。

sudo systemctl daemon-reload  # (設定を読み込み)
sudo systemctl enable mattermost.service   # (再起動時もsystemdの設定が有効になるようにしておく)
sudo systemctl status mattermost.service   # (起動状態を確認)
sudo systemctl start mattermost.service    # (Mattermostを起動)
sudo systemctl stop mattermost.service     # (Mattermostを停止)
sudo systemctl restart mattermost.service  # (Mattermostを再起動)

初期設定

管理者ユーザーの作成・メール送信用のSMTP設定・https接続の有効化・日本語検索機能の有効化・チームの削除機能を有効化、を行う。
基本的な設定は、Mattemostログイン中画面での、左上マーク(正方形が3×3個並んだやつ)をクリック、システムコンソールを選択して設定を行う。

管理者ユーザを作成

http://(IPアドレス or ドメイン名):8065にアクセスし、アカウントを作成する。
この初回接続時のアカウントが自動的に管理者ユーザーとなる。

SMTP設定

チームへの招待メールや通知メールをMattermost側から送るためにSMTP設定が必須となる。
最も簡単な、outlookアカウントの作成とhotmailサーバーの指定を行った (公式手順):

・まずは別途outlookアカウントを作成し、hotmail.comのメールアドレスを取得する。
・Mattermost側でSMTPサーバーを設定に登録する。

SMTPサーバー:smtp.office365.com
SMTPサーバーポート:587
SMTPサーバーのユーザー名:(your_email@hotmail.com)
SMTPサーバーパスワード:(your_password)
SMTP Server Name to smtp.office365.com
接続のセキュリティ:STARTTLS

・招待メールでアカウント作成できるようにする

招待メールを有効にする:有効

・本番環境ではセキュリティのためメール確認を有効化しておく

電子メールアドレスの確認が必要:有効

启用HTTPS

外部からMattermostへアクセスする場合は、チャット内容やログイン情報を保持するためhttps通信を有効化する必要がある。
https通信にはTLS証明書が必要であり、TLS証明書の取得にはドメイン名が必要となる。(IPアドレスで取得できるサービスもあるが、結局ドメイン取得した方が安い)

ここでは既にドメイン名を取得したとして、certbotを利用したTLS証明書の取得および自動更新設定を説明する。

# TLS証明書の取得
sudo apt-get install certbot  # certbotをインストール
sudo certbot certonly --standalone -d $(ドメイン名)
sudo certbot certificates  # 証明書確認
sudo systemctl status certbot.timer  # 証明書自動更新プログラムの状態確認

# よくわからんけど実行 (原文:Activate the CAP_NET_BIND_SERVICE capability to allow Mattermost to bind to low ports)
"sudo setcap cap_net_bind_service=+ep /opt/mattermost/bin/mattermost"

启用HTTPS通信

サイトURL:(ドメイン名)
接続待ちアドレス:443
ポート80を443へ転送する:有効
接続のセキュリティー:TLS
TLS証明書ファイル:(cert.pemファイルの場所指定)
TLS鍵ファイル:(privkey.pemファイルの場所指定)
Let's Encryptを使用する:有効

ファイアウォールなどセキュリティ設定でポート80(http)と443(https)を開けておく。
Mattermostを再起動して完了。

日本語検索機能の有効化

Mattermostで検索に必要なインデックス処理を行う機能はBleveと呼ばれている。
Bleveのインデックス保存用のフォルダを作成、書換権限を付与する。

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

システムコンソール > 実験的機能 > Bleveを設定する。
全て有効にして、IndexDir:/opt/mattermost/bleveindexesに設定、インデックス付与を今すぐ開始するをクリックで完了

チームの削除機能を有効化

Mattermostでは今のところGUIからチームの削除は出来ない。
config.jsonファイルを編集することでコマンドからチーム削除できるようにする。

"EnableAPITeamDeletion":true
"EnableAPIUserDeletion":true
"EnableAPIChannelDeletion": true

可以使用mmctl命令删除团队。

mmctl team delete ${チーム名}

Slackからのインポート

主に 公式手順(英語)、日本語解説 を参照

Slackデータのエクスポート

Slack側から、ワークスペース名をクリック->「設定とその他管理項目」->「ワークスペースの設定」を選択、エクスポート画面で日付範囲を指定しエクスポート開始、しばらくしたらダウンロードリンクが生成される。

ダウンロードしたslack-bulk-export.zipにはユーザーアカウント情報とチャット履歴が含まれている。
画像などのアタッチメントファイルはSlackサーバーから別途ダウンロードする必要があり、そのためにSlackアプリ登録およびTokenを発行しておく。詳しい手順は上記リンク参照。

実際のダウンロードはslack-advanced-exporterを用いて行う:

# slack-advanced-exporterをインストール
curl --location --remote-name https://github.com/grundleborg/slack-advanced-exporter/releases/download/v0.4.0/slack-advanced-exporter.linux-amd64.tar.gz
tar --extract --file=slack-advanced-exporter.linux-amd64.tar.gz
mv --verbose slack-advanced-exporter /usr/local/bin/

# アタッチメントファイルとEメールアドレスをSlackサーバーからダウンロードする
slack-advanced-exporter --input-archive slack-bulk-export.zip --output-archive export-with-emails.zip fetch-emails --api-token ${SLACK_TOKEN}
slack-advanced-exporter --input-archive export-with-emails.zip --output-archive export-with-emails-and-attachments.zip fetch-attachments

生成されたexport-with-emails-and-attachments.zipには、Slack側の全データが含まれている。

将数据导入Mattermost

事先创建Mattermost团队,并导入到目标位置。

mmetlを用いて、このデータをMattermostにインストールしやすいデータ形式への変換を行う。

# mmetlをインストール
curl --location --remote-name https://github.com/mattermost/mmetl/releases/download/0.0.1/mmetl.linux-amd64.tar.gz
tar --extract --file=mmetl.linux-amd64.tar.gz
mv --verbose mmetl /usr/local/bin/

# ${TEAMid}には、"表示名"ではなく"チームID"(URLに表示される)の方を指定
mmetl transform slack --team ${TEAMid} --file export-with-emails-and-attachments.zip --output mattermost_import.jsonl

チャット履歴およびユーザー情報を含むmattermost_import.jsonlとアタッチメントファイルを保存したbulk-export-attachmentsが生成される。
これらをまとめてzip化する:

zip -r mattermost-bulk-import.zip bulk-export-attachments mattermost_import.jsonl

Mattermostへのインポートはmmctlを用いて行う。

# mmctlの実行ファイルを移動
ln --symbolic --verbose /opt/mattermost/bin/mmctl /usr/local/bin/

# mmctlを使用
mmctl import upload mattermost-bulk-import.zip  # "/opt/mattermost/data/import" ディレクトリ下にzipファイルをコピーしているだけ
mmctl import list available  # ここで表示されるzipファイルを下のコマンドで指定する
mmctl import process $(File_name).zip

# 実行ジョブの確認
mmctl import job show --json $(ジョブID)
# 全ジョブ履歴の確認
mmctl import job list 

いくつかインポート作業中にエラーが出て詰まったのでまとめておく:
→ ファイルサイズが大きすぎる・ユーザー数が多すぎるなどのエラーが出る
→ アタッチメントファイル有りの場合にエラーが出る
→ 複数のSlackワークスペースからインポートしようとするとエラーが出る
→ ステータスがin_progressのまま終わらない現象

エラー集

“Server is listening on [::]:8065″のログが出ない

{“level”:“error”,“ts”:1619691579.4546628,“caller”:“sqlstore/supplier.go:258”,
“msg”:“Failed to ping DB”,“error”:“dial tcp: lookup : no such host”,“retrying in seconds”:10}

のようなエラーメッセージが出ている場合、MattermostがMySQLのデータベースに接続できでいないことがある。(参考:同じ症状の人)
この場合、MySQLのユーザー作成、もしくはそのパスワード情報をconfig.jsonファイルに書き込む箇所で誤っているかもしれない。

(IPアドレス):8065 にブラウザからアクセス出来ない

Ubuntuサーバーがセキュリティによって外部アクセスを拒否している可能性がある。Ubuntuサーバー側で

curl -i localhost:8065

を実行してhtmlが返ってくるのであれば、mattermostの起動に成功しており、ネットワーク内部からのアクセスは出来ていることが確認できる。

まずはサーバーのポート開放を行う必要がある。(詳しく無い人向け:ポート開放とはなにか)

sudo ufw status # ポート状態の確認
sudo ufw allow 8065/TCP # ポート開放
sudo ufw reload # 設定の有効化

この他にもセキュリティ関連をチェックしてみると良さそう。
VPS上で仮想サーバーとして構築している場合は、VPS側のファイアウォールでもポート開放する必要があった。

Slackからのインポートでエラー (1)

アップロード時にいろんなエラーが出るかも。

Error: failed to create upload session: : Unable to upload file. File is too large

ファイルサイズがMattermost側の設定の限界値を超えているので、config.jsonもしくはGUI側からファイルサイズに関する設定(“MaxFileSize”)を書き換える。(初期設定では100MBに設定されている)
設定変更後にsystemctl restart mattermostで再起動しておくと確実に有効化できる。

他にもチームの最大人数を超えてエラーなどが出た。”MaxUsersPerTeam”を書き換えた。(初期設定では50人となっている)

Slackからのインポートでエラー (2)

Mattermost 7.1.2 ではデフォルトのままmmctlでアタッチメントファイル入りのデータをインポートすると以下のようなエラーが出た

[
  {"status": "error",
    "progress": -1,
    "data": {
      "error": "Error while processing bulk import attachments. — attachment \"data/bulk-export-attachments/F035BTPTQ_test-image.png\" not found in map",
      "import_file": "7coajdui93ndmpqrzf_mattermost-bulk-import.zip",
      "line_number": "9"
    }
  }
]

由于某种原因,看起来文件已经被设定为从data/bulk-export-attachments/目录下读取,所以需要手动移动。

mkdir data
mv bulk-export-attachments data/
zip -r mattermost-bulk-import data mattermost_import.jsonl

で解決した

Slackからのインポートでエラー (3)

在从多个Slack工作空间导入到同一个Mattermost服务器时,出现了以下错误。

mmctl import job show --json 9wmqpqhm67y76foesqw  # ジョブ確認コマンド
[
  {"status": "error",
    "progress": -1,
    "data": {
      "error": "We could not count the users. — importUser: An account with that email already exists., invalid input: entity: User field: email value: mail-address@google.com",
      "import_file": "stwsmetagifuume9txg6c_mattermost-bulk-import.zip",
      "line_number": "6"
    }
  }
]

これは、複数のSlackワークスペースにおいて同一のメールアドレスを使用しながら異なるユーザーネームを登録している人がいると発生する。
Mattermost側はメールアドレス単位でユーザー情報を1対1に紐づけて管理しているので、バッティングする情報があるとエラーが出る。
解決策としては、mattermost_import.jsonl中のユーザー情報とチャット履歴に含まれるユーザーネームを全て既存のIDで置き換えることで通した。

Slack导入时发生错误 (4)

ステータスがin_progressのまま終わらない現象。これについては明確な原因がわからないが、Twitterで検索したところ同じ症状の人を見かけた。

[
  {"status": "in_progress",
    "progress": 0,
    "data": {
      "import_file": "stwsmetagifuume6c_mattermost-bulk-import.zip"
    }
  }
]

インポートの合計データサイズが大きい場合に起きるようだったので、Slackからのエクスポートを小分けにして複数回のインポート作業を行って回避した。
in_progress中のインポート作業を停止するコマンドがmmctlに存在しないので困っています (公式ドキュメント)。誰かわかる方いれば教えてください。

その他

・Slackからインポートした日本語チャンネル名は正しく表示されなかったので、手作業で直した。
・全インポート終えた後に、日本語検索有効のためのBleveインデックス付加作業を行うと、途中で止まってしまう (97%ぐらい)。日本語検索自体はできているので無視した。

广告
将在 10 秒后关闭
bannerAds