カテゴリー
コンピューター

【MongoDB】mongo-express で db 以外のデータベースにアクセスできない問題を解決!

問題

  • mongo-express のインストールは完了しており、ウェブブラウザからアクセスできている。
  • db データーベースが用意されており、コレクション、ドキュメント、フィールドを追加することができた。
  • 他のデータベースの追加操作はできたが、mongo-express に表示されない。
  • Mongo シェルから show dbs すると、mongo-express から作成したデータベースを確認できた。

環境

  • CentOS 6 64 bit
  • Node.js v6.3.0
  • MongoDB 3.2
  • Mongo Express 0.30.59

問題発生時までに、今までに行っていた mongo-express 設定

mongo-express が listen する IP アドレスを localhost から仮想マシンの IP アドレスである 192.168.56.11 に変更しておりました。

cp /usr/lib/node_modules/mongo-express/config.default.js /usr/lib/node_modules/mongo-express/config.js
sed -i -e "s/host:             process.env.VCAP_APP_HOST                 || 'localhost',/host:             process.env.VCAP_APP_HOST                 || '192.168.56.11',/" /usr/lib/node_modules/mongo-express/config.js

解決するのに使ったコマンドたち

コマンドライン

# mongo-express を起動
mongo-express

# mongo-express 設定ファイルを編集
cd /usr/liv/node_modules/mongo-express/
vim config.js

# MongoDB に入る
mongo

Mongo シェル

ユーザ一覧表示
use admin
db.system.users.find()

スーパーユーザ作成(admin データベースに root ロールのユーザ追加)
use admin
db.createUser(
  {
    user: "root",
    pwd: "password",
    roles: ["root"]
  }
)

ユーザの削除
use admin
db.system.users.remove({user: "root"})

mongo-express ですべてのデータベースを扱えるようにする解決方法まとめ

  • mongo-express の config.js にある、module.exports の mongodb の admin を true に設定する。
  • MongoDB の admin データベースに、ユーザを追加する必要はない。

以下、これらの結論に到達するまでの試行錯誤の記録です。

試行錯誤 1. 調査

mongo-express を起動してみました。

少なくとも

errmsg: ‘Authentication failed.’

と認証が上手くいっていないことがわかります。

# mongo-express 
Welcome to mongo-express
------------------------


Mongo Express server listening at http://192.168.56.11:8081
basicAuth credentials are "admin:pass", it is recommended you change this in your config.js!
Database connected
Connecting to db...
{ MongoError: Authentication failed.
    at Function.MongoError.create (/usr/lib/node_modules/mongo-express/node_modules/mongodb-core/lib/error.js:31:11)
    at /usr/lib/node_modules/mongo-express/node_modules/mongodb-core/lib/connection/pool.js:442:41
    at authenticateStragglers (/usr/lib/node_modules/mongo-express/node_modules/mongodb-core/lib/connection/pool.js:402:16)
    at .messageHandler (/usr/lib/node_modules/mongo-express/node_modules/mongodb-core/lib/connection/pool.js:424:5)
    at Socket.<anonymous> (/usr/lib/node_modules/mongo-express/node_modules/mongodb-core/lib/connection/connection.js:294:22)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at readableAddChunk (_stream_readable.js:177:18)
    at Socket.Readable.push (_stream_readable.js:135:10)
    at TCP.onread (net.js:542:20)
  name: 'MongoError',
  message: 'Authentication failed.',
  ok: 0,
  code: 18,
  errmsg: 'Authentication failed.' }
Could not authenticate to database "db"
Database db connected

次のページが参考になるかしら。

  1. 認証用のデータベース、ユーザ、パスワードを MongoDB に作成する。
  2. 認証用のデータベース、ユーザ、パスワードを mongo-express に設定する。

