How To Install CouchDB and Futon on Ubuntu 14.04
序章
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操作を実行します
前提条件
次の前提条件を完了してください。
- Ubuntu14.04ドロップレット
- 管理者権限を持つroot以外のユーザーとしてサーバーにログインしています( Ubuntu 14.04を使用したサーバーの初期設定)
注:このチュートリアルではroot以外のユーザーを想定していますが、sudoユーザーを作成したくない場合は、root
ユーザーとして以下の手順を実行することもできます。 root以外のユーザーを使用する場合は、sudo
を使用してコマンドを初めて実行するときにパスワードの入力を求められることに注意してください。
ステップ1—サーバーの準備
CouchDBをインストールする前に、サーバーがCouchDB用にセットアップされていることを確認する必要があります。
システムを更新することから始めます。
- sudo apt-get update
ソースリポジトリの管理を可能にするソフトウェアをインストールします。
- sudo apt-get install software-properties-common -y
注: -y
フラグは、apt-get
コマンドに、インストールプロセス中に表示される可能性のあるすべてのプロンプトに対してYes
応答を想定するように指示します。 プロンプトに手動で応答したい場合は、このフラグを削除できます。
適切なリポジトリから最新のCouchDBバージョンをフェッチするのに役立つPPAを追加します。
- sudo add-apt-repository ppa:couchdb/stable -y
警告:サーバーに新しいパーソナルパッケージアーカイブ(PPA)を追加するときは、細心の注意を払う必要があります。 誰でもPPAを作成できるため、PPAが信頼できる、または安全であるという保証はありません。 この場合、上記のPPAは公式のものであり、ApacheCouchDBチームによって維持されています。
新しいPPAを追加したので、最新のパッケージ情報を持つようにシステムを更新しましょう。
- sudo apt-get update
これで、CouchDBとFutonをインストールする準備が整いました。
ステップ2—CouchDBをインストールする
以前にこのサーバーにCouchDBをインストールしていた場合は、既存のバージョンを削除することから始めます。
- sudo apt-get remove couchdb couchdb-bin couchdb-common -yf
注:新しいドロップレットがある場合は、この手順を無視できます。
次に、CouchDBをインストールします。
- sudo apt-get install couchdb -y
これにより、CouchDBとFutonがサーバーにインストールされます。
デフォルトでは、CouchDBは localhost で実行され、ポート5984を使用します。 コマンドラインからcurl
を実行すると、この基本情報を取得できます。
- 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
コマンドを使用して新しいデータベースを作成できます。
- curl -X PUT localhost:5984/new_database
結果は次のようになります。
Output{"ok":true}
ステップ3—CouchDBインストールの保護
デフォルトでは、CouchDBのインストール時に作成されるファイルとディレクトリの一部は、rootユーザーとグループに属しています。 これは開発中は問題ありませんが(お勧めできませんが)、本番環境ではセキュリティリスクになる可能性があります。
CouchDBをインストールすると、couchdbという名前のユーザーとグループが作成されます。 このセクションでは、CouchDBファイルの所有権と権限をcouchdbユーザーとグループに変更します。
CouchDBプロセスがアクセスできる所有権コントロールwhatを変更し、CouchDBファイルとディレクトリにアクセスできる権限コントロールwhoを変更します。
所有権と権限を変更する前に、CouchDBを停止してください。
- sudo stop couchdb
/usr/lib/couchdb
、/usr/share/couchdb
、/etc/couchdb
ディレクトリ、および/usr/bin/couchdb
実行可能ファイルの所有権を、所有者がcouchdbになるように変更します。 ]そしてそれらはcouchdbグループに属しています。
- 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インストールへの)完全なアクセス権を持っていますが、他のユーザーはこれらのファイルとディレクトリにアクセスできません。
- sudo chmod -R 0770 /usr/lib/couchdb /usr/share/couchdb /etc/couchdb /usr/bin/couchdb
あとは、CouchDBを再起動するだけです。
- sudo start couchdb
これで、CouchDBは、rootユーザーまたはrootグループに属するファイルまたはディレクトリなしで稼働しているはずです。
ステップ4—布団へのアクセス
CouchDBは、Futonと呼ばれる便利なWebベースのコントロールパネルを提供します。 ローカルワークステーションからアクセスし、SSH接続を介してサーバーにトラフィックをトンネリングします。 これは、サーバーにSSHでログインしているユーザーのみがFutonコントロールパネルにアクセスできることを意味します。
CouchDBに安全に接続するために、公開せずに、ローカルポート5984からリモートサーバーのポート5984へのSSHトンネルを作成できます。
ローカルコンピューターから実行する次のコマンドを使用して、トンネルを設定できます。
- 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にアクセスするすべてのCouchDBユーザーは管理者権限でアクセスします。 これは右下隅で発表されます:
これを変更するには、小さな Fix this リンクをクリックして、新しい管理者を作成します。
ステップ5—管理者ユーザーの追加
CouchDBが稼働しているので、それを使い始めましょう。
管理者ユーザーが作成される前に、すべてのユーザーは管理者権限でCouchDBにアクセスできます(ただし、最初にサーバーへのSSHアクセスが必要です)。
偶発的または不正なデータ損失を防ぐために、CouchDBの管理者アカウントを作成することをお勧めします。
これを行うには、布団の右下隅に表示される [Fixthis]リンクをクリックします。 これにより、次のようにCouchDB管理者ユーザーを作成できる画面が表示されます。
目的のユーザー名とパスワードを入力します。
新しいCouchDBユーザー名と安全なパスワードを入力したら、作成ボタンをクリックします。 これにより、新しい管理者ユーザーが作成されます。 布団の右下にあるメッセージは、次のようなメッセージを表示してこれを確認します。
注:管理者ユーザーを作成すると、許可されていないユーザーがデータベース、設計ドキュメント、およびCouchDB構成を削除および変更するのを防ぐことができます。 ただし、ドキュメントの作成やアクセスを妨げることはありません。
サーバーへのSSHアクセスの配布には注意してください。
それでおしまい! これで、CouchDBサーバーが完全に構成されました。
データベースの使用について詳しくは、読み続けてください。
布団からCRUD操作を実行する
Futonには、基本的なCRUD操作(作成、読み取り、更新、削除)を実行できる非常にシンプルで便利なユーザーインターフェイスがあります。
このセクションでは、todos
という名前の新しいデータベースを作成し、それに新しいドキュメントを追加してから、このドキュメントを取得、更新、および削除します。
注:管理者ユーザーを作成した場合、新しいデータベースを作成するには、管理者としてログインする必要があります。
SSHトンネルがまだ開いていることを確認してください。 そうでない場合は、次のコマンドを使用して、ローカルコンピューターからサーバーへの接続を開きます。
- ssh -L5984:127.0.0.1:5984 sammy@your_server_ip
http://localhost:5984/_utils/
の布団のページから始めましょう。
注:このセクションでは、上記の布団へのアクセスセクションで説明されているように設定されたSSHトンネルを使用してCouchDBにアクセスしていることを前提としています。 設定が異なる場合は、正しいURLで布団にアクセスしてください。
データベースとドキュメントを作成する
todos
という名前の新しいデータベースを作成するには、画面のデータベースの作成リンクをクリックします。 これにより、次のようなダイアログが表示されます。
データベースの名前を入力し、作成ボタンをクリックします。
これにより、todos
という名前の新しいデータベースが作成され、新しく作成されたデータベースでドキュメントの作成と変更を開始できるページに移動します。
ドキュメントを作成する
新しいドキュメントを作成するには、ページの新しいドキュメントリンクをクリックします。
これにより、新しいドキュメントを含む画面が開きます。 このドキュメントには、_id
フィールドのみが含まれます。 必要に応じてこのフィールドの値を変更するか、そのままにしておくことができます。
フィールドの追加リンクをクリックして、このドキュメントに新しいフィールドを追加します。
上記のように、todo
とdone
という名前の2つのフィールドを追加しました。 デフォルトでは、新しいフィールドの値はnull
です。
値をダブルクリックして変更します。
この例では、todo
とdone
の値フィールドをダブルクリックし、それぞれTask 1
とfalse
の値を入力しました。
値を入力したら、ENTER
キーを押すか、フィールドの横にある小さな緑色のチェックマークをクリックして内容を保存します。 (これを行わないと、フィールドの値はnull
のままになります。)これは次のようになります。
ドキュメントを保存するには、ドキュメントの保存リンクをクリックします。 ドキュメントを保存すると、_rev
フィールドが次のように追加されていることがわかります。
ドキュメントを読む
todos
リンク(Overview
リンクの横のトップバー)をクリックして、todos
データベース内の唯一のドキュメントとして新しく作成されたドキュメントを表示します。
表内のドキュメントのキー(ID)をクリックして、ドキュメントの詳細ページにアクセスします。
ドキュメントを編集する
このページでは、次のようにドキュメントフィールドを編集および更新できます。
フィールド値を編集するには、フィールド値をダブルクリックして編集を開始します。
(_id
および_rev
フィールドを除く)任意のフィールドを削除したり、新しいフィールドを追加したり、既存のフィールドの値を変更したりできます。 この例では、done
フィールドの値をfalse
からtrue
に次のように変更しました。
変更内容に問題がなければ、[ドキュメントの保存]リンクをクリックしてドキュメントを更新します。 これを行うと、_rev
フィールドの値も更新されていることがわかります。
ドキュメントを削除する
ドキュメントを削除するには、ドキュメントの削除リンクをクリックして、確認を求めるメッセージを表示します。
削除ボタンを押して確定します。
布団がドキュメントを削除し、todos
データベースページに移動します。このページは空になっているはずで、ドキュメントが実際に削除されたことを確認します。
コマンドラインからのCRUD操作の実行
このセクションでは、curl
を使用して、コマンドラインからCouchDBデータベースに対して基本的なCRUD(作成、読み取り、更新、および削除)操作を実行する方法を説明します。
SSHトンネルがまだ開いていることを確認してください。 そうでない場合は、次のコマンドを使用して、ローカルコンピューターからサーバーへの接続を開きます。
- ssh -L5984:127.0.0.1:5984 sammy@your_server_ip
注:このセクションでは、上記の手順2( CouchDB のインストール)で作成したデータベースnew_database
を使用します。 このセクションでは、上記の布団へのアクセスの手順で説明されているように、SSHトンネルを使用してCouchDBにアクセスしていることも前提としています。 設定が異なる場合は、以下で使用するコマンドを実行する際に、URL、PORT、およびデータベース名を適切に置き換えるようにしてください。
データベースを作成する
データベースnew_database
をまだ作成していない場合は、ここで作成してください。 このコマンドは、ローカルワークステーションから実行する必要があります。
- curl -X PUT http://localhost:5984/new_database -u "admin:password"
- {"ok":true}
管理者ユーザーをCouchDBに追加したため、新しいデータベースを作成するときに管理者のユーザー名とパスワードを送信する必要があります。
結果は次のようになります。
Output{"ok":true}
ドキュメントを作成する
新しいドキュメントを作成することから始めましょう。
- 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
でドキュメントを作成します。
- 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"}
複数のドキュメントを作成する
単一のドキュメントを作成するだけでなく、ドキュメントをまとめて作成することもできます。
- 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つのわずかな違いがあります。
- 単一のドキュメントを挿入している間、POST本文は単なる標準のJSONオブジェクトでした。 一括挿入の場合、POST本体は
docs
フィールドを持つオブジェクトで構成されます。 このフィールドには、挿入されるドキュメントの配列が保持されます。 - 単一のドキュメントを挿入しているときに、POSTリクエストがデータベースを指すURL(
http://localhost:5984/new_database
)に送信されました。 ただし、一括挿入のリクエストはhttp://localhost:5984/new_database/_bulk_docs
URLにPOSTします。
一括挿入操作の応答は次のとおりです。
Output[{"ok":true,"id":"803da996e1524591ce773d24400007df","rev":"1-778fd61f8f460d0c1df1bb174279489d"},{"ok":true,"id":"803da996e1524591ce773d2440001723","rev":"1-dc9e84861bba58e5cfefeed8f5133636"}]
ドキュメントを読む
CouchDBデータベースからドキュメントを取得するのは、HTTPGETコマンドを発行するだけです。 上で作成したドキュメントの1つであるrandom_task
を取得してみましょう。
- 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リクエストを発行する必要があります。
- 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要求を使用してこのドキュメントを削除してみましょう。
- 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インスタンスを再起動するには、次のコマンドを実行します。
- sudo restart couchdb
このコマンドは、実行中のCouchDBインスタンスを再起動し、新しいインスタンスのプロセスIDを表示します。 実行中のCouchDBのインスタンスがない場合、このコマンドを実行すると、次のようなメッセージが表示されます。
Outputrestart: Unknown instance:
止まる
実行中のCouchDBインスタンスを停止するには、次のコマンドを実行します。
- sudo stop couchdb
このコマンドを実行すると、実行中のCouchDBインスタンスが停止し、次のような確認メッセージが表示されます。
Outputcouchdb stop/waiting
始める
CouchDBを起動するには、次のコマンドを実行します。
- sudo start couchdb
CouchDBがまだ実行されていない場合、このコマンドを実行するとCouchDBが起動し、次のような確認メッセージが表示されます。
Outputcouchdb start/running, process 12345
一方、CouchDBインスタンスがすでに実行されている場合、上記のコマンドを実行すると、次のようなメッセージが表示されます。
Outputstart: Job is already running: couchdb
状態
CouchDBのステータスを確認したい場合は、次のコマンドを使用して確認できます。
- sudo status couchdb
CouchDBが実行されている場合、次のようなメッセージが表示されます。
Outputcouchdb start/running, process 12345
CouchDBが実行されていない場合、ステータスを確認すると次のようになります。
Outputcouchdb stop/waiting
結論
これで、DropletにCouchDBが完全に機能するように設定されました。これは、Futonまたはコマンドラインを使用してローカルマシンから安全に管理できます。