(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Rocket.Chat】MongoDBにあるチャット内容の格納先

スポンサーリンク

Rocket.Chatとは?

ロケットチャットとはオープンソースでフリーに使えるチャットシステムで簡単に言うとSlackのようなもの。

そしてフリーとはいいつつも、Windows/Mac/Linux/iOS/Androidに対応&Pluginで他のアプリと連携可能&RESTにも対応と、かなり高機能です。

そんなロケットチャットの実体はHTTP ServerNode.jsDBの三層構造で、よく見るのは
Apache HTTP ServerRocket.ChatMongoDBという構成となっているため、データはMongoDBに格納されます。

MongoDBにチャット履歴はどのように格納されているのか

MongoDBのインストール周りに関しては以下記事でも触れています。

準備

RHEL系ですと以下コマンドでMongoDBが稼動していることを確認できます。

# systemctl status mongod.service

MongoDBと対話モードで接続すべくmongoコマンドにパスが通っていることを確認して

# which mongo
/usr/bin/mongo

起動してみてください。以下のように接続できます。

# mongo
MongoDB shell version vX.X.X
connectiong to : ...

まずRocket.Chat用のデータベースが存在することを確認します。

> show dbs
admin X.XGB
local X.XGB
rocketchat X.XGB

roketchat用のデータベースを対象に操作するので以下コマンドでDBを明示的に指定します。

> use rocketchat
switched to db rocketchat

本題

rocketchat用データベースにスイッチした状態で、コレクション一覧を表示します。

> show colletions
_raix_push_app_tokens
_raix_push_notifikations
....
rocketchat_message
....
user
usersSessions

このrocketchat_messageにチャット内容が格納されています。

試しに例えばプライベートチャネルを作成して test と送信します。

件数取得コマンドを発行すると確認できます。

> db.rocketchat_message.count()
1

そして肝心の中身は以下のように見えます。

> db.roketchat_message.find()
{ "_id" : "XXXX", "rid" : "XXXX", "msg" : "test", "ts" : ISODate("2019-..."), "u" : { "_id" : "XXXX", "username" : "admin". "name" : "admin" }, "mentions" : [ ], "channels" : [ ], "_updateAt" : ISODate("2019-...")}

"msg" : "チャットに送信した内容"という形式で格納されています。

終わりに

同DBに過去のやり取りが格納されているため、バックアップを取ることによってメッセージの消失対策が可能です。
ちなみにメッセージを消してしまえばDBからも消えてしまい、編集しても元のメッセージはDB上から消えるのでバックアップでも戻せません。ただし、editedByという項目がjson形式で追加されるので編集したという事は分かるようになっています。

以上、MongoDBにどのようにメッセージが格納されているか調査した結果でした。