本机自建Mongo DB RestHeart 服务器

  • fennng 

因为MLab 被收购了, 支持RESTFUL的MONGODB服务又少了一样。 靠人不能靠己,还是自己架设一个吧。

今天这篇文章当然不是介绍什么是Mongo DB, 如果你还不知道什么是 MongoDB,可以到官网去看看。 www.mongodb.com/cn

MongoDB 本身不支持使用HTTP/HTTPS来访问,如果你想使用RESTFul来访问Mongo DB, 你可以使用 MongoDB Atlas 里面的 Stitch Webhook, 也可以使用 RestHeart restheart.org/.

今天这篇文章,我来介绍一下如何在本机架设一个Mongo DB 的 RestFul 服务器。 基本上来说,我们会发送HTTP请求给RESTHeart 服务器, RestHeart 服务器会再转发请求到 MongoDb 的服务器。

你需要的工具如下:

  • Windows 10
  • Docker
  • Ngrok

如果你对Linux熟悉,你也可以使用相同的方法把这个服务器架设在VPS上, 方法大同小异。

使用Ngrok是必要的,就算你有公网IP, 使用Ngrok可以让你免去设置SSL证书的麻烦。当然Ngrok的动态网址会让你头疼的,除非你是付费用户。 如果你是想搭建在VPS的LINUX系统上,我建议使用Nginx Proxy 和 letsencrypt-nginx-proxy-companion 来解决证书的问题。 当然RestHeart 本身也是可以支持SSL设置并启用HTTPS的。

今天这篇文章我主要讲的是在本地Windows 上的架设,所以不会长篇大论的讲证书的设置。

第一步 – 安装 Docker

安装Docker 非常简单,到这里下载安装就行了

hub.docker.com/editions/community/docker-ce-desktop-windows

如何你还是有什么疑问,可以看看我之前发布的关于Docker 在 Windows 10下安装的视频

如果你没有Hyper-V, 那你需要 Docker ToolBox, 也是很简单的,下载安装就可以了

docs.docker.com/toolbox/toolbox_install_windows/

第二步 – 运行 Mongo DB 服务器

点开始菜单,输入cmd 回车,进入如下界面 (我这里用的是cmder, 界面有一点点不同)

使用如下命令运行 Mongo DB 服务器, 不要改动任何东西,包括密码

docker run -d -e MONGO_INITDB_ROOT_USERNAME=restheart -e MONGO_INITDB_ROOT_PASSWORD=R3ste4rt! --name mongodb mongo --bind_ip_all --auth

成功后应该像上图这样 (图中用户名和密码两侧的单引号要去掉,在linux 系统中可以有), 可以使用 docker ps 来查询正在运行中的 docker 容器

现在你的mongoDb 服务器已经在运行了, 我们可以用 mongo express 来管理它, mongo express 不是必需的,但是用来验证和管理 mongodb 都非常好用, 如果你的机器可以被公网访问,记得用完要删掉。

使用以下命令启动 mongo-express 服务, 不要改任何东西

docker run -e ME_CONFIG_MONGODB_ENABLE_ADMIN=true -e ME_CONFIG_MONGODB_ADMINUSERNAME=restheart -e ME_CONFIG_MONGODB_ADMINPASSWORD=R3ste4rt! -d -p 88:8081 --name mongoexp --link mongodb:mongo mongo-express

然后在浏览器输入 localhost:88 就可以进来 mongo express 的界面了, 如果你用的是 Docker toolbox, 把 localhost 换成 192.168.99.100

然后我们可以在 mongo-express 里面创建一个数据库, 这里我创建了一个叫 testdb 的数据库

进入这个数据库,我们再来创建一个集合叫 testColl

以上使用mongo express 访问mongodb 不是必要的,只是用来验证我们的mongodb 在正常工作。 直接使用 RestHeart API 就可以完成以上操作

使用以下命令删除 mongo express 服务器, 你可以在任何时候用上面的命令重新创建它

docker rm -f mongoexp

第三步, 运行 RestHeart 服务器

在命令行输入如下命令

首先在C盘根目录(或是别的什么地方)建立一个目录,就叫 RestHeart 吧。 点开始菜单,输入cmd 回车,进入如下界面,并用如下命令建立这个目录,并进入

现在输入以下命令

docker run -e VIRTUAL_PORT=8080 -d -p 89:8080 --name restheart --link mongodb:mongodb softinstigate/restheart

成功以后如下图

这个时候你的RestHeart 服务器已经工作了, 在浏览器里打开 localhost:89, 如果你用的是Docker Toolbox 的话就用 192.168.99.100:89

你会看到如下登录界面, 输入用户名admin, 密码 changeit 登录

如果你看到如下界面,说明你的RestHeart 连接成功了

 

但是你现在使用的是RestHeart 默认的登录密码,是不安全的,我们要改掉它。

