【簡単】Rocket.Chatを3ステップでバックアップする方法

★悩み★
・Rocket.Chatをバックアップする方法が分からない。
・チャットの文字やアップロードした写真はどこに保存されるのだろうか。
・データ間の関係性はどうなっているのだろうか。

こういった「悩み」にお答えします。

★本記事の内容★
(1) Rocket.Chatをバックアップする方法をご紹介【3ステップ!】
(2) Rocket.Chatのデータ保存先に関してご紹介【MongoDBです!】
(3) 保存されたデータの関係性についてご紹介

この記事を書いている筆者は、4年間、データエンジニアとして従事しています。

データエンジニアとして、システムの運用保守であったり、Hadoopを代表とする様々なソフトウェアの提案や導入をしたりしてきました。

また、趣味として様々なソフトウェア(例:Spark)を自宅のマシンに導入し、SNS分析も行なっています。
分析内容に興味がある方は、下記の記事を参照してみてください。

普段から様々なソフトウェアを導入し使い続けている筆者が、「【簡単】Rocket.Chatを3ステップでバックアップする方法」に関して分かりやすく解説していきます。

Rocket.Chatのリストア方法に関しては、以下をご覧ください。

Rocket.Chatを3ステップでバックアップする方法

下記記事のようにnpm経由でRocket.Chatをインストールした場合、Rocket.Chatのバックアップ用コマンドは存在しません。

そこで今回、npm経由でインストールしたRocket.Chatをバックアップする方法に関してご紹介します。

以下の3ステップを順番に実施することで、Rocket.Chatをバックアップすることができます。

★バックアップの流れ★
ステップ1:MongoDB内のデータをバックアップ
ステップ2:MongoDBの設定ファイルをバックアップ
ステップ3:Rocket.Chatの設定ファイルをバックアップ

それでは、各ステップに関して説明していきます。

ステップ1:MongoDB内のデータをバックアップ

MongoDB内のデータをバックアップするために、以下のコマンドを実行しましょう。

# mongodump --db rocketchat --out /root/tmp/db_backup

“/root/tmp/db_backup”部分は、任意のPATHとなります。

上記コマンドを実行することで、MongoDB内のデータを”/root/tmp/db_backup”へバックアップすることができました。

★あるテーブルだけをバックアップしたい場合★
例えば、データベース名「rocketchat」のコレクション名「users」のみをバックアップしたい場合は、下記のコマンドを実行します。

# mongoexport –db rocketchat –collection users –out users.json

ステップ2:MongoDBの設定ファイルをバックアップ

続いて、MongoDBの設定ファイルをバックアップしましょう。

設定ファイルの場所を把握するために、以下のコマンドを実行します。

# ps aux | grep mongod
mongod   26030  0.6  0.8 4135768 64584 ?       Sl    9月26   6:49 /usr/bin/mongod -f /etc/mongod.conf
root     30953  0.0  0.0 112824   972 pts/3    R+   15:09   0:00 grep --color=auto mongod
# 

mongodの引数fに指定されたファイル(上の場合、/etc/mongod.conf)をバックアップしましょう。

ステップ3:Rocket.Chatの設定ファイルをバックアップ

最後にRocket.Chatの設定ファイルをバックアップしましょう。

バックアップ対象となるファイルは、「/lib/systemd/system/rocketchat.service」となります。

以上で、Rocket.Chatのバックアップが完了です。

Rocket.Chatのデータ保存先に関してご紹介【MongoDB!】

Rocket.Chatでは、「チャットなどの文字列の投稿」や「ファイルといったバイナリデータのアップロード」をができます。

ただ、上記のデータは、一体どこに格納されるのでしょうか。

結論から言いますと、「チャットなどの文字列のデータ」や「アップロードしたバイナリデータ」は「MongoDB」に保存されます。

★Rocket.Chatのデータ保存先について★
・チャットなどの文字列データ
 →json形式でMongoDBに保存されます。

