Linkers Tech Blog

リンカーズ株式会社の開発者ブログです。

Slack始めました MattermostからSlackへの移行手順

リンカーズでは最近コミュニケーションツールを Mattermost から Slack に切り替えました。当ブログでは2回に分けてSlack移行についてお伝えしたいと思います。まず今回はMattermostからデータを抽出し、Slackにインポートする手順です。

概要

  1. Mattermostサーバーからデータをexport
  2. ローカルにダウンロード
  3. Slack向けにデータを変換
  4. Slack Webからデータをimport
  5. 自動化できなかった作業を実施

移行できなかったもの

  • カスタム絵文字 (画像データだけ取得)
  • スレッド
  • チャンネルによって過去のデータが欠落
  • チャンネルのプライベート設定
  • 添付ファイル

作業

export

実行時のログ、一部省略。実行時間は3時間くらい。

$ ssh ec2-user@******.net
[ec2-user@ip-**-**-**-** ~]$ cd /opt/gitlab/embedded/service/mattermost
[ec2-user@ip-**-**-**-** mattermost]$ nohup sudo -u mattermost /opt/gitlab/embedded/bin/mattermost export bulk /tmp/bulk_data.json --all-teams --config=/var/opt/gitlab/mattermost/config.json &
[1] 32273
[ec2-user@ip-**-**-**-** mattermost]$ ls -lah /tmp/
合計 57M
drwxrwxrwt 24 root            root       4.0K  8月 24 14:10 .
dr-xr-xr-x 28 root            root       4.0K  8月 14 17:55 ..
-rw-r--r--  1 mattermost      mattermost  57M  8月 24 14:10 bulk_data.json
drwxr-xr-x  2 mattermost      mattermost 4.0K  8月 24 14:10 exported_emoji
[ec2-user@ip-**-**-**-** mattermost]$ wc -l /tmp/bulk_data.json 
158740 /tmp/bulk_data.json

手元に移動

[ec2-user@ip-**-**-**-** tmp]$ cd /tmp/
[ec2-user@ip-**-**-**-** tmp]$ mkdir exported_chat
[ec2-user@ip-**-**-**-** tmp]$ sudo mv bulk_data.json exported_chat/
[ec2-user@ip-**-**-**-** tmp]$ sudo mv exported_emoji/ exported_chat/
[ec2-user@ip-**-**-**-** tmp]$ zip -r exported_chat *
exported_chat $ scp ec2-user@chat.linkers.net:/tmp/exported_chat.zip .
exported_chat.zip                                                                                                                                                           100%   11MB  11.6MB/s   00:00    
exported_chat $ 

convert

意図しない\\\に変換。

to_csv.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
import pprint
import csv

if __name__ == '__main__':
    with open('./bulk.csv', 'w') as csvf:
        writer = csv.writer(csvf, lineterminator='\n', quoting=csv.QUOTE_ALL, escapechar='\\', doublequote=False)
        with open('./bulk_data.json', 'r') as f:
            i = 0
            posts = []
            while True:
                line = f.readline()
                if not line:
                    break
                i+=1
                data = json.loads(line)
                if data.has_key('post') and data['post'].has_key('channel'):
                    if data['post']['message'] != "":
                            posts.append(data['post'])
            sorted_posts = sorted(posts, key=lambda post: post['create_at'])
            for post in sorted_posts:
                    writer.writerow([post['create_at'] / 1000, post['channel'], post['user'], post['message'].replace('\"','"').encode('utf-8')])

引用元: message migration from mattermost to slack

実行

exported_chat $ python to_csv.py 
exported_chat $ wc -l bulk_data.json 
  158740 bulk_data.json
exported_chat $ wc -l bulk.csv 
  269786 bulk.csv

import

Slack Webサイトからインポート実行。

f:id:ryota_suzuki_linkers:20190904191120p:plain
CSVデータのインポート

自動化できなかった作業

カスタム絵文字

画像だけサーバーから引っこ抜いた。→社内Googleドライブへ

下記のようなディレクトリ構成だったので、

emoji/z6p31wghup8xix3nqb7ez7ouyr/image
emoji/zf49muaadjrpzreyqx1gqtixxh/image_deleted

z6p31wghup8xix3nqb7ez7ouyr/imagez6p31wghup8xix3nqb7ez7ouyr_image というファイル名に変換してドライブに配置

for f in * ; do
  FILENAME=`ls -1 $f`
  "mv" ./${f}/${FILENAME} ${f}_${FILENAME}
done

チャンネル

mattermostにはなかったチャンネルを追加

これらはSlackデフォルトをそのまま使う、または手動で追加。

チャンネル プライベート 目的
#aws_notificaiton awsからの通知を受信用
#general このチャンネルはワークスペース全体のコミュニケーションと社内アナウンス用です。全メンバーがこのチャンネルに参加しています。
#gitlab-banks bank関連のgitlab通知
#gitlab-linkers 本体Gitlab関連通知
#random 仕事に関係ないペチャクチャ、ワイワイ、ざわざわといったチャンネルは、仕事に関係したチャンネルとは別にしておいたほうがいいです。
#talentio talentioからの通知用
#wiki wikiツールからの通知です

プライベート化、アーカイブ

  • 明らかにプライベートチャンネルと思われるものはプライベートに変更
  • 使われていないチャンネルはアーカイブした

おわりに

データ移行によりMattermostの資産を活かしつつSlackを使い始めることができました。次回はSlack移行後のチームの動きについて書きます。