回到命令行,我们要把RestHeart 里面的配置文件复制出来, 在 C:\RestHeart 目录下,输入如下命令

docker cp restheart:/opt/restheart/etc .

回车 (命令中的 . 不能省), 再输入 dir etc 命令

你会发现 RestHeart 目录下多了一个叫 etc 的文件夹,里面有三个文件

用notepad++打开这个文件, 你可以在这里下载 notepad++, notepad-plus-plus.org/download/v7.6.3.html

打开后你会看到如下内容, 把红框中的用户名和密码改一下,因为是演示,我只是简单的加了个2在后面, 然后保存

回到命令行,我们把原来的 RestHeart 服务器停止, 但是不删除

docker stop restheart

然后用以下命令把我们修改过的文件夹复制回去

docker cp etc restheart:/opt/restheart/

然后重启这个服务

docker start restheart

用以下命令检查一下我们的新密码是不是已经写进去了

docker exec restheart cat /opt/restheart/etc/security.yml

上图高亮错误, 应该高亮 admin2…

这时候你再回到浏览器 localhost:89 就会发现密码不对了,如果密码还是对的

使用如下命令再重启一下 restheart 服务器

docker restart restheart

现在你要用新用户名和密码登录了

第四步, 把本地服务弄到因特网上

虽然现在你的服务器已经在工作了,可是因为是你本机的服务器, 外界无法访问,所以我们需要使用 Ngrok 让它可以被外界访问

你需要先下载Ngrok ngrok.com/download

然后注册一个帐号,登录后找到你的授权码

我们把 Ngrok 下载后放在 C:\RestHeart 文件夹

然后再命令行输入

ngrok authtoken 这里放授权码

授权成功后

输入

ngrok http 89

如果是用 Docker toolbox, 输入

ngrok http 192.168.99.100:89

然后你会看到如下界面

复制其中的HTTPS链接 ffbf64c1.ngrok.io

不要使用HTTP链接, 因为不安全

在浏览器输入这个链接,输入密码

 

访问成功, 这个链接是个公网链接,也就是不只是你本机可以访问, 互联网上任何人都是可以访问的,但他们必需有密码。

 

至此,你的Mongo DB RestHeart 服务器已经可以使用了。

我们现在来用Google App Script 来测试一下,看好不好用, 我这里就不在详述Google App Script 的使用了。

在Google App script 中使用以下测试函数

 


function TestRestHeartNgrok(){

  // 我们刚才用 mongo express 创建了一个叫 testdb 的数据库,我们来插入一条数据
// 这里你要把网址改成你自己的ngrok 网址
  var restheartUrl = "https://ffbf64c1.ngrok.io/testdb/";

  var data = {test: 'test'};
  
  // 插入到我们刚才创建的 testColl 这个集合中
  var db = restheartUrl + 'testColl';
  
  var option = {
    "method": "post",
    'contentType': 'application/json',
    'headers': {"Authorization": "Basic " + Utilities.base64Encode('admin2' + ":" + 'changeit2')},
    "muteHttpExceptions": true, 
    "payload": JSON.stringify(data)
  }
  
  var response = UrlFetchApp.fetch(db, option);

}

这个函数会在 testdb 数据库中的testColl 集成中插入一个 {test:’test’} 的数据,执行完后从 mongo express 里面可以看到插入的数据, 插入成功。

现在,你拥有了自己的 “MLab” Data API啦。 是不是很爽,到处都可以使用哦,不仅限于 Google App Scripts.

刚才的函数只是演示了一下插入文档的方法。 RestHeart 当然支持数据库/集合的创建, 插入文档,读取文档等操作。 关于如何使用 RestHeart 的API, 请到官网看文档

入门 restheart.org/learn/tutorial/

如何读写数据 restheart.org/learn/write-requests/

更多用法,请看视频

《本机自建Mongo DB RestHeart 服务器》有2个想法

  1. (重发)评论没弹出,为保证我再试发一次^^
    峰哥您好,我卡在了
    docker run -e ME_CONFIG_MONGODB_ENABLE_ADMIN=true -e ME_CONFIG_MONGODB_ADMINUSERNAME=restheart -e ME_CONFIG_MONGODB_ADMINPASSWORD=R3ste4rt! -d -p 88:8081 –name mongoexp –link mongodb:mongo mongo-express
    我打开网页localhost:88 上面显示(This page isn’t working,localhost didn’t send any data.ERR_EMPTY_RESPONSE)
    然后我把88改去8081 ,之后在网页中打开localhost:8081 ,上面还是一样的显示

  2. 峰哥太厉害了。我卡到在浏览器输入 localhost:88 就可以进来 mongo express 的界面了这里了,进不去这个网页,显示当前无法使用此页面localhost 未发送任何数据。
    ERR_EMPTY_RESPONSE

发表评论

您的电子邮箱地址不会被公开。