・アップロードしたバイナリデータ
 →バイナリデータをchunk(断片化)して、bson形式で保存します。
 →chunkしたものを1つに戻せるようにメタデータをjson形式で保存します。

Rocket.Chatは上記のように、全てのデータをMongoDBに格納しています。

バイナリデータも格納することができるMongoDB、なかなか便利ですね。

保存されたデータの関係性についてご紹介

Rocket.Chatは、MongoDBに約68のテーブルを作成し、その中にデータを保存しています。

代表的なテーブルとしては、下記があります。

★代表的なテーブル★
・users
 →Rocket.Chatのアカウント情報が保存されています。

・rocketchat_room
 →Rocket.Chatのチャンネル(チャットルーム)情報が保存されています。

・rocketchat_message
 →Rocket.Chat内で投稿されたメッセージが保存されています。

・rocketchat_uploads
 →Rocket.Chat内でアップロードされたデータに関する情報が保存されています。

・rocketchat_uploads.chunks
 →Rocket.Chat内でアップロードされたデータのバイナリー情報が保存されています。

Rocket.Chatの公式ページにおいて、一部分ではありますがスキーマ情報が記載されています。

スキーマ情報
※上記をクリックすると新規でタブが開きます。

それでは、上記で記載した代表的なテーブルのうち、チャット部分に関わるスキーマ情報を説明します。

usersのスキーマ情報

usersのスキーマ情報は、以下になります。

{
	"_id": "8ws9s5PbMo2LdGven",
	"createdAt": {
		"$date": "2020-09-26T12:16:21.835Z"
	},
	"services": {
		"password": {
			"bcrypt": "$2b$10$.ZlNsJgUJGvIt/zOxx4S7eCvEq4nWQAL4NlA9Iz.GI299KwJvTUoW",
			"reset": {
				"token": "cFhteBViJK7bNULdiqhcbh8vavuLY5H3KzZshb2HqwL",
				"email": "test@gmail.com",
				"when": {
					"$date": "2020-09-26T12:16:22.391Z"
				},
				"reason": "enroll"
			}
		},
		"email2fa": {
			"enabled": true,
			"changedAt": {
				"$date": "2020-09-26T12:16:21.835Z"
			}
		},
		"email": {
			"verificationTokens": [{
				"token": "5eA3_94NB8hEx5YfvTmf7uOw5_efUsBVnmuEqlfS2K6",
				"address": "test@gmail.com",
				"when": {
					"$date": "2020-09-26T12:16:21.876Z"
				}
			}]
		},
		"resume": {
			"loginTokens": [{
				"when": {
					"$date": "2020-09-26T12:16:22.002Z"
				},
				"hashedToken": "58tgmpSH3Z2kHsBxhfLrzM5O0gJ6fyYb9Vk04y9Jcjs="
			}]
		}
	},
	"emails": [{
		"address": "test@gmail.com",
		"verified": false
	}],
	"type": "user",
	"status": "away",
	"active": true,
	"_updatedAt": {
		"$date": "2020-09-27T02:22:59.460Z"
	},
	"roles": ["admin"],
	"name": "hero",
	"lastLogin": {
		"$date": "2020-09-26T12:16:22.082Z"
	},
	"statusConnection": "away",
	"username": "hero",
	"utcOffset": 9,
	"__rooms": ["GENERAL", "f5KN4tvWNmdPHgNJ3"]
}

rocketchat_roomのスキーマ情報

rocketchat_roomのスキーマ情報は以下になります。

