4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Slack から Mattermost へデータ移行

Last updated at Posted at 2022-09-01

この記事で解説すること:

Amazon Lightsail の Ubuntu に立ち上げた Mattermost に、Slack のデータを移行させます。

Mattermost を操作する mmctl コマンドについては、以下を参考にしてください。

Ubuntu への Mattermost のインストール方法は、以下の記事をご覧ください。

インポートの準備

それでは、インポートの準備を進めていきます。
※ 事前に、インポート先となる Mattermost のチームを作成しておいてください。

少し順番が前後しますが、公式の手順に沿って行っていきます。

作業用ディレクトリの作成

SSH でサーバー(Amazon Lightsail インスタンスの Ubuntu) に入り、今回の作業用ディレクトリを作成しておきます。

$ mkdir tmp

必要ファイルのダウンロード

Slack データをインポートするには「mmetl」と「slack-advanced-exporter」を使用します。

それらをインストールするため、先ほど作成した tmp/ ディレクトリに必要なファイルをダウンロードします。

$ cd tmp
$ wget https://github.com/mattermost/mmetl/releases/download/0.0.1/mmetl.linux-amd64.tar.gz
$ wget https://github.com/grundleborg/slack-advanced-exporter/releases/download/v0.4.0/slack-advanced-exporter.linux-amd64.tar.gz

もし、Ubuntu 以外で使用する場合は、OS ごとにダウンロードするファイルを選択します。

必要ファイルの解凍

先ほどダウンロードした圧縮ファイルを解凍します。

$ tar -zxvf slack-advanced-exporter.linux-amd64.tar.gz
$ tar -zxvf mmetl.linux-amd64.tar.gz

インポート元データの準備

次は サーバー操作から一旦離れて、Slack の公式の手順通りにデータをエクスポートします。

エクスポートした ZIPファイルを FTPソフトでサーバーに転送します。

今回は FileZilla を利用し、先ほど作成した tmp/ ディレクトリに転送します。
接続方法は以下の記事を参照させていただきました。

Slack API OAuth Token の発行

Mattermost の公式の解説 (以下のURL) の「Next, follow these steps to create a bot token:」の 1 〜 9 のステップを実行します。

エクスポートしたデータにメールアドレス情報を紐付け

Slack のエクスポートデータには添付ファイルとメールアドレスは含まれていないため、それらを紐付けます。
まずはメールアドレスを紐付けます。

$ ./slack-advanced-exporter --input-archive {Slackからエクスポートしたファイル} --output-archive export-with-emails.zip fetch-emails --api-token {発行したslack API トークン}

「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 を操作するためのコマンドである mmctl を使用しますが、まだパスを通していないので、公式のように

$ mmctl import upload hogehoge.zip

と入力しても、実行されません。

そのため、事前にパスを通すか、毎回パスを指定して実行するか を行うよう注意してください。

パスを指定して実行するなら、今回の場合は、

$ /opt/mattermost/bin/mmctl import upload hogehoge.zip

となります。

それでは、インポートするファイルを Mattermost 用に変換していきましょう。

インポートするファイルを変換

$ ./mmetl transform slack --team {チーム名} --file export-with-emails-and-attachments.zip --output slack-export.jsonl

「slack-export.jsonl」というファイルと、「bulk-export-attachments」というフォルダが作成されます。

{チーム名} には、事前に Mattermost で作成したチーム名を入力します。

もし分からない場合は、以下のコマンドでチーム名の一覧を確認できます。

$ mmctl team list

上述したように、mmctl コマンドのパスに注意してください。

bulk-export-attachments/ フォルダを data に移動

$ mkdir data
$ mv bulk-export-attachments data

zip コマンドをインストール (まだインストールされていない場合のみ)

$ sudo apt update
$ sudo apt install zip

それらを圧縮

$ zip -r slack-export.zip data slack-export.jsonl

「slack-export.zip」という圧縮ファイルが作成されます。

以上で、Mattermost 用にインポートファイルを変換・圧縮が完了しました。

Mattermost にインポート

それでは最後に、Mattermost にインポートしていきます。

ログイン

$ mmctl auth login http://localhost:8065

//「Connection name」:適当な文字列
//「Username」:Mattermost で作成した管理者ユーザー名
// 「Password」:Mattermost で作成した管理者ユーザーのパスワード

