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上运行解析服务器为基础。它需要以下内容:
sudo
权限的用户,没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。目标服务器应具有足够的存储空间来处理所有应用程序的数据。由于Parse会压缩数据,因此他们正式建议您至少配置托管应用程序使用的存储空间的10倍。
Parse为现有应用程序提供了迁移工具。为了使用它,我们需要将MongoDB打开到外部连接,并使用Let's Encrypt的TLS / SSL证书副本对其进行保护。通过将fullchain1.pem
和privkey1.pem
这两个文件并入一个新的文件名叫/etc/ssl
:
sudo cat /etc/letsencrypt/archive/domain_name/{fullchain1.pem,privkey1.pem} | sudo tee /etc/ssl/mongo.pem
续订Let's Encrypt证书后,您将不得不重复上述命令。如果您配置Let的加密证书的自动续订,请记住包括此操作。
确保mongo.pem
由mongodb用户拥有,并且只能由其所有者读取:
sudo chown mongodb:mongodb /etc/ssl/mongo.pem
sudo chmod 600 /etc/ssl/mongo.pem
现在,在nano
中打开/etc/mongod.conf
(或您选择的文本编辑器):
sudo nano /etc/mongod.conf
在这里,我们将做出几个重要的改变。
首先,查看该net:
部分中的bindIp
行,并告诉MongoDB通过更改127.0.0.1
为0.0.0.0
来侦听所有地址。在此下方,将SSL配置添加到同一部分:
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0
ssl:
mode: requireSSL
PEMKeyFile: /etc/ssl/mongo.pem
接下来,在# security
下启用客户端授权:
# security
security:
authorization: enabled
最后,迁移工具要求我们将failIndexKeyTooLong
参数设置为false
:
setParameter:
failIndexKeyTooLong: false
注意:在基于YAML的 MongoDB配置文件中,空格很重要。复制配置值时,请确保保留缩进。
退出并保存文件。
在重新启动mongod
服务之前,我们需要添加具有该admin
角色的用户。连接到正在运行的MongoDB实例:
mongo --port 27017
创建管理员用户并退出。一定要用你希望的用户名和更安全的密码来取代sammy与其密码。
use admin
db.createUser({
user: "sammy",
pwd: "password",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
})
exit
重启mongod
服务:
sudo service mongod restart
现在您已拥有可远程访问的MongoDB实例,您可以使用Parse迁移工具将应用程序的数据传输到服务器。
我们首先在本地连接我们的新管理员用户:
mongo --port 27017 --ssl --sslAllowInvalidCertificates --authenticationDatabase admin --username sammy --password
系统将提示您输入先前设置的密码。
连接后,选择数据库名称以存储应用程序的数据。例如,如果您正在迁移名为Todo的应用程序,则可以使用todo
。您还需要为名为parse的用户选择另一个强密码。
从mongo
shell中,授予此用户访问database_name
的权限:
use database_name
db.createUser({ user: "parse", pwd: "password", roles: [ "readWrite", "dbAdmin" ] })
在浏览器窗口中,登录Parse,然后打开应用程序的设置。在 常规下,找到 迁移 按钮并单击它:
系统将提示您输入MongoDB连接字符串。使用以下格式:
mongodb://parse:password@your_domain_name:27017/database_name?ssl=true
例如,如果您使用域example.com
,使用用户parse
,密码foo
和调用的数据库todo
,则连接字符串将如下所示:
mongodb://parse:foo@example.com:27017/todo?ssl=true
最后不要忘记?ssl=true
,否则连接将失败。在对话框中输入连接字符串,如下所示:
单击开始迁移。您应该看到用于将Parse托管数据库的快照复制到服务器的进度对话框,然后用于在拍摄快照后同步新数据。此过程的持续时间取决于要传输的数据量,并且可能很大。
完成后,迁移过程将进入验证步骤。暂时不要完成迁移。您首先要确保数据已实际传输,并测试Parse Server的本地实例。
返回mongo
shell,检查本地数据库。首先访问database_name并检查它包含的集合:
use database_name
show collections
Sample Output for Todo AppTodo
_Index
_SCHEMA
_Session
_User
_dummy
system.indexes
您可以使用以下.find()
方法检查特定集合的内容:
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:
exit
利用MongoDB中的应用数据,我们可以继续安装Parse Server本身,并与系统的其余部分集成。我们将为Parse Server提供专用用户,并使用名为PM2的实用程序对其进行配置,并确保它始终在运行。
用npm
在全局上安装parse-server
实用程序,pm2
进程管理器及其依赖项:
sudo npm install -g parse-server pm2
我们将创建一个名为parse的系统用户,而不是以root或者你sudo
用户身份或用户身份运行parse-server
:
sudo useradd --create-home --system parse
现在设置解析密码:
sudo passwd parse
系统将提示您输入两次密码。
现在,使用该su
命令成为解析用户:
sudo su parse
更改为解析的主目录:
cd ~
创建云代码目录:
mkdir -p ~/cloud
编辑/home/parse/cloud/main.js
:
nano ~/cloud/main.js
出于测试目的,您可以粘贴以下内容:
Parse.Cloud.define('hello', function(req, res) {
res.success('Hi');
});
或者,您可以通过从云代码中复制为应用程序定义的任何云代码进行迁移 Parse Dashboard上的应用程序设置部分。
退出并保存。
PM2是一个功能丰富的流程管理器,深受Node.js开发人员的欢迎。我们将使用该pm2
实用程序配置我们的parse-server
实例并使其长期运行。
您需要检索应用的部分密钥。在分析仪表盘,单击应用程序设置,然后安全和密钥:
其中,只需要应用程序ID和主密钥。其他(客户端,JavaScript,.NET和REST API密钥)可能是支持旧客户端构建所必需的,但是,如果设置,将在所有请求中都需要。除非您有理由相信,否则您应该首先使用应用程序ID和主密钥。
准备好这些键后,编辑一个名为/home/parse/ecosystem.json
的新文件:
nano ecosystem.json
粘贴以下内容,更改配置值以反映MongoDB连接字符串,应用程序ID和主密钥:
{
"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
运行脚本:
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
保存此进程列表:
pm2 save
[PM2] Dumping processes
pm2
的进程列表中正在运行的解析用户现在应该存储在/home/parse/.pm2
。
现在我们需要确保每次重新启动服务器时都会恢复我们之前在ecosystem.json
中定义的parse-wrapper
进程。幸运的是,pm2
可以自己生成和安装脚本。
退出常规sudo
用户:
exit
告诉pm2
安装Ubuntu的初始化脚本,为了作为解析用户运行,使用/home/parse
作为它的主目录:
sudo pm2 startup ubuntu -u parse --hp /home/parse/
[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.
我们将使用Nginx的网络服务器来为parse-server
提供一个反向代理,这样我们就可以使解析API安全地通过TLS / SSL。
在课程准备中,您设置default
服务器以响应您的域名,使用由Let的加密证书提供的SSL。我们将使用我们的代理信息更新此配置文件。
在nano
(或您选择的编辑器)中打开/etc/nginx/sites-enabled/default
:
sudo nano /etc/nginx/sites-enabled/default
在主server
块(它应该已经包含一个location /
块)中添加另一个location
块来处理/parse/
URL 的代理:
. . .
# 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以使更改生效:
sudo service nginx restart
Output * Restarting nginx nginx
...done.
在此阶段,您应该具备以下条件:
parse-server
,配置了您的应用程序所需的密钥pm2
在解析用户下管理parse-server
的进程,并启动脚本子使在开机时重新启动pm2
。nginx
进行保护,并配置为从https://your_domain_name/parse
到parse-server
实例的代理连接现在应该可以使用curl
来进行测试读取,写入和云代码执行。
注意:与测试或开发应用程序一起使用时,本节中的curl
命令应该是无害的。将数据写入生产应用程序时要小心。
您需要为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} | 发送数据本身 |
把这些放在一起,我们得到:
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
{"objectId":"YpxFdzox3u","createdAt":"2016-02-18T18:03:43.188Z"}
由于curl
默认情况下发送GET请求,并且我们没有提供任何数据,因此您只需要发送应用程序ID以便读取一些示例数据:
curl -H "X-Parse-Application-Id: your_application_id" https://your_domain_name/parse/classes/GameScore
{"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()
函数:
curl -X POST \
-H "X-Parse-Application-Id: your_application_id" \
-H "Content-Type: application/json" \
-d '{}' \
https://your_domain_name/parse/functions/hello
{"result":"Hi"}
如果您已经迁移了自己的自定义云代码,则可以使用已知函数进行测试main.js
。
下一步将是更改客户端应用程序本身以使用Parse Server API端点。请参阅有关将Parse SDK与Parse Server一起使用的官方文档。您将需要适用于您的平台的最新版本的SDK。与上面的基于curl
测试的测试一样,将此字符串用于服务器URL:
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 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有