{
    "_id": "f5KN4tvWNmdPHgNJ3",
    "name": "hero",
    "fname": "hero",
    "t": "c",
    "msgs": 5,
    "usersCount": 1,
    "u": {
        "_id": "8ws9s5PbMo2LdGven",
        "username": "hero"
    },
    "customFields": {},
    "broadcast": false,
    "encrypted": false,
    "ts": {
        "$date": "2020-09-26T13:41:39.101Z"
    },
    "ro": false,
    "_updatedAt": {
        "$date": "2020-09-27T02:17:47.900Z"
    },
    "lastMessage": {
        "_id": "9SFjEaP5Fu9QRxqvR",
        "rid": "f5KN4tvWNmdPHgNJ3",
        "ts": {
            "$date": "2020-09-27T02:17:47.881Z"
        },
        "msg": "",
        "file": {
            "_id": "4rZMDnuEZgEL2Yhbc",
            "name": "rocket_test.png",
            "type": "image/png"
        },
        "groupable": false,
        "attachments": [{
            "title": "rocket_test.png",
            "type": "file",
            "title_link": "/file-upload/4rZMDnuEZgEL2Yhbc/rocket_test.png",
            "title_link_download": true,
            "image_url": "/file-upload/4rZMDnuEZgEL2Yhbc/rocket_test.png",
            "image_type": "image/png",
            "image_size": 207966,
            "image_dimensions": {
                "width": 2096,
                "height": 1142
            },
            "image_preview": "/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAARACADASIAAhEBAxEB/8QAGgAAAwADAQAAAAAAAAAAAAAAAAEEAgMFCP/EACAQAAIBAwQDAAAAAAAAAAAAAAABAgMEERIhMTIiUWH/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/EABURAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIRAxEAPwD0XVs6NytNanGUU8pM61jFQoqMVhLZJEpXa9C1DuM+OPY9c8cIdWOrHwT2SyBGVWvQAA3mNThAAhX/2Q=="
        }],
        "u": {
            "_id": "8ws9s5PbMo2LdGven",
            "username": "hero"
        },
        "mentions": [],
        "channels": [],
        "_updatedAt": {
            "$date": "2020-09-27T02:17:47.896Z"
        }
    },
    "lm": {
        "$date": "2020-09-27T02:17:47.881Z"
    }
}

rocketchat_messageのスキーマ情報

rocketchat_messageのスキーマ情報は以下になります。

{
    "_id": "BpFNDES78hsHX9yHt",
    "rid": "GENERAL",
    "msg": "わかりましたか?",
    "ts": {
        "$date": "2020-09-26T13:40:12.301Z"
    },
    "u": {
        "_id": "8ws9s5PbMo2LdGven",
        "username": "hero"
    },
    "mentions": [],
    "channels": [],
    "_updatedAt": {
        "$date": "2020-09-26T13:40:24.696Z"
    },
    "replies": ["8ws9s5PbMo2LdGven"],
    "tcount": 1,
    "tlm": {
        "$date": "2020-09-26T13:40:24.651Z"
    }
}

どうやら、users/rocketchat_room/rocketchat_messageにおいて互いに外部参照をしていそうですね。

★rocketchat_messageを起点とした外部参照について★
以下の外部キーで、users/rocketchat_room/rocketchat_messageを1つにすることができます。

外部キー)
rocketchat_message.rid = rocketchat_room._id
rocketchat_message.u._id = users._id

後日の記事で、「Sparkなどを用いたjsonデータの結合方法」に関してご紹介します。

【まとめ】Rocket.Chatを3ステップでバックアップする方法

今回の記事を通して、「Rocket.Chatを3ステップでバックアップする方法」をご紹介することで、以下の悩みを解消しました。

★悩み★
・Rocket.Chatをバックアップする方法が分からない。
・チャットデータやアップロード写真はどこに保存されているのだろうか。
・データ間の関係性はどうなっているのだろうか。

Rocket.Chatをバックアップするには?と悩んでいるあなた」にこの記事が少しでも役に立てれば幸いです。