もしくは、MongoDB の認証を無効にすればよいかしら?こちらの道をあえて探ってみます。

  • MongoDB は初期状態で認証が無効となっている。
  • mongo-express 設定では次の部分、と思われた。
      mongo = {
        db:       'db',
        host:     'localhost',
        password: 'pass',
        port:     '27017',
        ssl:      'false',
        url:      'mongodb://localhost:27017/db',
        username: 'admin',
      };
    

試行錯誤 2. 1 つの MongoDB のみを mongo-express で扱えるようにできた

password と username を空にすることで、Mongo Express の認証を無効にできるかどうか試しました。

  mongo = {
    db:       'db',
    host:     'localhost',
    password: '',
    port:     '27017',
    ssl:      'false',
    url:      'mongodb://localhost:27017/db',
    username: '',
  };

上記のようにすることで、エラーは消えました!

しかし、db 以外のデータベースは Mongo Express からは扱えないままでしたの><。

# mongo-express 
Welcome to mongo-express
------------------------


Mongo Express server listening at http://192.168.56.11:8081
basicAuth credentials are "admin:pass", it is recommended you change this in your config.js!
Database connected
Connecting to db...
Database db connected

そこで、先ほどの設定の db オプション部分の指定に、操作したいデータベースを記入することで、そのデータベースを Mongo Express から扱えるようになりました!

つまり、

  mongo = {
    db:       'db',
... 略 ...

  mongo = {
    db:       'mydb',
... 略 ...

とすることで、mydb だけは Mongo Express から扱えるようになりました!

試行錯誤 3. MongDB に認証用のユーザを追加してみるも、ダメ

目的は、すべての MongoDB を Mongo Express から扱うことですの。試行錯誤は続きます。

mongo-express 設定の次が鍵かしら、とあたりをつけました。

    //  >>>>  If you are using an admin mongodb account, or no admin account exists, fill out section below
    //  >>>>  Using an admin account allows you to view and edit all databases, and view stats

    //leave username and password empty if no admin account exists
    adminUsername: process.env.ME_CONFIG_MONGODB_ADMINUSERNAME || '',
    adminPassword: process.env.ME_CONFIG_MONGODB_ADMINPASSWORD || '',

結局、以前に確認した認証用のユーザを MongoDB に作成した、Mongo Express に設定、が必要そうですの。。。

まずは、MongoDB に認証用のユーザを追加いたします。

mongo で Mongo シェルに入り、次の操作をいたしました。

use admin
db.createUser(
  {
    user: "root",
    pwd: "vagrant",
    roles: [ "root" ]
  }
)

Mongo Express 設定は次のようにしました。

    adminUsername: process.env.ME_CONFIG_MONGODB_ADMINUSERNAME || 'root',
    adminPassword: process.env.ME_CONFIG_MONGODB_ADMINPASSWORD || 'vagrant',

しかし、ダメでしたの><。

試行錯誤 4. admin オプションを固定値にすることで、解決!

ポイントとして目をつける場所を変えましょう。コメントを読むと、、、ここかしら。

    //set admin to true if you want to turn on admin features
    //if admin is true, the auth list below will be ignored
    //if admin is true, you will need to enter an admin username/password below (if it is needed)
    admin: process.env.ME_CONFIG_MONGODB_ENABLE_ADMIN ? process.env.ME_CONFIG_MONGODB_ENABLE_ADMIN.toLowerCase() === 'true' : false,

動的に定めているようですので、あまり触りたくないのですけれども、admin を次のようにいたしました。

    admin: true,

Mongo Express を起動いたしますと、、、やりました!すべてのデータベースを扱えるようになりましたわ!

その後、今までの対処をひとつひとつ見直していきますと、試行錯誤 4 以外のMongoDB へのユーザ追加は不要であることや、config.js の admin 以外の変更は不要であることがわかりました!

おわりに

MongoDB について無知なうえに、Mongo Express は気軽に見られる情報が少なくて解決するのに時間がかかってしまいました><。

解決してしまえばどうってことのない内容でしたの♪

以上です。

コメントを残す