介绍
Apache CouchDB的 ,像Redis的,Cassandra,和MongoDB,是一个NoSQL的数据库 。 CouchDB将数据存储为本质上是非关系的JSON文档。 这允许CouchDB的用户以看起来非常类似于他们的真实世界对应方式的方式存储数据。
您可以从命令行或从名为Futon的Web界面管理CouchDB。 Futon可用于执行管理任务,如为CouchDB创建和操作数据库,文档和用户。
目标
在本文末尾,您将:
- 有CouchDB安装在运行Ubuntu 14.04的Droplet上
- 将Futon安装在同一台服务器上
- 已经安全CouchDB安装
- 使用Futon从本地计算机访问CouchDB,使用安全隧道
- 知道如何添加一个管理员用户到CouchDB
- 使用Futon对CouchDB执行CRUD操作
- 使用CouchDB从命令行执行CRUD操作
先决条件
请完成以下先决条件:
- Ubuntu 14.04 Droplet
- 您登录到您的服务器具有管理权限的非root用户( 初始服务器设置与Ubuntu 14.04 )
注:虽然本教程假定非root用户,可以执行下列步骤作为root
用户为好,如果你不希望创建一个用户Sudo。 请注意,如果你使用一个非root用户,你会被要求输入密码,您执行了命令第一次sudo
。
第1步 - 准备服务器
在我们可以安装CouchDB之前,我们需要确保服务器已经设置好了。
从更新系统开始:
sudo apt-get update
安装允许您管理源存储库的软件:
sudo apt-get install software-properties-common -y
注: -y
标志告诉apt-get
命令来承担一个Yes
响应所有在安装过程中可能出现的提示进行操作。 如果您希望手动响应提示,可以删除此标志。
添加PPA将帮助我们从相应的存储库获取最新的CouchDB版本:
sudo add-apt-repository ppa:couchdb/stable -y
警告:应十分注意,同时增加了新的个人存档包(PPA)到服务器服用。 由于任何人都可以创建PPA,因此无法保证其可信任或安全。 在这种情况下,上述PPA是官方的,由Apache CouchDB团队维护。
现在我们已经添加了一个新的PPA,让我们更新系统,以便它有最新的软件包信息:
sudo apt-get update
我们现在准备安装CouchDB和Futon。
第2步 - 安装CouchDB
如果以前在此服务器上安装了CouchDB,请先删除现有版本:
sudo apt-get remove couchdb couchdb-bin couchdb-common -yf
注意:如果你有一个新的Droplet,可以忽略这一步。
现在安装CouchDB:
sudo apt-get install couchdb -y
这将在您的服务器上安装CouchDB和Futon。
默认情况下,CouchDB的运行在本地主机上,使用端口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的进程可以访问和更改谁可以访问CouchDB的文件和目录的权限控制。
在更改所有权和权限之前,停止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用户或根组目录。
第4步 - 访问Futon
CouchDB提供了一个方便的基于web的控制面板,称为Futon。 我们打算从本地工作站访问,通过SSH连接到你的服务器隧道的流量。 这意味着只有具有SSH登录到您的服务器的用户才能访问Futon控制面板。
要安全地连接到CouchDB,而不使其公开可用,您可以创建从本地端口5984到远程服务器的端口5984的SSH隧道。
您可以使用下面的命令,从本地计算机上运行,以建立通道:
ssh -L5984:127.0.0.1:5984 sammy@your_server_ip
注意:请记住您的用户名和your_server_ip与Droplet的IP地址替换sammy 。
当连接打开时,您可以使用端口5984从您最喜爱的网络浏览器访问Futon。访问此URL以显示有用的Futon页面:
http://localhost:5984/_utils
默认情况下,所有访问Futon的CouchDB用户都具有管理权限。 这是在右下角公布:
您可以通过点击小修复此链接,并创造新的管理员改变这一点。
第5步 - 添加管理用户
现在我们已经启动并运行CouchDB,让我们开始使用它。
在创建管理用户之前,所有用户都可以使用管理权限访问CouchDB(尽管它们需要首先对服务器进行SSH访问)。
为CouchDB创建一个管理员帐户是一个很好的做法,以防止意外或未经授权的数据丢失。
要做到这一点,单击修复此链接出现在Futon的右下角。 这将打开一个屏幕,允许您创建一个CouchDB管理员用户,如下所示:
输入所需的用户名和密码:
进入新的CouchDB的用户名和一个安全的密码后,点击创建按钮。 这将创建新的管理用户。 Futon右下角的消息将通过显示类似于以下内容的消息来确认:
注:管理员用户的创建防止未经授权的用户删除和修改数据库,设计文件和CouchDB的配置。 但是,它不会阻止他们创建或访问文档。
请小心对您的服务器进行SSH访问。
而已! 我们的CouchDB服务器现在完全配置。
要了解有关使用数据库的更多信息,请继续阅读。
从Futon执行CRUD操作
Futon有一个非常简单但有用的用户界面,它允许您执行基本的CRUD操作(创建,读取,更新和删除)。
在本节中,我们将创建一个名为新的数据库, todos
,添加一个新文件,然后检索,更新和删除这个文件。
注意:如果您已经创建了一个管理员用户,你将必须登录为管理员创建一个新的数据库。
确保你仍然有你的SSH隧道打开。 如果没有,就打开从你的本地计算机上使用此命令的服务器的连接:
ssh -L5984:127.0.0.1:5984 sammy@your_server_ip
首先,让我们通过访问网页Futon在http://localhost:5984/_utils/
。
注意:本节假设正在使用的是设立在访问Futon上面一节中描述的一个SSH隧道访问CouchDB的。 如果您的设置不同,请确保以正确的URL访问Futon。
创建数据库和文档
要创建一个名为新的数据库todos
,点击屏幕上创建数据库链接。 这将弹出一个对话框如下:
输入数据库的名称,然后单击Create按钮。
这将创建一个新的数据库名为todos
,并带你到一个页面,您可以开始创建和修改在新创建的数据库中的文档。
创建文档
要创建一个新文档,请点击页面上的新建文档的链接。
这将打开一个带有新文档的屏幕。 该文件将刚才的_id
领域。 如果需要,您可以更改此字段的值,或者您可以保留原样。
点击添加字段链接到一个新的字段添加到该文件。
从上面可以看出,我们已经添加了两个名为领域todo
和done
。 默认情况下,新的领域有一个null
值。
双击该值进行更改。
在这个例子中,我们双击的价值领域的todo
和done
,并已输入的值Task 1
和false
分别。
一旦你输入的值,再按下ENTER
键或点击旁边的字段的绿色小复选标记保存它的内容。 (如果不这样做会离开字段的值作为null
)。这应如下所示:
要保存文档,单击保存文档的链接。 文档保存后,你会看到一个_rev
领域已经被添加到它,如下所示:
阅读文档
点击上todos
链接(在顶部栏旁边的Overview
链接)来查看新创建的文档,作为唯一的文件todos
数据库。
单击表中文档的键(ID)以访问文档详细信息页面。
编辑文档
在此页面上,您可以按如下所示编辑和更新文档字段:
要编辑字段值,请双击它并开始编辑。
您可以删除任何字段(除了_id
和_rev
领域),添加新的字段,或更改现有字段的值。 在这个例子中,我们已经改变了的数值done
从外地false
到true
如下:
您满意更改后,点击保存文档的链接更新文档。 一旦你这样做,你会发现,价值_rev
领域得到了更新。
删除文档
要删除文档,您可以点击删除文档的链接,这将提示您确认:
按Delete键确认。
蒲团将删除该文档,并带你到todos
数据库页面,它现在应该是空的,确认该文件确实已被删除。
从命令行执行CRUD操作
本节将说明我们如何能够从使用命令行的CouchDB数据库上执行基本的CRUD(创建,读取,更新和删除)操作curl
。
确保你仍然有你的SSH隧道打开。 如果没有,就打开从你的本地计算机上使用此命令的服务器的连接:
ssh -L5984:127.0.0.1:5984 sammy@your_server_ip
注意:本节将使用数据库new_database
是在上述第2步( 安装CouchDB的 )创建的。 本节还假设我们使用在上面的Futon访问步骤所述一个SSH隧道访问CouchDB的。 如果你的设置是不同的,请确保您更换网址,端口和数据库名称适当地在执行下面使用的命令。
创建数据库
如果您尚未创建数据库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
标志指示,我们正在执行一个HTTP POST操作。 该-H
标志其次是首部设置了这一要求作为内容类型application/json
,因为我们正在发布一个JSON文件。 最后,JSON文档本身包括在内,与一起-d
标志。
该操作的响应如下:
Output{"ok":true,"id":"803da996e1524591ce773d24400004ff","rev":"1-2fc1d70532433c39c9f61480607e3681"}
在"ok":true
这种反应的一部分,表明操作成功。 该响应包括该字段id
和rev
,分别表示的文档ID和文件版本。 如果需要修改或删除此文档,则需要这两个字段。
在这个例子中,是由CouchDB中生成的文件ID,因为我们没有与命令供给。 如果需要,我们可以创建一个具有我们生成的唯一ID的文档。
使用指定ID创建
创建具有ID文件random_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正文中指定的两个文档。 与单文档插页相比,有两个轻微的差异:
- 在插入单个文档时,POST正文只是一个标准的JSON对象。 在批量插入的情况下,POST主体包括具有对象
docs
字段。 此字段保存要插入的文档数组。 - 同时插入单个文档,POST请求被送到URL指向数据库(
http://localhost:5984/new_database
)。 对于批量插入的要求,但是,POST到http://localhost:5984/new_database/_bulk_docs
URL。
批量插入操作的响应如下:
Output[{"ok":true,"id":"803da996e1524591ce773d24400007df","rev":"1-778fd61f8f460d0c1df1bb174279489d"},{"ok":true,"id":"803da996e1524591ce773d2440001723","rev":"1-dc9e84861bba58e5cfefeed8f5133636"}]
阅读文档
从CouchDB数据库检索文档是发出HTTP GET命令的简单问题。 让我们试着检索我们上面创建的文件之一:一个名为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
,我们需要如下发出HTTP PUT请求:
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
值,使用HTTP如下DELETE请求删除这个文件:
curl -X DELETE http://localhost:5984/new_database/random_task?rev=2-4cc3dfb6e76befd665faf124b36b7f1c
就像上面的GET和PUT请求,删除请求使用指向文档的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或命令行从本地计算机安全地管理它。