序章

Apache CouchDB は、Redis、Cassandra、MongoDBと同様に、NoSQLデータベースです。 CouchDBは、データを非リレーショナルのJSONドキュメントとして保存します。 これにより、CouchDBのユーザーは、実際の対応するものと非常によく似た方法でデータを保存できます。

CouchDBは、コマンドラインまたはFutonと呼ばれるWebインターフェイスから管理できます。 Futonは、CouchDBのデータベース、ドキュメント、ユーザーの作成や操作などの管理タスクを実行するために使用できます。

目標

この記事の終わりまでに、次のことを行います。

  • Ubuntu14.04を実行しているドロップレットにCouchDBをインストールします
  • 同じサーバーに布団を設置する
  • CouchDBのインストールを保護しました
  • 安全なトンネルを使用して、ローカルマシンからFutonを使用してCouchDBにアクセスします
  • 管理者ユーザーをCouchDBに追加する方法を知っている
  • Futonを使用してCouchDBでCRUD操作を実行する
  • コマンドラインからCouchDBを使用してCRUD操作を実行します

前提条件

次の前提条件を完了してください。

注:このチュートリアルではroot以外のユーザーを想定していますが、sudoユーザーを作成したくない場合は、rootユーザーとして以下の手順を実行することもできます。 root以外のユーザーを使用する場合は、sudoを使用してコマンドを初めて実行するときにパスワードの入力を求められることに注意してください。

ステップ1—サーバーの準備

CouchDBをインストールする前に、サーバーがCouchDB用にセットアップされていることを確認する必要があります。

システムを更新することから始めます。

  1. sudo apt-get update

ソースリポジトリの管理を可能にするソフトウェアをインストールします。

  1. sudo apt-get install software-properties-common -y

注: -yフラグは、apt-getコマンドに、インストールプロセス中に表示される可能性のあるすべてのプロンプトに対してYes応答を想定するように指示します。 プロンプトに手動で応答したい場合は、このフラグを削除できます。

適切なリポジトリから最新のCouchDBバージョンをフェッチするのに役立つPPAを追加します。

  1. sudo add-apt-repository ppa:couchdb/stable -y

警告:サーバーに新しいパーソナルパッケージアーカイブ(PPA)を追加するときは、細心の注意を払う必要があります。 誰でもPPAを作成できるため、PPAが信頼できる、または安全であるという保証はありません。 この場合、上記のPPAは公式のものであり、ApacheCouchDBチームによって維持されています。

新しいPPAを追加したので、最新のパッケージ情報を持つようにシステムを更新しましょう。

  1. sudo apt-get update

これで、CouchDBとFutonをインストールする準備が整いました。

ステップ2—CouchDBをインストールする

以前にこのサーバーにCouchDBをインストールしていた場合は、既存のバージョンを削除することから始めます。

  1. sudo apt-get remove couchdb couchdb-bin couchdb-common -yf

注:新しいドロップレットがある場合は、この手順を無視できます。

次に、CouchDBをインストールします。

  1. sudo apt-get install couchdb -y

これにより、CouchDBとFutonがサーバーにインストールされます。

デフォルトでは、CouchDBは localhost で実行され、ポート5984を使用します。 コマンドラインからcurlを実行すると、この基本情報を取得できます。

  1. curl localhost:5984

注: curlがインストールされていない場合は、sudo apt-get install curlコマンドを使用してインストールできます。

次のようなものが得られるはずです。

Output
{"couchdb":"Welcome","uuid":"b9f278c743b5fc0b971c4e587d77582e","version":"1.6.1","vendor":{"name":"Ubuntu","version":"14.04"}}

これで、curl -X PUTコマンドを使用して新しいデータベースを作成できます。

  1. curl -X PUT localhost:5984/new_database

結果は次のようになります。

Output
{"ok":true}

ステップ3—CouchDBインストールの保護

デフォルトでは、CouchDBのインストール時に作成されるファイルとディレクトリの一部は、rootユーザーとグループに属しています。 これは開発中は問題ありませんが(お勧めできませんが)、本番環境ではセキュリティリスクになる可能性があります。

CouchDBをインストールすると、couchdbという名前のユーザーとグループが作成されます。 このセクションでは、CouchDBファイルの所有権と権限をcouchdbユーザーとグループに変更します。

