プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2023/10/19

Rocket.Chat 移行後にアップロードファイルの URL が古いままになっている

event_note2023/10/19 6:18

Rocket.Chat を移行したのですが、アップロード済みファイルの URL と、サイト URL のリセット値が、移行前の古い URL のままになっていました。

概要

  • Rocket.Chat を移行し、ドメイン (サイトURL) が変わった
  • その際、Rocket.Chatを 3.10.14 から 6.2.12 にアップグレードしている
    • MongoDB も 4.0 から 5.0 にアップグレード
  • Rocket.Chat 起動時に指定する環境変数 ROOT_URL は移行後の URL を設定済み
  • Rocket.Chat の管理者メニューで設定できる サイト URL も移行後の URL を設定済み

この状況で、以下の2つの不具合を確認しました。

  1. アップロード済みのファイルの URL (ダウンロードリンク) が移行前の古い URL になっている
  2. Rocket.Chat の管理者メニューで設定できる サイト URL について、リセットボタンを押すと移行前の古い URL がセットされる

先に結論

1. については MongoDB のデータを直接修正すれば直りました。
2. については未解決です。

MongoDB のデータを確認することにしたきっかけ

いろいろググっていく中で以下のページに辿り着きました。

こちらの方法を試しても今回発生している不具合は直りませんでしたが、これをきっかけに MongoDB の中身を調査していくことで修正できました。

MongoDB の中身の確認方法については以下が参考になりました。

調査の過程と修正方法

Rocket.Chat と MongoDB は docker で動かしています。
なので、まず MongoDB の docker コンテナに入ります。

$ docker exec -it rocketchat-mongo bash

コンテナに入ったら MongoDB シェルを開き、rocketchat のデータベースを選択します。

# mongo
> use rocketchat

コレクションを表示してみます。

> show collections

たくさん表示されますが、ここから不具合内容に該当する箇所を推測して調査していきます。

1. アップロードファイルのダウンロードリンクについて

前述の 1. についてですが、こちらはアップロードファイルに関することなので、rocketchat_uploads の中身を表示してみました。

> db.rocketchat_uploads.find()

20件のみ表示されますが、適当なデータ一件について中身をみると以下のような感じになっていました。

{
    "_id": "27JzjqpXHxAHBzaxp",
    "name": "hoge.jpg",
    "size": 51268,
    "type": "image/jpeg",
    "rid": "MgKrXXN4XmQwtMMjgjXnWzpNvR6YrRpH4F",
    "userId": "jXnWzpNvR6YrRpH4F",
    "store": "GridFS:Uploads",
    "_updatedAt": ISODate("2023-07-26T03:58:50.233Z"),
    "instanceId": "R252ARSHBKR3RrXHY",
    "identify": {
        "format": "jpeg",
        "size": {
            "width": 495,
            "height": 700
        }
    },
    "complete": true,
    "etag": "HoMjiYj2fbb799RFK",
    "path": "/ufs/GridFS:Uploads/27JzjqpXHxAHBzaxp/%E5%90%8D%E7%A7%B0%E6%9C%AA%E8%A8%AD%E5%AE%9A%201.jpg",
    "progress": 1,
    "token": "68c8A8CAb8",
    "uploadedAt": ISODate("2023-07-26T03:58:50.852Z"),
    "uploading": false,
    "url": "http://old_domain:port/ufs/GridFS:Uploads/27JzjqpXHxAHBzaxp/%E5%90%8D%E7%A7%B0%E6%9C%AA%E8%A8%AD%E5%AE%9A%201.jpg",
    "typeGroup": "image"
}

見てわかる通り、url のフィールドにファイルへの絶対パスが記録されているため、これを修正しないと直らないんじゃないかと思いました。

というわけで、以下のコマンドでドメインの部分のみを置換します。

db.rocketchat_uploads.find().forEach(function(row) {
  row.url = row.url.replace(new RegExp("old_domain", 'g'), "new_domain");
  db.rocketchat_uploads.save(row);
});

これで Rocket.Chat のほうを確認すると、URL が直っていました。

2. サイト URL` のリセット値について

次に前述の 2. についてですが、設定に関することなので rocketchat_settings を確認してみました。 こちらはついては中身を全てを見たかったので、以下のようにして json ファイルに出力して確認しました。

$ mongoexport -d rocketchat -c rocketchat_settings -o rocketchat_settings.json --type=json mongodb://localhost:27017

で、中身を確認してみましたが、それらしい設定は見当たりませんでした。
他のコレクションもいろいろ確認してみましたが、それらしい設定は見つかっていません。

というわけで未解決ですが、特に実害はないので放っておいてます。