前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Ubuntu 14.04上将解析应用程序迁移到解析服务器

如何在Ubuntu 14.04上将解析应用程序迁移到解析服务器

原创
作者头像
木纸鸢
修改2018-10-22 11:30:36
8980
修改2018-10-22 11:30:36
举报
文章被收录于专栏:云计算教程系列

介绍

Parse是一个移动后端即服务平台,自2013年起由Facebook拥有。2016年1月,Parse宣布其托管服务将于2017年1月28日完全关闭。

幸运的是,Parse还发布了一个开源API服务器,与托管服务的API兼容,称为Parse Server。Parse Server正在积极开发中,似乎很可能吸引大型开发人员社区。它可以部署到运行Node.js和MongoDB的一系列环境中。

本指南重点介绍如何将预先存在的Parse应用程序迁移到在Ubuntu 14.04上运行的独立的Parse Server实例。它使用由Let's Encrypt提供的证书对所有连接使用TLS / SSL加密,这是一个提供免费证书的新证书颁发机构。它包含一些特定于DigitalOcean和Ubuntu 14.04的细节,但应广泛适用于运行最近Debian派生的GNU / Linux发行版的系统。

警告:强烈建议首先使用应用程序的开发或测试版本测试此过程,然后再尝试使用面向用户的生产应用程序。强烈建议您结合官方迁移文档阅读本指南。

课程准备