CouchDBプロセスがアクセスできる所有権コントロールwhatを変更し、CouchDBファイルとディレクトリにアクセスできる権限コントロールwhoを変更します。

所有権と権限を変更する前に、CouchDBを停止してください。

  1. sudo stop couchdb

/usr/lib/couchdb/usr/share/couchdb/etc/couchdbディレクトリ、および/usr/bin/couchdb実行可能ファイルの所有権を、所有者がcouchdbになるように変更します。 ]そしてそれらはcouchdbグループに属しています。

  1. sudo chown -R couchdb:couchdb /usr/lib/couchdb /usr/share/couchdb /etc/couchdb /usr/bin/couchdb

ここで、/usr/lib/couchdb/usr/share/couchdb/etc/couchdbディレクトリ、および/usr/bin/couchdb実行可能ファイルのアクセス許可を、couchdbのように変更します。 ]ユーザーとcouchdbグループは(CouchDBインストールへの)完全なアクセス権を持っていますが、他のユーザーはこれらのファイルとディレクトリにアクセスできません。

  1. sudo chmod -R 0770 /usr/lib/couchdb /usr/share/couchdb /etc/couchdb /usr/bin/couchdb

あとは、CouchDBを再起動するだけです。

  1. sudo start couchdb

これで、CouchDBは、rootユーザーまたはrootグループに属するファイルまたはディレクトリなしで稼働しているはずです。

ステップ4—布団へのアクセス

CouchDBは、Futonと呼ばれる便利なWebベースのコントロールパネルを提供します。 ローカルワークステーションからアクセスし、SSH接続を介してサーバーにトラフィックをトンネリングします。 これは、サーバーにSSHでログインしているユーザーのみがFutonコントロールパネルにアクセスできることを意味します。

CouchDBに安全に接続するために、公開せずに、ローカルポート5984からリモートサーバーのポート5984へのSSHトンネルを作成できます。

ローカルコンピューターから実行する次のコマンドを使用して、トンネルを設定できます。

  1. ssh -L5984:127.0.0.1:5984 sammy@your_server_ip

注: sammy をユーザー名に、your_server_ipをドロップレットのIPアドレスに置き換えることを忘れないでください。

接続が開いている間は、ポート5984を使用して、お気に入りのWebブラウザからFutonにアクセスできます。 このURLにアクセスして、役立つ布団ページを表示します。

http://localhost:5984/_utils

Futon Home Page Screenshot

デフォルトでは、FutonにアクセスするすべてのCouchDBユーザーは管理者権限でアクセスします。 これは右下隅で発表されます:

Welcome to Admin Party! Everyone is admin. Fix this

これを変更するには、小さな Fix this リンクをクリックして、新しい管理者を作成します。

ステップ5—管理者ユーザーの追加

CouchDBが稼働しているので、それを使い始めましょう。

管理者ユーザーが作成される前に、すべてのユーザーは管理者権限でCouchDBにアクセスできます(ただし、最初にサーバーへのSSHアクセスが必要です)。

偶発的または不正なデータ損失を防ぐために、CouchDBの管理者アカウントを作成することをお勧めします。

これを行うには、布団の右下隅に表示される [Fixthis]リンクをクリックします。 これにより、次のようにCouchDB管理者ユーザーを作成できる画面が表示されます。

Admin User Creation Screen

目的のユーザー名とパスワードを入力します。

Enter a username, such as "admin", and a password

新しいCouchDBユーザー名と安全なパスワードを入力したら、作成ボタンをクリックします。 これにより、新しい管理者ユーザーが作成されます。 布団の右下にあるメッセージは、次のようなメッセージを表示してこれを確認します。

Welcome admin! Setup more admins or Change password or Logout

注:管理者ユーザーを作成すると、許可されていないユーザーがデータベース、設計ドキュメント、およびCouchDB構成を削除および変更するのを防ぐことができます。 ただし、ドキュメントの作成やアクセスを妨げることはありません。

サーバーへのSSHアクセスの配布には注意してください。

それでおしまい! これで、CouchDBサーバーが完全に構成されました。

データベースの使用について詳しくは、読み続けてください。

布団からCRUD操作を実行する

