どうも、katです。
最近、slackの公式サイトにて、2022年9月からフリープランではメッセージが3ヶ月間しか見れなくなるといった変更(改悪?)がされるとアナウンスされました。
そこで今回は、オープンソース完全無料のslackそっくりなMattermostにslackのデータを移行する方法について解説していこうと思います。
今回の方法では、メッセージだけでなく、ファイルやメールアドレスなども全て移行が可能となっています。
また、Mattermost 6以降では、画面からslackのデータをインポートする機能が廃止されたようですが、今回の方法でMattermost 6以降でもインポート可能なコマンドラインでの移行方法なので、ご参考にしていただけたらと思います。
※データ移行できるのは、パブリックチャンネルの内容のみです。
※当記事のコマンドについて、root以外のユーザーで実施する場合は、適宜コマンドの前に「sudo」をつけて実施して下さい。
前提
- Mattermostが構築済みであること
- Mattermostにユーザー登録済みであること
- Mattermost側に、slackからのデータを移行したいチーム(slackでいうところのワークスペース)が作成済みであること
もしまだサーバーにMattermostがインストールされていない場合は、インストールが必要となります。
以下の記事で、Mattermostをインストールする手順も書いていますので、参考にしていただければと思います。
また、Ubuntu以外のサーバーでの導入などに関しては、公式サイトをご参照ください。
そして、Mattermostのチームが未作成の場合は新たに作成していただければと思います。
必要なファイルダウンロード
今回は、データ移行するにあたり、いくつか必要なファイルがありますので、それをダウンロードします。
mmetlダウンロード
まずはmmetlというファイルをダウンロードします。
こちらのサイトから、MattermostをインストールしたサーバーのOSに合ったものをダウンロードします(例:linuxサーバーの場合は「mmetl.linux-amd64.tar.gz」)
FTPソフトなどを使い、Mattermostをインストールしたサーバーの任意のディレクトリにダウンロードしたファイルを送ります。(この記事では「/tmp」配下に送信した前提で進めます)
slack-advanced-exporterダウンロード
次にslack-advanced-exporterというファイルをダウンロードします。
こちらのサイトから、mmetlの時と同様に、MattermostをインストールしたサーバーのOSに合ったものをダウンロードします(例:linuxサーバーの場合は「slack-advanced-exporter.linux-amd64.tar.gz」)
こちらも、FTPソフトなどを使い、Mattermostをインストールしたサーバーの任意のディレクトリにダウンロードしたファイルを送ります。(この記事では「/tmp」配下に送信した前提で進めます)
slackのデータをエクスポート
次に、slackのデータをエクスポートしていきます。
こちらは、slackのサイト上から行っていきますが、前提として、ワークスペースの管理権限が必要になります。
もし管理権限が無い場合は、管理者の方にお願いして、管理権限をつけてもらう必要があります。
- slackのワークスペース名をクリックし「設定と管理」>「ワークスペースの設定」をクリックします。
- 「データのインポート/エクスポート」をクリックします。
- 「エクスポート」をクリックします。
- データ移行した日付範囲を選択して「エクスポート開始」をクリックします。
- 下記のような履歴が表示されます。
- しばらくしてから画面をリロードし、エクスポートが完了していたら「ステータス」にダウンロード用のリンクが表示されるので、クリックしてダウンロードします。
ダウンロードが完了したら、mmetlなどと同様に、FTPソフトなどを使ってMattermostをインストールしたサーバーに送ります。(この記事では「/tmp」配下に送信した前提で進めます)
slack API トークン発行
slackからのエクスポートだけでは、ファイルやメールアドレスが含まれないため、slack APIを使って取ってくる必要があるので、その為の準備として、slack APIのトークンの発行を行います。
- こちらのサイトを開き「Create New App」をクリックします。
- 「From scratch」をクリックします。
- 「App Name」に適当な名前(例:Slack Advanced Exporter)を付けて「Pick a workspace to develop your app in」のセレクトボックスで、データ移行したいslackのワークスペースを選択したら「Create App」をクリックします。
- 左側メニューの「OAuth & Permissions」をクリックします。
下の方にスクロールしていくと「Scopes」という項目が見えてくるので、その中の「Add an OAuth Scope」をクリックします。 - クリックすると入力できるようになるので「users:read」と入力すると「users:read」と「users:read.email」という選択肢が表示されるので、それぞれ両方とも選択します。
- 選択が完了すると、下記のような表示になるかと思います。
- 一番上まで画面をスクロールし「Install to Workspace」をクリックします。
- 下記のような画面が表示されるので、そのまま「許可する」をクリックします。
- 「Copy」をクリックしてトークンをコピーし、メモ帳などに控えておきます。
以上でトークンの発行は完了です。
移行データの作成
※ここからはMattermostをインストールしたサーバー上で作業を行います
また、dockerのコンテナ上でMattermostを動かしている場合は、以下のようなコマンドでコンテナに入ってから作業を行います(前述の「前提」に記載の記事でMattermostをインストールした場合のコンテナ名は「docker_mattermost_1」です)
docker container exec -it {コンテナ名} bash
上記で入れない場合は
sudo docker container exec -it {コンテナ名} /bin/sh
など
後述する全てのコマンドはUbuntuで実施した場合のコマンドなので、各OSに合わせて適宜読み替えてください。
slackからエクスポートしたデータは、そのままでは移行できず、Mattermost用にデータを整形する必要があるため、その手順について説明していきます。
また、この時点で、サーバーに以下のファイルが存在していることを確認しておいてください。
/tmp/mmetl.linux-amd64.tar.gz
/tmp/slack-advanced-exporter.linux-amd64.tar.gz
/tmp/{slackからエクスポートしたファイル名}.zip
もし、dockerコンテナ上にMattermostをインストールした場合は、下記のようなコマンドでdockerのコンテナにファイルをコピーしてから以降の手順を進めてください。
# ホストサーバー(dockerコンテナの外)で実行
$ docker cp /tmp/mmetl.linux-amd64.tar.gz {コンテナ名}:/tmp
$ docker cp /tmp/slack-advanced-exporter.linux-amd64.tar.gz {コンテナ名}:/tmp
$ docker cp /tmp/{slackからエクスポートしたファイル名}.zip {コンテナ名}:/tmp
↓例(前述の「前提」に記載の記事でインストールし、slackからエクスポートしたファイル名を「slack_export.zip」とした場合)
# ホストサーバー(dockerコンテナの外)で実行
$ docker cp /tmp/mmetl.linux-amd64.tar.gz docker_mattermost_1:/tmp
$ docker cp /tmp/slack-advanced-exporter.linux-amd64.tar.gz docker_mattermost_1:/tmp
$ docker cp /tmp/slack_export.zip docker_mattermost_1:/tmp
もし、「前提」に記載の記事でインストールしたかつ、エラーは出ないけどファイルが移動していない場合は、上記コマンドの「/tmp」部分を、「/mattermost」にしてみてください。
必要ファイルの解凍
※ここからはdockerのコンテナ内で行います
まずは前述の「必要なファイルダウンロード」でダウンロード & サーバーに送った「mmetl」と「slack-advanced-exporter」の2つのファイルを解凍します。
↓例(ファイル名はダウンロードしたものに置き換えてください):
$ tar -zxvf /tmp/slack-advanced-exporter.linux-amd64.tar.gz
$ tar -zxvf /tmp/mmetl.linux-amd64.tar.gz
メールアドレス、ファイルの紐付け
解凍が完了したら、下記のコマンドで、slackからエクスポートしたデータにメールアドレス情報を紐付けます。
$ ./slack-advanced-exporter --input-archive {slackからエクスポートしたファイル} --output-archive export-with-emails.zip fetch-emails --api-token {発行したslack API トークン}
↓例(エクスポートしたファイル名をslack_export.zipとした場合):
$ ./slack-advanced-exporter --input-archive /tmp/slack_export.zip --output-archive export-with-emails.zip fetch-emails --api-token xoxb-123456789-12345678901234-Xatchiur4j4io82ojfwjok
完了すると「export-with-emails.zip」というファイルが作成されます。
次に、下記のコマンドで、ファイルの情報も紐づけていきます。
$ ./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」というファイルが作成されます。
これで紐付けは完了になります。
Mattermost用にファイル変換 & 圧縮
次に、下記のコマンドで、Mattermostのインポート用にファイルを変換します。({チーム名}の部分は、事前に作成済みのMattermost側のチーム名(slackでいうところのワークスペース)を入力します)
$ ./mmetl transform slack --team {チーム名} --file export-with-emails-and-attachments.zip --output slack_export.jsonl
すると「slack_export.jsonl」というファイルが作成されます。
ここまでの手順で「bulk-export-attachments」というフォルダも作成されているかと思いますが、こちらをdataというフォルダを新たに作成し、その中に移動します。(※忘れやすい手順なので太字にしました)
$ mkdir data
$ mv bulk-export-attachments data
次に、下記のコマンドでファイルを圧縮します。
$ zip -r slack_export.zip data slack_export.jsonl
ここで「bash: zip: command not found」のようなエラーになった場合はまずzipコマンドをインストールします(前述の「前提」に記載した記事でMattermostをインストールした場合などは、dockerコンテナにzipコマンド自体が入っていない場合があるためです)
$ apt install -y zip
さらに、上記のaptコマンド自体が使えない場合があります。
その場合は、コンテナから一度出て、コンテナに入るコマンドに「–user root」をつけてコンテナに入ると、使える場合があるのでお試しください。
↓例
$ sudo docker container exec --user root -it {コンテナ名} /bin/sh
Mattermostにインポート
※移行データの作成時同様、Mattermostをインストールしたサーバー上で作業を行います
dockerのコンテナ上でMattermostを動かしている場合は、コンテナに入ってから作業を行います。
後述する全てのコマンドはUbuntuで実施した場合のコマンドなので、各OSに合わせて適宜読み替えてください。
ここまでの手順でデータの準備ができたら、ようやくインポートが行えるようになりました。
まずは、mmctlコマンドでログインを行います(mmctlコマンドはMattermostがインストールされていれば使えるはず(?))。
$ mmctl auth login http://localhost:8065 ← うまくいかない場合はブラウザからアクセスする時のURLにする
Connection name: hoge ← 適当な文字列
Username: hoge ← Mattermostに登録したユーザー名
Password: ← Mattermostに登録したパスワード
次に以下のコマンドを実行します。
$ mmctl import upload slack_export.zip
↓実行後に以下のように出力されます
Upload session successfully created, ID: tzy7hyg63jn79kw5wi6h5584ge
Import file successfully uploaded, name: gwedyowf6tnx8x88o4tc39repe
上記のように出力されたら「Upload session successfully created, ID」の文字列(上記の場合は「tzy7hyg63jn79kw5wi6h5584ge」)を控えておきます。
ここで「Error: failed to create upload session: : Unable to upload file. File is too large.」と言ったエラーが表示される場合は、ファイルのサイズが大きすぎるので、下記のコマンドを実行して、最大ファイルサイズを実際のファイルのサイズよりも多く設定することでうまくいくようになるかと思います。
$ mmctl config set FileSettings.MaxFileSize 3000000000 ← 設定したいファイル最大値
これでもうまくいかない場合は、Mattermostを動かしている「サーバー側」でファイルサイズオーバーが起きている可能性がありますので、サーバー側の設定を変更します。
例(Nginxの場合):
Nginxかつ、dockerコンテナを使用している場合は、Mattermostのコンテナから一度出て、コンフィグファイルを編集します。
$ exit ←Mattermostのコンテナから一度出ます
$ vi nginx/conf.d/default.conf ←前述の「前提」に記載の記事でMattermostをcloneした「docker」ディレクトリにいる場合
# 以下のように修正します。
# 変更
client_max_body_size 1000M; ← 設定したい値に変更します
# 追加(client_max_body_sizeの下に追加します)
client_body_buffer_size 1000M; ← 値はclient_max_body_sizeと同じで大丈夫です
修正が完了したら、Nginxのコンテナ(前述の「前提」に記載した記事でMattermostをインストールした場合はNginxのコンテナ名は「nginx_mattermost」です)を再起動し、Mattermostのコンテナに入り直します。
$ docker restart {Nginxのコンテナ名}
$ docker container exec -it {Mattermostのコンテナ名} /bin/sh
エラーにならずに実行できたら、次に下記のコマンドを実行します。
$ mmctl import list available
↓実行後に以下のように出力されます(複数ある場合もあり)
tzy7hyg63jn79kw5wi6h5584ge_slack_export.zip
ここで出力されたzipファイル名を控えておきます。
ファイルが複数表示されてどれかわからない場合は、先ほど控えていた「Upload session successfully created, ID」が先頭につくファイル名を探して、そのファイル名を控えておきます。
次に、下記のコマンドを実行します。
$ mmctl import process {控えておいたzipファイル名}.zip
↓実行すると以下のように出力される
Import process job successfully created, ID: tr37yoeraprpub4sc1scgc7sha
ここでも「Import process job successfully created, ID」の文字列(上記だと「tr37yoeraprpub4sc1scgc7sha」)を控えておきます。
ここまでで、インポート処理が始まったので、下記のコマンドで結果を確認してみましょう。
$ mmctl import job show {控えておいたImport process job successfully created, IDの値}
↓実行すると以下のように出力されます
ID: tr37yoeraprpub4sc1scgc7sha
Status: in_progress
Created: 2022-07-21 22:03:38 +0000 UTC
Started: 2022-07-21 22:03:41 +0000 UTC
Data: map[import_file:tzy7hyg63jn79kw5wi6h5584ge_slack_export.zip]
上記の出力の中で、「Status」が進行状況を表しています。
各Statusの値については以下になります。
- in_progress:処理中
- success:インポート(データ移行)完了
- error:インポート(データ移行)失敗
無事「Status: success」となっていればインポート成功です。
ここで、出力結果が以下のようなエラーになることがあります。
ID: 4iji3qdr4ir9pkya8yik7ifi5c
Status: error
Created: 2022-07-21 21:56:05 +0000 UTC
Started: 2022-07-21 21:56:11 +0000 UTC
Data: map[error:We could not count the users. — BulkImport: Unable to import team membership because no more members are allowed in that team, limit exceeded: what: TeamMember count: 51 metadata: team members limit exceeded import_file:kchp3azi6fyqtmk77k31urrfwh_slack_export.zip line_number:193]
この場合、下記のコマンドでMattermostのチームの最大ユーザー数を増やすことで解決します。
$ mmctl config set TeamSettings.MaxUsersPerTeam 500 ← 増やしたい人数
また、以下のようなエラーになることもあります。
ID: hsgritz9t7ytdcu6an6yd8bk9a
Status: error
Created: 2022-07-28 12:37:47 +0000 UTC
Started: 2022-07-28 12:37:52 +0000 UTC
Data: map[error:We could not count the users. — BulkImport: Error importing channel. Team with name {チーム名} could not be found., resource: Team id: name={チーム名} import_file:ugjah5uwkj89t8rro3j5dh3cxa_slack_export.zip line_number:3]
この場合「Mattermost用にファイル変換 & 圧縮」のコマンドで指定したチーム名が間違っていることが原因です。
その場合はお手数ですが、下記のコマンドで存在するチーム名の一覧を表示して、確認してから再度「Mattermost用にファイル変換 & 圧縮」から実施しましょう。
$ mmctl team list
結果確認
ここまで完了したら、最後にブラウザ等でMattermostにアクセスして、パブリックチャンネル、メッセージ、ユーザー、画像ファイルなどが、無事移行できていれば完了です。
お疲れ様でした〜。
最後に
いかがだったでしょうか。
今年の9月からの仕様変更に伴い、Mattermostなどのslack以外のツールに移行する企業も多いのではないかと思います。
特に今回ご紹介したMattermostはslackとほぼ同じようなことができるため、移行先として選定されることも多いのではと思います。
もしslackからのデータ移行をお考えでしたら、今回の記事が参考になれば幸いです。
以上「Mattermostにslackのデータを移行する方法」でした〜
参考
- https://docs.mattermost.com/onboard/migrating-to-mattermost.html
- https://github.com/mattermost/mattermost-server/issues/19747
等複数サイト