リンカーズでは最近コミュニケーションツールを Mattermost から Slack に切り替えました。当ブログでは2回に分けてSlack移行についてお伝えしたいと思います。まず今回はMattermostからデータを抽出し、Slackにインポートする手順です。
概要
- Mattermostサーバーからデータをexport
- ローカルにダウンロード
- Slack向けにデータを変換
- Slack Webからデータをimport
- 自動化できなかった作業を実施
移行できなかったもの
- カスタム絵文字 (画像データだけ取得)
- スレッド
- チャンネルによって過去のデータが欠落
- チャンネルのプライベート設定
- 添付ファイル
作業
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サイトからインポート実行。
自動化できなかった作業
カスタム絵文字
画像だけサーバーから引っこ抜いた。→社内Googleドライブへ
下記のようなディレクトリ構成だったので、
emoji/z6p31wghup8xix3nqb7ez7ouyr/image emoji/zf49muaadjrpzreyqx1gqtixxh/image_deleted
z6p31wghup8xix3nqb7ez7ouyr/image
↓
z6p31wghup8xix3nqb7ez7ouyr_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移行後のチームの動きについて書きます。