Futonには、基本的なCRUD操作(作成、読み取り、更新、削除)を実行できる非常にシンプルで便利なユーザーインターフェイスがあります。

このセクションでは、todosという名前の新しいデータベースを作成し、それに新しいドキュメントを追加してから、このドキュメントを取得、更新、および削除します。

注:管理者ユーザーを作成した場合、新しいデータベースを作成するには、管理者としてログインする必要があります。

SSHトンネルがまだ開いていることを確認してください。 そうでない場合は、次のコマンドを使用して、ローカルコンピューターからサーバーへの接続を開きます。

  1. ssh -L5984:127.0.0.1:5984 sammy@your_server_ip

http://localhost:5984/_utils/の布団のページから始めましょう。

注:このセクションでは、上記の布団へのアクセスセクションで説明されているように設定されたSSHトンネルを使用してCouchDBにアクセスしていることを前提としています。 設定が異なる場合は、正しいURLで布団にアクセスしてください。

データベースとドキュメントを作成する

Futon Homepage

todosという名前の新しいデータベースを作成するには、画面のデータベースの作成リンクをクリックします。 これにより、次のようなダイアログが表示されます。

New Database Dialog; enter Database Name

データベースの名前を入力し、作成ボタンをクリックします。

これにより、todosという名前の新しいデータベースが作成され、新しく作成されたデータベースでドキュメントの作成と変更を開始できるページに移動します。

"todos" Database Page

ドキュメントを作成する

新しいドキュメントを作成するには、ページの新しいドキュメントリンクをクリックします。

これにより、新しいドキュメントを含む画面が開きます。 このドキュメントには、_idフィールドのみが含まれます。 必要に応じてこのフィールドの値を変更するか、そのままにしておくことができます。

Click the Add Field link; double-click the null value to update it

フィールドの追加リンクをクリックして、このドキュメントに新しいフィールドを追加します。

上記のように、tododoneという名前の2つのフィールドを追加しました。 デフォルトでは、新しいフィールドの値はnullです。

値をダブルクリックして変更します。

この例では、tododoneの値フィールドをダブルクリックし、それぞれTask 1falseの値を入力しました。

値を入力したら、ENTERキーを押すか、フィールドの横にある小さな緑色のチェックマークをクリックして内容を保存します。 (これを行わないと、フィールドの値はnullのままになります。)これは次のようになります。

Create and Save Field and Values

ドキュメントを保存するには、ドキュメントの保存リンクをクリックします。 ドキュメントを保存すると、_revフィールドが次のように追加されていることがわかります。

_rev field

ドキュメントを読む

todosリンク(Overviewリンクの横のトップバー)をクリックして、todosデータベース内の唯一のドキュメントとして新しく作成されたドキュメントを表示します。

Todos Database Page

表内のドキュメントのキー(ID)をクリックして、ドキュメントの詳細ページにアクセスします。

ドキュメントを編集する

このページでは、次のようにドキュメントフィールドを編集および更新できます。

Document Details Page

フィールド値を編集するには、フィールド値をダブルクリックして編集を開始します。

_idおよび_revフィールドを除く)任意のフィールドを削除したり、新しいフィールドを追加したり、既存のフィールドの値を変更したりできます。 この例では、doneフィールドの値をfalseからtrueに次のように変更しました。

Change Field Value: "done" field from "false" to "true"

変更内容に問題がなければ、[ドキュメントの保存]リンクをクリックしてドキュメントを更新します。 これを行うと、_revフィールドの値も更新されていることがわかります。

Save the changes

ドキュメントを削除する

ドキュメントを削除するには、ドキュメントの削除リンクをクリックして、確認を求めるメッセージを表示します。

Are you sure you want to delete this document?

削除ボタンを押して確定します。

布団がドキュメントを削除し、todosデータベースページに移動します。このページは空になっているはずで、ドキュメントが実際に削除されたことを確認します。

Todos Database Page

コマンドラインからのCRUD操作の実行

このセクションでは、curlを使用して、コマンドラインからCouchDBデータベースに対して基本的なCRUD(作成、読み取り、更新、および削除)操作を実行する方法を説明します。

SSHトンネルがまだ開いていることを確認してください。 そうでない場合は、次のコマンドを使用して、ローカルコンピューターからサーバーへの接続を開きます。

  1. ssh -L5984:127.0.0.1:5984 sammy@your_server_ip

