SlackからMattermostへの移行

# はじめに

2022年9月1日から、Slackのフリープランは過去90日間のメッセージ履歴とファイルストレージしか利用できなくなります。
そのため、過去90日より前を参照するには「Slackの有料化」or「別サービスへの移行」が必要になります。
ここでは「別サービスへの移行」として、SlackライクなMattermostへの移行手順をまとめます。

https://slack.com/intl/ja-jp/blog/news/pricing-and-plan-updates?fbclid=IwAR1e77p_AhSucwmCIcaPYHEuEL6IRxxyXjefpb79BbJTLBAx85QYjOmMNGI&fs=e&s=cl

https://mattermost.com/

# ざっくり手順

1. Slackデータのエクスポート
1. Slack APIの設定
1. エクスポートファイルにメールアドレスと添付ファイルを付与
1. Mattermostをデプロイ~初期設定
1. Mattermost用に変換
1. Mattermostへインポート
1. 日本語検索できるように、MySQLのインデックス再作成

# うまくいかなかった点

* チャンネル名を移行できない
```c01b7hbsvlp```といったランダムな文字列になる。

* 添付ファイルを移行できない
```MaxFileSize```は問題ないはずなのに、```Unable to upload file. File is too large.```と怒られ、諦めた。

# 環境

* Mac 12.3.1
* Docker Desktop 4.8.1

# 手順

### 1. Slackデータのエクスポート

管理者権限があれば、「設定と管理」->「ワークスペースの設定」で、右上に「データのインポート/エクスポート」が表示される。

### 2. Slack APIの設定

[Migration guide](https://docs.mattermost.com/onboard/migrating-to-mattermost.html#migrating-from-slack)の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627583/f65070eb-8a64-353a-f72b-2901dcf132eb.png)

### 3. エクスポートファイルにメールアドレスと添付ファイルを付与

* [slack-advanced-exporter](https://github.com/grundleborg/slack-advanced-exporter/releases/)をダウンロード
```/usr/local/bin```などに保存

* エクスポートファイルにメールアドレスと添付ファイルを付与
```
slack-advanced-exporter --input-archive <SLACK EXPORT FILE> --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
```

### 4. Mattermostをデプロイ~初期設定

* Dockerに登録
```
docker run --name mattermost-preview -d --publish 8065:8065 mattermost/mattermost-preview
```

* ユーザー、チームを登録
http://localhost:8065 へアクセス

### 5. Mattermost用に変換

* [mmetl](https://github.com/mattermost/mmetl/releases/)をダウンロード
```/usr/local/bin```などに保存

* Mattermost用に変換
```
mmetl transform slack --team <TEAM NAME> --file export-with-emails-and-attachments.zip --output mattermost_import.jsonl
```

* bulk-export-attachmentsフォルダをdataフォルダへ入れてzipファイル化
Mattermostへインポート時に[エラー](https://mattermost.atlassian.net/browse/MM-42423)になるため。
```
mkdir data
mv bulk-export-attachments data
zip -r mattermost-bulk-import.zip data mattermost_import.jsonl
```

また、Mattermostへインポート時に```Unable to upload file. File is too large.```といったエラーになる場合、Mattermostの設定(```MaxFileSize```)を確認する。
私の場合、設定に問題がなくてもエラーになったため、添付ファイルは諦めて、```cp /dev/null bulk-export-attachments/xxxxxxxxxx```といったように、0バイトのファイルに書き換えた。

### ６. Mattermostへインポート

* ホスト側からコンテナ側へファイルをコピー
```sudo docker ps```でコンテナのIDを確認し、```sudo docker cp ...```にて。

* コンテナ側でインポート前にログイン
```
cd /mm/mattermost/bin
mmctl auth login http://localhost:8065
```
「Connection name」は無視、「Username」「Password」はMattermostへの登録内容を入力する。

* コンテナ側でインポート
```
mmctl import upload ./mattermost-bulk-import.zip
mmctl import list available
mmctl import process <IMPORT FILE NAME>
mmctl import job show <JOB ID> --json
```

* インポート後の確認
インポートが終わればMattermostのCHANNELSに表示される。
もし、SlackとMattermostでメールアドレスが異なる場合、チーム名の横の「+」->「Browse Channels」から「Join」する。

### ７. 日本語検索できるように、MySQLのインデックス再作成

* Dockerにvimをインストール
```
apt-get update
apt-get install vim
```

* /etc/mysql/my.cnfに以下を追加
```
[mysql] default-character-set = utf8mb4
[mysqld] character-set-server = utf8mb4
innodb_large_prefix = ON
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
```

* MySQLもしくはdockerごと再起動し、以下のSQLを実行
```
mysql> ALTER TABLE Posts DROP INDEX idx_posts_message_txt;
mysql> ALTER TABLE Posts ADD FULLTEXT INDEX idx_posts_message_txt (`Message`) WITH PARSER ngram COMMENT 'ngram reindex';
```

# 参考にした記事

https://docs.mattermost.com/onboard/migrating-to-mattermost.html#migrating-from-slack

https://qiita.com/bezeklik/items/a3882af7f4303bdc3cb6

https://developers-trash.com/archives/750

https://mattermost.atlassian.net/browse/MM-42423

https://www.steponboard.net/mattermost/859/