Growiを導入するためにMongoDBが必要となったため、とりあえず最低限の設定までのメモ。
MongoDBは、ドキュメント志向の柔軟性の高いデータベースサーバで、基本的にJSON形式でデータを保持する。特徴的なのが、ログインして利用したいデータベースに移動(use <DB名>)してデータをストアした時点で、初めてデータベースが作成される点である。同様に、リレーショナルデータベースにおけるテーブルにあたるコレクションも、任意の名称を指定してストアした段階で新たに作成される。Gentoo Linuxではインストール直後はユーザ認証等が設定されておらず、誰でも接続して任意のデータベース、コレクションを作成できてしまう。テスト用には便利だが、本格運用には最低限ユーザ認証程度はしておきたい。
インストール
> emerge -av mongodb
設定は、 mongodb.confいYAML形式で記述していく。とりあえずインストール直後の状態で起動すれば、最低限は動作する。設定ファイルを編集する前に、まず管理ユーザを作成する。
ユーザの作成は、mongoコマンドでデータベースに接続し、db.createUser()関数にJSON形式でパラメータを与えて行う。
> mongo # admin データベースに移動 mongo > use admin mongo > db.createUser({ user: "admin", pwd: passwordPrompt(), roles: [ { role: "root", db: "admin" }, { role: "userAdmin", db: "admin" }, { role: "userAdminAnyDatabase", db: "admin" } ] })
pwdにpasswordPrompt()関数を指定することで、コマンド実行時にパスワードプロンプトが表示される。roleについては、どのデータベースに対するものかを指定する。指定している「userAdmin」「userAdminAnyDatabase」は、adminデータベース自身、および他のすべてのデータベースのユーザ管理ができる権限。この権限を持っていても、データベースの内容を表示したり更新することはできない。管理用コマンドを実行するためには「root」ロールも必要なので追加。
mongoターミナルを抜けてmongodb.confファイルを編集し、ユーザ認証を有効かしてサーバを再起動する。
setParameter: enableLocalhostAuthBypass: false security: authorization: enabled
「enableLocalhostAuthBypass」をtrueに設定すると、「最初の」ユーザを作成するまではローカルホストからの接続時に認証をバイパスする設定のようだ。ユーザを作成した後はtrueに設定しても認証はバイパスされない。念のためfalseに設定。認証を有効にするのは下段のsecurityのauthorizationパラメータ。
管理ユーザを作成し、認証を有効にしてもmongoコマンドで接続することはできる。しかし、認証が有効になっているのでデータのストアができない。認証は、コマンドの引数で指定するか、接続後にdb.autu()関数を利用する。
> mongo -u admin -p --authenticationDatabase admin
ユーザが所属するデータベースも指定しなければならない。上で作成した管理ユーザでログインする。ログイン後、growi用のユーザを作成する。
mongo > use growi mongo > db.createUser({ user: "growi", pwd: passwordPrompt(), roles: [ { role: "readWrite", db: "growi" } ] })
この段階では「growi」データベースは存在しないが、growiデータベースに対するユーザは作成される。growiユーザで接続すると、growiデータベース以下で「read」と「write」を行うことができる。
ユーザは、adminデータベースのsystem.usersコレクションで管理されているようだ。
基本的にコマンドで細かな管理を行うわけではないが、データを確認したりするのに有用なコマンド。
# データベースの一覧 mongo > show dbs # コレクションの一覧 mongo > use <DB名> mongo > show collections # コレクション内のデータ確認 mongo > db.<コレクション名>.find() # ユーザの一覧 mongo > use <DB名> mongo > show users
権限がなくても、useでどのデータベースにも移動できるし、showコマンドも発行できるが、権限がなければエラーとなったり何も表示されない。user一覧は、useで接続したDBに登録されたユーザを表示する。