注:このセクションでは、上記の手順2( CouchDB のインストール)で作成したデータベースnew_databaseを使用します。 このセクションでは、上記の布団へのアクセスの手順で説明されているように、SSHトンネルを使用してCouchDBにアクセスしていることも前提としています。 設定が異なる場合は、以下で使用するコマンドを実行する際に、URL、PORT、およびデータベース名を適切に置き換えるようにしてください。

データベースを作成する

データベースnew_databaseをまだ作成していない場合は、ここで作成してください。 このコマンドは、ローカルワークステーションから実行する必要があります。

  1. curl -X PUT http://localhost:5984/new_database -u "admin:password"
  2. {"ok":true}

管理者ユーザーをCouchDBに追加したため、新しいデータベースを作成するときに管理者のユーザー名とパスワードを送信する必要があります。

結果は次のようになります。

Output
{"ok":true}

ドキュメントを作成する

新しいドキュメントを作成することから始めましょう。

  1. curl -X POST -d '{"todo":"task 1", "done":false}' http://localhost:5984/new_database -H "Content-Type:application/json"

このコマンドは、new_databaseデータベースに新しいドキュメントを作成します。

-Xフラグは、HTTPPOST操作を実行していることを示します。 JSONドキュメントをPOSTしているため、-Hフラグの後にヘッダーが続くと、このリクエストのコンテンツタイプがapplication/jsonに設定されます。 最後に、JSONドキュメント自体が-dフラグとともに含まれています。

この操作の応答は次のとおりです。

Output
{"ok":true,"id":"803da996e1524591ce773d24400004ff","rev":"1-2fc1d70532433c39c9f61480607e3681"}

この応答の"ok":trueの部分は、操作が成功したことを示しています。 応答には、idフィールドとrevフィールドが含まれます。これらは、それぞれドキュメントIDとドキュメントリビジョンを表します。 このドキュメントを変更または削除する必要がある場合は、これらのフィールドの両方が必要になります。

この例では、コマンドでドキュメントIDを指定しなかったため、ドキュメントIDはCouchDBによって生成されました。 必要に応じて、生成した一意のIDを使用してドキュメントを作成できます。

指定されたIDで作成

IDrandom_taskでドキュメントを作成します。

  1. curl -X POST -d '{"_id":"random_task", "todo":"task 2", "done":false}' http://localhost:5984/new_database -H "Content-Type:application/json"

このコマンドは、IDがrandom_taskに設定された新しいドキュメントを作成します。 このコマンドへの応答は次のとおりです。

Output
{"ok":true,"id":"random_task","rev":"1-bceeae3c4a9154c87db1649473316e44"}

複数のドキュメントを作成する

単一のドキュメントを作成するだけでなく、ドキュメントをまとめて作成することもできます。

  1. curl -X POST -d '{"docs": [{"todo":"task 3", "done":false}, {"todo":"task 4", "done":false}]}' http://localhost:5984/new_database/_bulk_docs -H "Content-Type:application/json"

