Rocket.Chatとは?
ロケットチャットとはオープンソースでフリーに使えるチャットシステムで簡単に言うとSlackのようなもの。
そしてフリーとはいいつつも、Windows/Mac/Linux/iOS/Androidに対応&Pluginで他のアプリと連携可能&RESTにも対応と、かなり高機能です。
そんなロケットチャットの実体はHTTP Server,Node.js,DBの三層構造で、よく見るのは
Apache HTTP Server、Rocket.Chat、MongoDBという構成となっているため、データは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にどのようにメッセージが格納されているか調査した結果でした。