Mattermostのチームの最大ユーザー数を増やす

$ mmctl config set TeamSettings.MaxUsersPerTeam {増やしたい人数}

{増やしたい人数} には、Mattermost の最大ユーザー数を指定します。(500 など)

人数を増やしておかないと、後でインポートした際に以下のようにエラーになります

$ mmctl import job show {Import process job IDの値}

// Status: error
// Data: BulkImport: Unable to import team membership because no more members are allowed in that team, limit exceeded …

インポートについては後述します。

インポートファイルのアップロード

$ mmctl import upload slack-export.zip
Upload session successfully created, ID: gobrahsndinuubja6ax1pbjnrh  // ID が生成される
Import file successfully uploaded, name: ru5u8cyqt3na3xmqyha67jjp5w

ファイルサイズが大きすぎると、Error: failed to create upload session: : Unable to upload file. File is too large. といったエラーが表示されるようです。

この場合は、以下のコマンドで Mattermost の最大ファイルサイズを変更してください。

$ mmctl config set FileSettings.MaxFileSize {増やしたいサイズ}

{増やしたいサイズ} には、アップロードするサイズよりも大きい値を選択します。

これを実行してもエラーが出る場合は、サーバー側でファイルサイズオーバーが起きている可能性がありますので、サーバー側 (Nginx) の設定を変更します。

アップロードしたファイル名を確認

$ mmctl import list available

今回は、以下のファイル名でアップロードされました。

gobrahsndinuubja6ax1pbjnrh_slack-export.zip

アップロード時に発行された ID と同じ値が使われています。

インポート

$ mmctl import process {先ほど確認したアップロードファイル名}
Import process job successfully created, ID: pqnw1q6aw3riikdhbof3xx84ey  // ID が生成される

{先ほど確認したアップロードファイル名} は、mmctl import list available コマンドで確認した ZIP ファイルです。

インポート状況の確認

$ mmctl import job show {先ほどの Import process job IDの値}

実行後、Status: in_progress と表示されれば成功です。

インポートされているか確認

Mattermost を起動し、Slack のチャンネルがインポートされているか確認します。

最初はサイドバーに表示されていないので、チャンネル名を検索して探します。
インポートされていない場合は、一旦 Mattermost を再起動すると表示されるはずです。

また、以下のコマンドでもチャンネルの一覧を確認できます。

$ mmctl channel list {チーム名}

以上で Slack から Mattermost へのデータ移行が完了しました。

チャンネル名がランダムな英数字に変換される件について

Slack でのチャンネル名が日本語だと、Mattermost に移行した際に チャンネル名だけランダムな文字列になってしまうようです。

色々と試してみましたが、対処法としては

  • Mattermost への移行後に、一つずつ手作業でチャンネル名を修正する
  • Slack からデータをエクスポートする前に、Slack で半角英数字のみのチャンネル名に変更する

のどちらかしか解決策がなさそうです…💦

試したこと

  • Slack データの差分追加は可能
    • 例:8/31 までの Slack データA を入れた後、9/1 からの Slack データB をインポートすると、データA でインポートした Mattermost 上のチャンネルの続きに、データB のメッセージのやり取りが追加されます
  • 差分データをインポートする前に Mattermost のチャンネルでメッセージを送っても、そのメッセージも含めて時系列順に差分インポートされる
    • つまり、Slack と Mattermost の同時運用も可能
  • 途中で Slack のチャンネル名を変更しても、Slack データの差分追加が可能
  • でも、 Mattermost に追加されたチャンネル名を変更すると、Slack データの差分追加はされない
    • 例:データA でインポートした Mattermost 上のチャンネル (チャンネル名変更済み) の他に、データB のチャンネル (Mattermost で変更する前と同じチャンネル名) が新たに生成される
      • 新たに生成されるチャンネルは、データB でエクスポートしたメッセージ期間のみの内容
  • Mattermost 上のチャンネル名だけ変えて URL は変更しなかったとしても、差分インポートするとチャンネル名が元に戻って (ランダムな文字列に戻って) しまう
    • Mattermost のチャンネルの URL は「https://{example.com}/{チーム名}/{チャンネル名}」となる
4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?