このコマンドは、POST本文で指定されているように2つのドキュメントを作成します。 単一ドキュメントの挿入と比較して、2つのわずかな違いがあります。

  1. 単一のドキュメントを挿入している間、POST本文は単なる標準のJSONオブジェクトでした。 一括挿入の場合、POST本体はdocsフィールドを持つオブジェクトで構成されます。 このフィールドには、挿入されるドキュメントの配列が保持されます。
  2. 単一のドキュメントを挿入しているときに、POSTリクエストがデータベースを指すURL(http://localhost:5984/new_database)に送信されました。 ただし、一括挿入のリクエストはhttp://localhost:5984/new_database/_bulk_docsURLにPOSTします。

一括挿入操作の応答は次のとおりです。

Output
[{"ok":true,"id":"803da996e1524591ce773d24400007df","rev":"1-778fd61f8f460d0c1df1bb174279489d"},{"ok":true,"id":"803da996e1524591ce773d2440001723","rev":"1-dc9e84861bba58e5cfefeed8f5133636"}]

ドキュメントを読む

CouchDBデータベースからドキュメントを取得するのは、HTTPGETコマンドを発行するだけです。 上で作成したドキュメントの1つであるrandom_taskを取得してみましょう。

  1. curl -X GET http://localhost:5984/new_database/random_task

URLには、取得するドキュメントのID(random_task)が含まれていることに注意してください。 このGETリクエストへの応答には、以下に示すように、ドキュメント全体と、このドキュメントの更新または削除に使用できる_idおよび_revフィールドが含まれています。

Output
{"_id":"random_task","_rev":"1-bceeae3c4a9154c87db1649473316e44","todo":"task 2","done":false}

ドキュメントを編集する

ドキュメントを更新しようとするときは、_revフィールドを含めることが重要です。 CouchDBは、_revフィールドを含まない更新リクエストを拒否します。 CouchDBはドキュメントの一部だけでなくドキュメント全体を更新するため、更新操作中にドキュメント全体をリクエスト本文で送信する必要があります。

ID random_taskで作成されたドキュメントを更新するには、次のようにHTTPPUTリクエストを発行する必要があります。

  1. curl -X PUT -d '{"_rev":"1-bceeae3c4a9154c87db1649473316e44", "todo":"task 2", "done":true}' http://localhost:5984/new_database/random_task

_revの値は、前の出力で受け取った文字列に必ず置き換えてください。

これにより、ドキュメントが変更され、doneフィールドがtrueに更新されます。 このリクエストへの応答は次のとおりです。

Output
{"ok":true,"id":"random_task","rev":"2-4cc3dfb6e76befd665faf124b36b7f1c"}

応答に見られるように、この特定のドキュメントのrevフィールドは、更新後に変更されます。 このドキュメントを更新または削除する今後のリクエストでは、最新のrev値を使用する必要があります。

ドキュメントを削除する

この新しいrev値を使用して、次のようにHTTPDELETE要求を使用してこのドキュメントを削除してみましょう。

  1. curl -X DELETE http://localhost:5984/new_database/random_task?rev=2-4cc3dfb6e76befd665faf124b36b7f1c

上記のGET&PUTリクエストと同様に、DELETEリクエストはドキュメントを指すURLを使用します。 ただし、URLに追加のクエリパラメータも含まれています。 このパラメーターrevは、削除操作を成功させるために最新の_rev値を持っている必要があります。

この特定のケースでは、前のステップの更新操作の後に返された値を使用します。 上記のリクエストに対する応答を以下に示します。

Output
{"ok":true,"id":"random_task","rev":"3-07d6cde68be2a559497ec263045edc9d"}

CouchDBサービスの再起動、停止、および開始

CouchDBサービスの開始、停止、再起動は非常に簡単です。 サーバーからこれらの手順を実行します。

再起動

実行中のCouchDBインスタンスを再起動するには、次のコマンドを実行します。

  1. sudo restart couchdb

このコマンドは、実行中のCouchDBインスタンスを再起動し、新しいインスタンスのプロセスIDを表示します。 実行中のCouchDBのインスタンスがない場合、このコマンドを実行すると、次のようなメッセージが表示されます。

Output
restart: Unknown instance:

止まる

実行中のCouchDBインスタンスを停止するには、次のコマンドを実行します。

  1. sudo stop couchdb

このコマンドを実行すると、実行中のCouchDBインスタンスが停止し、次のような確認メッセージが表示されます。

Output
couchdb stop/waiting

始める

CouchDBを起動するには、次のコマンドを実行します。

  1. sudo start couchdb

CouchDBがまだ実行されていない場合、このコマンドを実行するとCouchDBが起動し、次のような確認メッセージが表示されます。

Output
couchdb start/running, process 12345

一方、CouchDBインスタンスがすでに実行されている場合、上記のコマンドを実行すると、次のようなメッセージが表示されます。

Output
start: Job is already running: couchdb

状態

CouchDBのステータスを確認したい場合は、次のコマンドを使用して確認できます。

  1. sudo status couchdb

CouchDBが実行されている場合、次のようなメッセージが表示されます。

Output
couchdb start/running, process 12345

CouchDBが実行されていない場合、ステータスを確認すると次のようになります。

Output
couchdb stop/waiting

結論

これで、DropletにCouchDBが完全に機能するように設定されました。これは、Futonまたはコマンドラインを使用してローカルマシンから安全に管理できます。