本指南以[如何在Ubuntu 14.04上运行解析服务器为基础。它需要以下内容:

  • Ubuntu 14.04服务器,配置非root 具有sudo权限的用户,没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • Node.js 5.6.x
  • MongoDB 3.0.x
  • 指向服务器的域名,如果你没有域名,建议您先去这里注册一个域名如果你有域名,保护你网站的最简单方法是使用腾讯云SSL证书服务,它提供免费的可信证书。腾讯云SSL证书安装操作指南进行设置。
  • 要迁移的解析应用程序
  • 使用Let的加密证书,使用SSL安装和配置Nginx。

目标服务器应具有足够的存储空间来处理所有应用程序的数据。由于Parse会压缩数据,因此他们正式建议您至少配置托管应用程序使用的存储空间的10倍。

步骤1 - 配置MongoDB进行迁移

Parse为现有应用程序提供了迁移工具。为了使用它,我们需要将MongoDB打开到外部连接,并使用Let's Encrypt的TLS / SSL证书副本对其进行保护。通过将fullchain1.pemprivkey1.pem这两个文件并入一个新的文件名叫/etc/ssl

代码语言:javascript
复制
sudo cat /etc/letsencrypt/archive/domain_name/{fullchain1.pem,privkey1.pem} | sudo tee /etc/ssl/mongo.pem

续订Let's Encrypt证书后,您将不得不重复上述命令。如果您配置Let的加密证书的自动续订,请记住包括此操作。

确保mongo.pemmongodb用户拥有,并且只能由其所有者读取:

代码语言:javascript
复制
sudo chown mongodb:mongodb /etc/ssl/mongo.pem
sudo chmod 600 /etc/ssl/mongo.pem

现在,在nano中打开/etc/mongod.conf(或您选择的文本编辑器):

代码语言:javascript
复制
sudo nano /etc/mongod.conf

在这里,我们将做出几个重要的改变。

首先,查看该net:部分中的bindIp行,并告诉MongoDB通过更改127.0.0.10.0.0.0来侦听所有地址。在此下方,将SSL配置添加到同一部分:

代码语言:javascript
复制
# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0
  ssl:
    mode: requireSSL
    PEMKeyFile: /etc/ssl/mongo.pem

接下来,在# security下启用客户端授权:

代码语言:javascript
复制
# security
security:
  authorization: enabled

最后,迁移工具要求我们将failIndexKeyTooLong参数设置为false

代码语言:javascript
复制
setParameter:
  failIndexKeyTooLong: false

注意:在基于YAML的 MongoDB配置文件中,空格很重要。复制配置值时,请确保保留缩进。

退出并保存文件。

在重新启动mongod服务之前,我们需要添加具有该admin角色的用户。连接到正在运行的MongoDB实例:

代码语言:javascript
复制
mongo --port 27017

创建管理员用户并退出。一定要用你希望的用户名和更安全的密码来取代sammy与其密码。

代码语言:javascript
复制
use admin
db.createUser({
  user: "sammy",
  pwd: "password",
  roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
})
exit

重启mongod服务:

代码语言:javascript
复制
sudo service mongod restart

第2步 - 从Parse迁移应用程序数据

现在您已拥有可远程访问的MongoDB实例,您可以使用Parse迁移工具将应用程序的数据传输到服务器。

为迁移工具配置MongoDB凭据

我们首先在本地连接我们的新管理员用户:

代码语言:javascript
复制
mongo --port 27017 --ssl --sslAllowInvalidCertificates --authenticationDatabase admin --username sammy --password

系统将提示您输入先前设置的密码。

连接后,选择数据库名称以存储应用程序的数据。例如,如果您正在迁移名为Todo的应用程序,则可以使用todo。您还需要为名为parse的用户选择另一个强密码。

mongoshell中,授予此用户访问database_name的权限:

代码语言:javascript
复制
use database_name
db.createUser({ user: "parse", pwd: "password", roles: [ "readWrite", "dbAdmin" ] })

启动数据迁移过程

在浏览器窗口中,登录Parse,然后打开应用程序的设置。在 常规下,找到 迁移 按钮并单击它:

系统将提示您输入MongoDB连接字符串。使用以下格式:

代码语言:javascript
复制
mongodb://parse:password@your_domain_name:27017/database_name?ssl=true

例如,如果您使用域example.com,使用用户parse,密码foo和调用的数据库todo,则连接字符串将如下所示:

代码语言:javascript
复制
mongodb://parse:foo@example.com:27017/todo?ssl=true

最后不要忘记?ssl=true,否则连接将失败。在对话框中输入连接字符串,如下所示:

单击开始迁移。您应该看到用于将Parse托管数据库的快照复制到服务器的进度对话框,然后用于在拍摄快照后同步新数据。此过程的持续时间取决于要传输的数据量,并且可能很大。

验证数据迁移

完成后,迁移过程将进入验证步骤。暂时不要完成迁移。您首先要确保数据已实际传输,并测试Parse Server的本地实例。

返回mongoshell,检查本地数据库。首先访问database_name并检查它包含的集合:

代码语言:javascript
复制
use database_name
show collections
Sample Output for Todo AppTodo
_Index
_SCHEMA
_Session
_User
_dummy
system.indexes

您可以使用以下.find()方法检查特定集合的内容:

代码语言:javascript
复制
db.ApplicationName.find()
Sample Output for Todo App> db.Todo.find()
{ "_id" : "hhbrhmBrs0", "order" : NumberLong(1), "_p_user" : "_User$dceklyR50A", "done" : false, "_acl" : { "dceklyR50A" : { "r" : true, "w" : true } }, "_rperm" : [ "dceklyR50A" ], "content" : "Migrate this app to my own server.", "_updated_at" : ISODate("2016-02-08T20:44:26.157Z"), "_wperm" : [ "dceklyR50A" ], "_created_at" : ISODate("2016-02-08T20:44:26.157Z") }

您的具体输出会有所不同,但您应该会看到应用的数据。一旦满意,退出mongo并返回shell:

代码语言:javascript
复制
exit

步骤3 - 安装和配置解析服务器和PM2

利用MongoDB中的应用数据,我们可以继续安装Parse Server本身,并与系统的其余部分集成。我们将为Parse Server提供专用用户,并使用名为PM2的实用程序对其进行配置,并确保它始终在运行。

全局安装Parse Server和PM2

npm在全局上安装parse-server实用程序,pm2进程管理器及其依赖项:

代码语言:javascript
复制
sudo npm install -g parse-server pm2

创建专用的解析用户和主目录

我们将创建一个名为parse的系统用户,而不是以root或者你sudo用户身份或用户身份运行parse-server

代码语言:javascript
复制
sudo useradd --create-home --system parse

现在设置解析密码:

代码语言:javascript
复制
sudo passwd parse

系统将提示您输入两次密码。

现在,使用该su命令成为解析用户:

代码语言:javascript
复制
sudo su parse

更改为解析的主目录:

代码语言:javascript
复制
cd ~

编写或迁移云代码文件

创建云代码目录:

代码语言:javascript
复制
mkdir -p ~/cloud

编辑/home/parse/cloud/main.js

代码语言:javascript
复制
nano ~/cloud/main.js

出于测试目的,您可以粘贴以下内容:

代码语言:javascript
复制
Parse.Cloud.define('hello', function(req, res) {
  res.success('Hi');
});

或者,您可以通过从云代码中复制为应用程序定义的任何云代码进行迁移 Parse Dashboard上的应用程序设置部分。

退出并保存。

检索密钥并写入/home/parse/ecosystem.json

PM2是一个功能丰富的流程管理器,深受Node.js开发人员的欢迎。我们将使用该pm2实用程序配置我们的parse-server实例并使其长期运行。

您需要检索应用的部分密钥。在分析仪表盘,单击应用程序设置,然后安全和密钥

其中,只需要应用程序ID主密钥。其他(客户端,JavaScript,.NET和REST API密钥)可能是支持旧客户端构建所必需的,但是,如果设置,将在所有请求中都需要。除非您有理由相信,否则您应该首先使用应用程序ID和主密钥。

准备好这些键后,编辑一个名为/home/parse/ecosystem.json的新文件:

代码语言:javascript
复制
nano ecosystem.json

粘贴以下内容,更改配置值以反映MongoDB连接字符串,应用程序ID和主密钥:

代码语言:javascript
复制
{
  "apps" : [{
    "name"        : "parse-wrapper",
    "script"      : "/usr/bin/parse-server",
    "watch"       : true,
    "merge_logs"  : true,
    "cwd"         : "/home/parse",
    "env": {
      "PARSE_SERVER_CLOUD_CODE_MAIN": "/home/parse/cloud/main.js",
      "PARSE_SERVER_DATABASE_URI": "mongodb://parse:password@your_domain_name:27017/database_name?ssl=true",
      "PARSE_SERVER_APPLICATION_ID": "your_application_id",
      "PARSE_SERVER_MASTER_KEY": "your_master_key",
    }
  }]
}

env对象用于设置环境变量。如果需要配置其他键,parse-server还可以识别以下变量:

  • PARSE_SERVER_COLLECTION_PREFIX
  • PARSE_SERVER_CLIENT_KEY
  • PARSE_SERVER_REST_API_KEY
  • PARSE_SERVER_DOTNET_KEY
  • PARSE_SERVER_JAVASCRIPT_KEY
  • PARSE_SERVER_DOTNET_KEY
  • PARSE_SERVER_FILE_KEY
  • PARSE_SERVER_FACEBOOK_APP_IDS

退出并保存ecosystem.json

现在,用pm2运行脚本:

代码语言:javascript
复制
pm2 start ecosystem.json
[PM2] Spawning PM2 daemon
[PM2] PM2 Successfully daemonized
[PM2] Process launched
┌───────────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name      │ id │ mode │ pid  │ status │ restart │ uptime │ memory      │ watching │
├───────────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ parse-wrapper │ 0  │ fork │ 3499 │ online │ 0       │ 0s     │ 13.680 MB   │  enabled │
└───────────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app

现在告诉pm2保存此进程列表:

代码语言:javascript
复制
pm2 save
[PM2] Dumping processes

pm2的进程列表中正在运行的解析用户现在应该存储在/home/parse/.pm2

现在我们需要确保每次重新启动服务器时都会恢复我们之前在ecosystem.json中定义的parse-wrapper进程。幸运的是,pm2可以自己生成和安装脚本。

退出常规sudo用户:

代码语言:javascript
复制
exit

告诉pm2安装Ubuntu的初始化脚本,为了作为解析用户运行,使用/home/parse作为它的主目录:

代码语言:javascript
复制
sudo pm2 startup ubuntu -u parse --hp /home/parse/
代码语言:javascript
复制
[PM2] Spawning PM2 daemon
[PM2] PM2 Successfully daemonized
[PM2] Generating system init script in /etc/init.d/pm2-init.sh
[PM2] Making script booting at startup...
[PM2] -ubuntu- Using the command:
      su -c "chmod +x /etc/init.d/pm2-init.sh && update-rc.d pm2-init.sh defaults"
 System start/stop links for /etc/init.d/pm2-init.sh already exist.
[PM2] Done.

第4步 - 安装和配置Nginx

我们将使用Nginx的网络服务器来为parse-server提供一个反向代理,这样我们就可以使解析API安全地通过TLS / SSL。

在课程准备中,您设置default服务器以响应您的域名,使用由Let的加密证书提供的SSL。我们将使用我们的代理信息更新此配置文件。

nano(或您选择的编辑器)中打开/etc/nginx/sites-enabled/default

代码语言:javascript
复制
sudo nano /etc/nginx/sites-enabled/default

在主server块(它应该已经包含一个location /块)中添加另一个location块来处理/parse/URL 的代理:

代码语言:javascript
复制
. . .
        # Pass requests for /parse/ to Parse Server instance at localhost:1337
        location /parse/ {
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-NginX-Proxy true;
                proxy_pass http://localhost:1337/;
                proxy_ssl_session_reuse off;
                proxy_set_header Host $http_host;
                proxy_redirect off;
        }

退出编辑器并保存文件。重新启动Nginx以使更改生效:

代码语言:javascript
复制
sudo service nginx restart
Output * Restarting nginx nginx
   ...done.

第5步 - 测试解析服务器

在此阶段,您应该具备以下条件:

  • 由Let's Encrypt提供的TLS / SSL证书
  • MongoDB,使用Let的加密证书进行保护
  • 在端口1337上的解析用户下运行parse-server,配置了您的应用程序所需的密钥
  • pm2解析用户下管理parse-server的进程,并启动脚本子使在开机时重新启动pm2
  • 使用Let的加密证书对nginx进行保护,并配置为从https://your_domain_name/parseparse-server实例的代理连接

现在应该可以使用curl来进行测试读取,写入和云代码执行。

注意:与测试或开发应用程序一起使用时,本节中的curl命令应该是无害的。将数据写入生产应用程序时要小心。

使用POST编写数据

您需要为curl提供几个重要选项:

选项

描述

-X POST

设置请求类型,否则默认为 GET

-H "X-Parse-Application-Id:your_application_id"

发送标识您的应用程序的标头至 parse-server

-H "Content-Type: application/json"

发送一个让我们parse-server知道期望JSON格式的数据的标题

-d '{json_data}

发送数据本身

把这些放在一起,我们得到:

代码语言:javascript
复制
curl -X POST \
  -H "X-Parse-Application-Id: your_application_id" \
  -H "Content-Type: application/json" \
  -d '{"score":1337,"playerName":"Sammy","cheatMode":false}' \
  https://your_domain_name/parse/classes/GameScore
代码语言:javascript
复制
{"objectId":"YpxFdzox3u","createdAt":"2016-02-18T18:03:43.188Z"}

使用GET读取数据

由于curl默认情况下发送GET请求,并且我们没有提供任何数据,因此您只需要发送应用程序ID以便读取一些示例数据:

代码语言:javascript
复制
curl -H "X-Parse-Application-Id: your_application_id" https://your_domain_name/parse/classes/GameScore
代码语言:javascript
复制
{"results":[{"objectId":"BNGLzgF6KB","score":1337,"playerName":"Sammy","cheatMode":false,"updatedAt":"2016-02-17T20:53:59.947Z","createdAt":"2016-02-17T20:53:59.947Z"},{"objectId":"0l1yE3ivB6","score":1337,"playerName":"Sean Plott","cheatMode":false,"updatedAt":"2016-02-18T03:57:00.932Z","createdAt":"2016-02-18T03:57:00.932Z"},{"objectId":"aKgvFqDkXh","score":1337,"playerName":"Sean Plott","cheatMode":false,"updatedAt":"2016-02-18T04:44:01.275Z","createdAt":"2016-02-18T04:44:01.275Z"},{"objectId":"zCKTgKzCRH","score":1337,"playerName":"Sean Plott","cheatMode":false,"updatedAt":"2016-02-18T16:56:51.245Z","createdAt":"2016-02-18T16:56:51.245Z"},{"objectId":"YpxFdzox3u","score":1337,"playerName":"Sean Plott","cheatMode":false,"updatedAt":"2016-02-18T18:03:43.188Z","createdAt":"2016-02-18T18:03:43.188Z"}]}

执行示例云代码

https://your_domain_name/parse/functions/hello里没有实际数据的简单POST 将运行/home/parse/cloud/main.js中定义的hello()函数:

代码语言:javascript
复制
curl -X POST \
  -H "X-Parse-Application-Id: your_application_id" \
  -H "Content-Type: application/json" \
  -d '{}' \
  https://your_domain_name/parse/functions/hello
代码语言:javascript
复制
{"result":"Hi"}

如果您已经迁移了自己的自定义云代码,则可以使用已知函数进行测试main.js

步骤6 - 为解析服务器配置应用程序并完成迁移

下一步将是更改客户端应用程序本身以使用Parse Server API端点。请参阅有关将Parse SDK与Parse Server一起使用的官方文档。您将需要适用于您的平台的最新版本的SDK。与上面的基于curl测试的测试一样,将此字符串用于服务器URL:

代码语言:javascript
复制
https://your_domain_name/parse

返回浏览器中的Parse仪表板和Migration选项卡:

单击“ 完成”按钮:

现在应该迁移您的应用。

结论和后续步骤

本指南提供了一个功能的起点,用于将Parse托管的应用程序迁移到单个Ubuntu系统上的Parse Server安装,例如DigitalOcean droplet。我们所描述的配置应该适用于具有适度用户群的低流量应用。托管更大的应用程序可能需要多个系统来提供API端点之间的冗余数据存储和负载平衡。即使是小型项目也可能涉及我们尚未直接解决的基础设施问题。

更多Ubuntu教程请前往腾讯云+社区学习更多知识。


参考文献:《How To Migrate a Parse App to Parse Server on Ubuntu 14.04》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 课程准备
  • 步骤1 - 配置MongoDB进行迁移
  • 第2步 - 从Parse迁移应用程序数据
    • 为迁移工具配置MongoDB凭据
      • 启动数据迁移过程
        • 验证数据迁移
        • 步骤3 - 安装和配置解析服务器和PM2
          • 全局安装Parse Server和PM2
            • 创建专用的解析用户和主目录
              • 编写或迁移云代码文件
                • 检索密钥并写入/home/parse/ecosystem.json
                • 第4步 - 安装和配置Nginx
                • 第5步 - 测试解析服务器
                  • 使用POST编写数据
                    • 使用GET读取数据
                      • 执行示例云代码
                      • 步骤6 - 为解析服务器配置应用程序并完成迁移
                      • 结论和后续步骤
                      相关产品与服务
                      云数据库 MongoDB
                      腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档