如何在Ubuntu14.04上安装CouchDB和Futon
介绍
Apache CouchDB 与 Redis、Cassandra 和 MongoDB 一样,是一个 NoSQL 数据库。 CouchDB 将数据存储为本质上非关系的 JSON 文档。 这允许 CouchDB 的用户以与现实世界中的用户非常相似的方式存储数据。
您可以从命令行或名为 Futon 的 Web 界面管理 CouchDB。 Futon 可用于执行管理任务,例如为 CouchDB 创建和操作数据库、文档和用户。
目标
在本文结束时,您将:
- 在运行 Ubuntu 14.04 的 Droplet 上安装 CouchDB
- 在同一台服务器上安装被褥
- 已保护 CouchDB 安装
- 使用 Futon 从本地机器访问 CouchDB,使用安全隧道
- 了解如何将管理员用户添加到 CouchDB
- 使用 Futon 对 CouchDB 执行 CRUD 操作
- 从命令行使用 CouchDB 执行 CRUD 操作
先决条件
请完成以下先决条件:
- Ubuntu 14.04 液滴
- 您以具有管理权限的非 root 用户身份登录到您的服务器(Initial Server Setup with 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
响应。 如果您更喜欢手动响应提示,则可以删除此标志。
添加将帮助我们从适当的存储库中获取最新的 CouchDB 版本的 PPA:
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 在 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 用户和组。
更改所有权控制 what CouchDB 进程可以访问,并更改权限控制 who 可以访问 CouchDB 文件和目录。
在更改所有权和权限之前,请停止 CouchDB:
sudo stop couchdb
更改 /usr/lib/couchdb
、/usr/share/couchdb
和 /etc/couchdb
目录以及 /usr/bin/couchdb
可执行文件的所有权,使其所有者为 couchdb[X148X ] 并且它们属于 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[X144X ] 用户和 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 提供了一个方便的基于 Web 的控制面板,称为 Futon。 我们将从您的 本地工作站 访问它,通过 SSH 连接将流量隧道化到您的服务器。 这意味着只有通过 SSH 登录到您的服务器的用户才能访问 Futon 控制面板。
要安全地连接到 CouchDB,但不公开,您可以创建一个从本地端口 5984 到远程服务器端口 5984 的 SSH 隧道。
您可以使用以下命令,从您的 本地计算机 运行,来设置隧道:
ssh -L5984:127.0.0.1:5984 sammy@your_server_ip
注意:记得用你的用户名替换sammy,用你的Droplet的IP地址替换your_server_ip。
连接打开时,您可以使用端口 5984 从您喜欢的 Web 浏览器访问 Futon。 访问此 URL 以显示有用的蒲团页面:
http://localhost:5984/_utils
默认情况下,所有访问 Futon 的 CouchDB 用户都具有管理权限。 这是在右下角宣布的:
您可以通过单击小 Fix this 链接并创建新管理员来更改此设置。
第 5 步 — 添加管理员用户
现在我们已经启动并运行了 CouchDB,让我们开始使用它。
在创建管理员用户之前,所有用户都可以使用管理权限访问 CouchDB(尽管他们需要先通过 SSH 访问服务器)。
为 CouchDB 创建一个管理员帐户是一种很好的做法,以防止意外或未经授权的数据丢失。
为此,请单击出现在 Futon 右下角的 Fix this 链接。 这将打开一个屏幕,允许您创建 CouchDB 管理员用户,如下所示:
输入所需的用户名和密码:
输入新的 CouchDB 用户名和安全密码后,单击 Create 按钮。 这将创建新的管理员用户。 被褥右下角的消息将通过显示类似于以下的消息来确认这一点:
注意: admin 用户的创建可以防止未经授权的用户删除和修改数据库、设计文档和 CouchDB 配置。 但是,它不会阻止他们创建或访问文档。
向您的服务器分配 SSH 访问权限时要小心。
就是这样! 我们的 CouchDB 服务器现在已完全配置。
要了解有关使用数据库的更多信息,请继续阅读。
从 Futon 执行 CRUD 操作
Futon 有一个非常简单但有用的用户界面,允许您执行基本的 CRUD 操作(创建、读取、更新和删除)。
在本节中,我们将创建一个名为 todos
的新数据库,向其中添加一个新文档,然后检索、更新和删除该文档。
注意: 如果您创建了管理员用户,您必须以管理员身份登录才能创建新数据库。
确保您的 SSH 隧道仍然打开。 如果没有,请使用以下命令从 本地计算机 打开与服务器的连接:
ssh -L5984:127.0.0.1:5984 sammy@your_server_ip
让我们首先访问 http://localhost:5984/_utils/
的被褥页面。
注意: 本节假定使用 SSH 隧道访问 CouchDB,该隧道已按照上面 访问被褥 部分中所述设置。 如果您的设置不同,请确保您通过正确的 URL 访问 Futon。
创建数据库和文档
要创建一个名为 todos
的新数据库,请单击屏幕上的 Create Database 链接。 这将弹出一个对话框,如下所示:
输入数据库名称,点击Create按钮。
这将创建一个名为 todos
的新数据库,并带您进入一个页面,您可以在该页面中开始在新创建的数据库中创建和修改文档。
创建文档
要创建新文档,请单击页面上的 New Document 链接。
这将打开一个带有新文档的屏幕。 该文档将只有 _id
字段。 如果需要,您可以更改此字段的值,也可以保持原样。
单击 Add Field 链接以向该文档添加新字段。
如上所示,我们添加了两个名为 todo
和 done
的字段。 默认情况下,新字段具有 null
值。
双击该值以更改它。
在这个例子中,我们双击了todo
和done
的值域,分别输入了值Task 1
和false
。
输入值后,按 ENTER
键或单击字段旁边的绿色小复选标记以保存其内容。 (如果不这样做,该字段的值将保留为 null
。)这应该如下所示:
要保存文档,请单击 Save Document 链接。 保存文档后,您会看到其中添加了一个 _rev
字段,如下所示:
阅读文档
单击 todos
链接(在 Overview
链接旁边的顶部栏中)查看新创建的文档,作为 todos
数据库中的唯一文档。
点击表格中的文档键(ID),进入文档详情页面。
编辑文档
在此页面上,您可以编辑和更新文档字段,如下所示:
要编辑字段值,请双击它并开始编辑。
您可以删除任何字段(除了 _id
和 _rev
字段)、添加新字段或更改现有字段的值。 在此示例中,我们将 done
字段的值从 false
更改为 true
,如下所示:
对更改感到满意后,单击 保存文档 链接以更新文档。 执行此操作后,您会注意到 _rev
字段的值也已更新。
删除文档
要删除文档,您可以单击 Delete Document 链接,该链接将提示您确认:
按 Delete 按钮确认。
Futon 将删除文档并带您进入 todos
数据库页面,该页面现在应该是空的,确认文档确实已被删除。
从命令行执行 CRUD 操作
本节将说明我们如何使用 curl
从命令行对 CouchDB 数据库执行基本的 CRUD(创建、读取、更新和删除)操作。
确保您的 SSH 隧道仍然打开。 如果没有,请使用以下命令从 本地计算机 打开与服务器的连接:
ssh -L5984:127.0.0.1:5984 sammy@your_server_ip
注意:本节将使用在上面步骤2(安装CouchDB)中创建的数据库new_database
。 本节还将假设我们使用 SSH 隧道访问 CouchDB,如上面 访问 Futon 步骤中所述。 如果您的设置不同,请确保在执行下面使用的命令时适当地替换 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
标志表明我们正在执行 HTTP POST 操作。 后跟标头的 -H
标志将此请求的内容类型设置为 application/json
,因为我们正在 POST 一个 JSON 文档。 最后,包含 JSON 文档本身以及 -d
标志。
该操作的响应如下:
Output{"ok":true,"id":"803da996e1524591ce773d24400004ff","rev":"1-2fc1d70532433c39c9f61480607e3681"}
此响应的 "ok":true
部分表示操作成功。 响应包括字段 id
和 rev
,分别代表文档 ID 和文档修订版本。 如果需要修改或删除此文档,这两个字段都将是必需的。
在这个例子中,文档 ID 是由 CouchDB 生成的,因为我们没有通过命令提供它。 如果需要,我们可以创建一个具有我们生成的唯一 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 请求一样,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 或命令行从本地计算机安全地管理它。