コメント

  1. とらちゃん より:

    ありがとうございます。非常に参考になりました。
    最近ロケットチャットのインストールを試みたのですが、ubuntsu20LTにインストールしていまい。上手く仮想サーバーに引っ越せないで悩んでいたところです。この方法だとバージョンさえ合わせておけば、ubuntsu20LTからCentOS7に引っ越せそうです。ところでロケットチャットですが添付ファイルの置き場所やMongoDBのテーブルボリュームのサイズって後から拡張できるんでしょうか。データーベースの設置設計って経験ないもんで、100名程度のユーザーでどの程度の期間まで利用出来るか見積もれなくて弱っています。(笑)
    ロケットチャットは扱いやすいのでしばらくは研究してみようと思います。

    • hero より:

      お忙しい中、コメントありがとうございます。
      この記事が少しでも「とらちゃんさん」の参考になっていれば幸いです。

      ご認識の通り、「Rocket.Chatのバージョンが同一」や「MongoDB内に作成されたRocket.Chatのスキーマ構造が同一」であれば、問題なく移行できるはずです。
      Rocket.Chatでの添付ファイルの格納場所は、bson形式でMongoDB内に格納されます。
      ですので、MongoDBのデータ領域の拡張さえ考えれば大丈夫です。

      MongoDBが利用するデータ領域の拡張方法としては、2つあります。
       1. MongoDBを導入したサーバのディスクを拡張し、スケールアップする方法
       2. MongoDBを導入したサーバをさらに1台追加しスケールアウトする方法
       参考:https://groups.google.com/g/mongodb-jp/c/ElKQd-Wlx2U
       ※こちらで実機検証したものを近日中にブログで公開いたします。

      データベースが利用する容量の設計って難しいですよね(汗
      「Rocket.Chatのユースケースを想定し、100名程度のユーザーがどの頻度でどのぐらいの文字数の投稿をするか?」でシミュレーションして概算見積りですかね。
      ※想定する投稿を1つRocket.Chatで投稿してみて、その際にMongoDBがどのぐらい容量を使ったか?を見るのも一つの手かと。

      研究あるのみですね!
      こちらも色々とRocket.Chatに関して研究を継続いたします。

      この度は、コメントありがとうございました。
      同じIT業界の人間として切磋琢磨していければ幸いです!!

      • とらちゃん より:

        ありがとうございます。
        少しずつ見えてきましたが、なかなか理解がむずかしいです。

        >MongoDB内に作成されたRocket.Chatのスキーマ構造が同一
        ということは単純にMongoDBはじめRocket.Chatフォルダ丸ごとコピーし引っ越しすれば再現できそうな気がしますがOSが違うと全く同じではありえませんよね。postgresでは配置したフォルダ内のDATAを丸ごとコピーしてきて、アプリ側のフォルダも丸ごとコピーしてきて、引っ越しするようなことはやっています。今回はRocket.Chatの構造がわからないもので判断できませんでした。

        >※想定する投稿を1つRocket.Chatで投稿してみて、その際にMongoDBがどのぐらい容量を使ったか?を見るのも一つの手かと。

        確かにそうですね。最初から無駄にフォルダサイズを大きくしても意味がないので、標準のインストールに(/var/lib/mysql/)で様子を見ながらmysqlサイズを大きくすることにします。このばあいでもやはり簡単に引っ越しする技術が必要になりますね。

        おっしゃる様に「研究あるのみ」です。

        • hero より:

          ご返信が遅くなってしまい申し訳ありませんでした。

          > OSが違うと全く同じではありえませんよね。
          そうですね、フォルダ丸ごとコピーによる引っ越しは、OSが異なるとできない(Pathの書き方が異なるなどのOS差に引っ張られるため)と考えます。
          OSが異なる場合は、MongoDBのrocketchatデータベースをダンプし、それをリストアする方法が一番手っ取り早いと考えます。
          (MongoDBは、windowsやcentosでも動作するので、OS間の差異はなさそうだと考えます。)

          Rocket.Chatのスキーマ構造は以下に掲載していますので、ご参考になれば幸いです。

          参照:http://kakedashi-xx.com:25214/index.php/2020/09/27/post-736/

          ちなみに、Rocket.Chatのリストアに関して実機検証をしてみました。
          少しでもご参考になれば、幸いです。

          参照:http://kakedashi-xx.com:25214/index.php/2020/12/20/post-1578/