久しぶりに CouchDB を使ったらユーザーが追加できなかった。 過去の自分用メモを元にセットアップしたのだが、 ユーザー追加部分でつまずいた。なぜかうまくいかない。
結論としては、このページ https://docs.couchdb.org/en/latest/setup/single-node.html に書いてあることを理解すればよい。
CouchDB は一台で運用(Single Node)か複数で運用(A Cluster)をセットアップ時に選ぶのだが、 Single Node を選択したときに _users データベースが用意されなくなったらしい。 Single Node で使う人は admin なしか、admin だけで運用するのが普通でしょ、という感じなのかもしれない。
なので、CouchDB のユーザーを追加する前にこの _users データベースを手動で追加してやれば問題ない。 以下、大まかなセットアップとセットアップ後に foo ユーザーを追加して、 mydb という名前のデータベースを作成して、そこに foo ユーザーを割り当てるところまでを書く。
このドキュメント https://docs.couchdb.org/en/stable/install/unix.html に従う。
インストール中にいくつかの質問に答える必要がある。
サーバタイプは standalone を選択。次に Magic Cookie を入れろと言われるが、 これはクラスタ構成で使うときに使うものらしいので、適当な文字列を入れた。 そして、IP address は 127.0.0.1 を使う。 最後に admin パスワードを入れる。 ここでは説明上 adminpass を admin のパスワードとして設定したとして以下説明を続ける。
以下のコマンドを使って CouchDB を起動,ステータス確認,停止させることができる。
$ sudo systemctl start couchdb
$ sudo systemctl status couchdb
$ sudo systemctl stop couchdb
curl を使って、起動しているかを確認することもできる。
$ curl http://admin:adminpass@127.0.0.1:5984/_up
起動していれば以下のようなメッセージが標準出力される。
{”status":"ok","seeds":{}}
mydb という名前のデータベースを追加しよう。
$ curl -X PUT http://admin:adminpass@127.0.0.1:5984/mydb
{"ok":true}
セキュリティチェックして、どのユーザーがこのデータベースを使えるか確認する。
$ curl -X GET http://admin:adminpass@127.0.0.1:5984/mydb/_security
{"members":{"roles":["_admin"]},"admins":{"roles":["_admin"]}}
今は admin しか存在しないから当然と言えば当然だが、admin のみがこのデータベースを使える設定になっている。
事前準備として Single Node としてセットアップした CouchDB 3.3 は _users データベースが存在していないから、 まずはそれをつくる。
$ curl -X PUT http://admin:adminpass@127.0.0.1:5984/_users
{"ok":true}
その上で、以下の user.json ファイルを作成。
{
"docs": [
{
"_id": "org.couchdb.user:foo",
"name": "foo",
"password": "hogehoge",
"roles": [],
"type": "user"
}
]
}
foo という名前でパスワードが hogehoge のユーザです。
そして、この user.json を使ってユーザを追加。
$ curl -X POST -H "Content-Type:application/json" -d @user.json http://admin:adminpass@127.0.0.1:5984/_users/_bulk_docs
[{"ok":true,"id":"org.couchdb.user:foo","rev":"1-b888de54be0845cb2d297b1af63dcf8e"}]
続いて、mydb に foo ユーザのアクセス件を与える。
そのために、security.json を作成。
{
"members": {
"roles": [
"_admin"
]
},
"admins": {
"roles": [
"_admin"
],
"names": [
"foo"
]
}
}
ここでは admins.names に foo ユーザを追加している。
これを mydb のセキュリティとして登録。
$ curl -X PUT -H "Content-Type:application/json" -d @security.json http://admin:adminpass@127.0.0.1:5984/mydb/_security
{"ok":true}
以上です。