如何在 Google 云上部署 Sails.js 项目?
How to deploy a Sails.js project on Google cloud?
我已经按照 https://cloud.google.com/nodejs/ 的教程进行操作,我可以在 Google 云上获得 node.js 应用程序 运行ning,但我正在使用 Sails.js对于我的项目,如果我尝试使用
gcloud preview app deploy app.yaml --set-default
,部署失败。
我找不到有关如何部署 sails 应用程序的教程。
我应该遵循哪些步骤?
编辑:我得到的错误是 ERROR: (gcloud.preview.app.deploy) Not enough VMs ready (0/1 ready, 1 still deploying). Deployed Version: 20150623t154347.385222953610879860
即使使用 sails new my_project
.
创建的默认 "empty" 帆项目,我也能得到这个
更新:我可以使用另一个 google 项目进行部署,其中 CPU 配额没有用完,但是:
- 当我查看 https://console.developers.google.com/project/my-project/compute/quotas 时,我发现每次 运行 gcloud deploy 时都会使用额外的 CPU,并且使用的 CPU 的数量从未减少。我怎样才能释放这些 CPUs?
- 当我浏览到我的项目时,我只看到
Error: Server Error The service you requested is not available yet.
Please try again in 30 seconds.
知道是什么原因造成的吗?
更新 2:在 App 引擎控制台日志中我可以看到:
Fatal error: Unable to find local grunt.
如果 g运行t 是用
sudo npm install grunt --save
?
我最终成功了。 Grunt 的问题是通过在本地安装 grunt 和 grunt-cli 以及一堆其他依赖项来解决的。
以下是如何配置 Sails.js 项目以使其可部署在 Google 云端:
1) 在app.js开头添加以下内容:
"use strict";
var express = require('express');
var app = express();
app.use(require('./lib/appengine-handlers'));
2) 在项目根目录下创建一个app.yaml文件,内容如下:
# [START runtime]
runtime: custom
vm: true
api_version: 1
module: default
# [END runtime]
# [START resources]
resources:
cpu: .5
memory_gb: 1.3
disk_size_gb: 10
# [END resources]
# [START scaling]
automatic_scaling:
min_num_instances: 1
max_num_instances: 5
cool_down_period_sec: 60
cpu_utilization:
target_utilization: 0.5
# [END scaling]
env_variables:
NODE_ENV: production
3) 确保 package.json 文件包含以下脚本和依赖项:
"scripts": {
"start": "node app.js",
"monitor": "nodemon app.js",
"deploy": "gcloud preview app deploy app.yaml"
},
"dependencies": {
"express": "^4.12.0",
"gcloud": "^0.15.0",
"grunt": "^0.4.5",
"grunt-cli": "^0.1.13",
"grunt-contrib-clean": "^0.6.0",
"grunt-contrib-coffee": "^0.13.0",
"grunt-contrib-concat": "^0.5.1",
"grunt-contrib-copy": "^0.8.0",
"grunt-contrib-cssmin": "^0.12.3",
"grunt-contrib-jst": "^0.6.0",
"grunt-contrib-less": "^1.0.1",
"grunt-contrib-uglify": "^0.9.1",
"grunt-contrib-watch": "^0.6.1",
"grunt-gcloud": "^0.2.0",
"grunt-sails-linker": "^0.10.1",
"grunt-sync": "^0.2.3",
"sails": "^0.11.0",
"sails-disk": "^0.10.8"
}
4) 在项目根目录下创建Dockerfile文件,内容如下:
# [START docker]
FROM google/nodejs-runtime
# [END docker]
5) 通过修改config/local.js文件更改默认端口如下:
port: process.env.PORT || 8080
6) 安装所有依赖项并推送到云端:
sudo npm install --save
gcloud preview app deploy app.yaml --set-default
我遇到了同样的麻烦。无论我做什么,应用程序都无法部署并出现相同的错误。问题非常简单:我将主脚本文件命名为 index.js
而不是 app.js
。在我将我的主脚本重命名为 app.js
之后,一切开始正常工作。
关于 Sails.js 在 Google 云平台上
Google 云平台有 tutorial for deploying a Sail.js app to Google Cloud Platform, as well as a sample app you can clone and deploy yourself.
现在比 中描述的更容易。您可以直接在 app.yaml
文件中指定 runtime: nodejs
,而不必担心自定义 Dockerfile。
基本上:
使用他们的生成器生成您的 Sail.js 应用程序。
创建最小 app.yaml
文件:
runtime: nodejs
vm: true
env_variables:
PORT: 8080
更新package.json
:
"scripts": {
"debug": "node debug app.js",
"start": "node app.js",
"deploy": "gcloud preview app deploy app.yaml --promote --project <your-project-id>"
}
部署:
$ npm deploy
示例应用程序是 on GitHub,因此社区可以提交问题和 PR 并为后来者改进。
关于部署中出现的新实例
如果您没有在部署命令中指定已部署实例的版本,则会部署一个新实例,并为其分配一个生成的版本。 --promote
标志使新部署的版本成为用户实际看到的版本。之前部署的版本还是运行,需要手动删除,或者留着回滚
根据您的使用情况,保留以前的版本可能会很有用,这样您可以通过单击按钮回滚到它。
如果您不想在部署时创建新的 instance/version,则可以在现有 instance/version 之上部署您的应用程序。让我们来看一个场景:
克隆示例应用程序并首次部署它:
$ git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
$ cd nodejs-docs-samples/appengine/sails
$ gcloud preview app deploy app.yaml --promote --project <your-project-id>
创建了一个新实例并为其提供了一个自动生成的版本。假设您的新实例的版本为 1234
。现在再次部署:
$ gcloud preview app deploy app.yaml --promote --project <your-project-id>
在您的 Google Cloud Developer Console (https://console.developers.google.com/project/your-project-id/appengine/versions) 中,您会看到现在有两个版本:1234
和 5678 (default)
。 5678 (default)
表示5678
版本是用户去的那个,但是1234
版本还是运行,还是可以在特殊的url 在开发者控制台中。您可以停止、删除或回滚到 1234
版本。
现在,假设您更改了一些代码并想要重新部署,但您不想要新的实例和版本:
$ gcloud preview app deploy app.yaml --version 5678 --promote --project <your-project-id>
这次我们指定了一个现有版本,因此新代码将仅部署在现有实例和版本之上,您不会在开发者控制台中得到另一个 运行 实例。在开发过程中在现有版本之上重新部署可能很方便,但是当您需要即时回滚可用时,您可能不应该这样做,比如在您的生产版本中。如果您看到似乎表明您没有 VM 的错误,您可能需要清理以前部署的版本。
要删除以前部署的版本,从 App Engine 版本选项卡删除它,而不是从 Compute Engine VM 实例选项卡删除它。
干杯!
我已经按照 https://cloud.google.com/nodejs/ 的教程进行操作,我可以在 Google 云上获得 node.js 应用程序 运行ning,但我正在使用 Sails.js对于我的项目,如果我尝试使用
gcloud preview app deploy app.yaml --set-default
,部署失败。
我找不到有关如何部署 sails 应用程序的教程。 我应该遵循哪些步骤?
编辑:我得到的错误是 ERROR: (gcloud.preview.app.deploy) Not enough VMs ready (0/1 ready, 1 still deploying). Deployed Version: 20150623t154347.385222953610879860
即使使用 sails new my_project
.
更新:我可以使用另一个 google 项目进行部署,其中 CPU 配额没有用完,但是:
- 当我查看 https://console.developers.google.com/project/my-project/compute/quotas 时,我发现每次 运行 gcloud deploy 时都会使用额外的 CPU,并且使用的 CPU 的数量从未减少。我怎样才能释放这些 CPUs?
- 当我浏览到我的项目时,我只看到
Error: Server Error The service you requested is not available yet. Please try again in 30 seconds.
知道是什么原因造成的吗?
更新 2:在 App 引擎控制台日志中我可以看到:
Fatal error: Unable to find local grunt.
如果 g运行t 是用
sudo npm install grunt --save
?
我最终成功了。 Grunt 的问题是通过在本地安装 grunt 和 grunt-cli 以及一堆其他依赖项来解决的。
以下是如何配置 Sails.js 项目以使其可部署在 Google 云端:
1) 在app.js开头添加以下内容:
"use strict";
var express = require('express');
var app = express();
app.use(require('./lib/appengine-handlers'));
2) 在项目根目录下创建一个app.yaml文件,内容如下:
# [START runtime]
runtime: custom
vm: true
api_version: 1
module: default
# [END runtime]
# [START resources]
resources:
cpu: .5
memory_gb: 1.3
disk_size_gb: 10
# [END resources]
# [START scaling]
automatic_scaling:
min_num_instances: 1
max_num_instances: 5
cool_down_period_sec: 60
cpu_utilization:
target_utilization: 0.5
# [END scaling]
env_variables:
NODE_ENV: production
3) 确保 package.json 文件包含以下脚本和依赖项:
"scripts": {
"start": "node app.js",
"monitor": "nodemon app.js",
"deploy": "gcloud preview app deploy app.yaml"
},
"dependencies": {
"express": "^4.12.0",
"gcloud": "^0.15.0",
"grunt": "^0.4.5",
"grunt-cli": "^0.1.13",
"grunt-contrib-clean": "^0.6.0",
"grunt-contrib-coffee": "^0.13.0",
"grunt-contrib-concat": "^0.5.1",
"grunt-contrib-copy": "^0.8.0",
"grunt-contrib-cssmin": "^0.12.3",
"grunt-contrib-jst": "^0.6.0",
"grunt-contrib-less": "^1.0.1",
"grunt-contrib-uglify": "^0.9.1",
"grunt-contrib-watch": "^0.6.1",
"grunt-gcloud": "^0.2.0",
"grunt-sails-linker": "^0.10.1",
"grunt-sync": "^0.2.3",
"sails": "^0.11.0",
"sails-disk": "^0.10.8"
}
4) 在项目根目录下创建Dockerfile文件,内容如下:
# [START docker]
FROM google/nodejs-runtime
# [END docker]
5) 通过修改config/local.js文件更改默认端口如下:
port: process.env.PORT || 8080
6) 安装所有依赖项并推送到云端:
sudo npm install --save
gcloud preview app deploy app.yaml --set-default
我遇到了同样的麻烦。无论我做什么,应用程序都无法部署并出现相同的错误。问题非常简单:我将主脚本文件命名为 index.js
而不是 app.js
。在我将我的主脚本重命名为 app.js
之后,一切开始正常工作。
关于 Sails.js 在 Google 云平台上
Google 云平台有 tutorial for deploying a Sail.js app to Google Cloud Platform, as well as a sample app you can clone and deploy yourself.
现在比 app.yaml
文件中指定 runtime: nodejs
,而不必担心自定义 Dockerfile。
基本上:
使用他们的生成器生成您的 Sail.js 应用程序。
创建最小
app.yaml
文件:runtime: nodejs vm: true env_variables: PORT: 8080
更新
package.json
:"scripts": { "debug": "node debug app.js", "start": "node app.js", "deploy": "gcloud preview app deploy app.yaml --promote --project <your-project-id>" }
部署:
$ npm deploy
示例应用程序是 on GitHub,因此社区可以提交问题和 PR 并为后来者改进。
关于部署中出现的新实例
如果您没有在部署命令中指定已部署实例的版本,则会部署一个新实例,并为其分配一个生成的版本。 --promote
标志使新部署的版本成为用户实际看到的版本。之前部署的版本还是运行,需要手动删除,或者留着回滚
根据您的使用情况,保留以前的版本可能会很有用,这样您可以通过单击按钮回滚到它。
如果您不想在部署时创建新的 instance/version,则可以在现有 instance/version 之上部署您的应用程序。让我们来看一个场景:
克隆示例应用程序并首次部署它:
$ git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git $ cd nodejs-docs-samples/appengine/sails $ gcloud preview app deploy app.yaml --promote --project <your-project-id>
创建了一个新实例并为其提供了一个自动生成的版本。假设您的新实例的版本为
1234
。现在再次部署:$ gcloud preview app deploy app.yaml --promote --project <your-project-id>
在您的 Google Cloud Developer Console (https://console.developers.google.com/project/your-project-id/appengine/versions) 中,您会看到现在有两个版本:
1234
和5678 (default)
。5678 (default)
表示5678
版本是用户去的那个,但是1234
版本还是运行,还是可以在特殊的url 在开发者控制台中。您可以停止、删除或回滚到1234
版本。现在,假设您更改了一些代码并想要重新部署,但您不想要新的实例和版本:
$ gcloud preview app deploy app.yaml --version 5678 --promote --project <your-project-id>
这次我们指定了一个现有版本,因此新代码将仅部署在现有实例和版本之上,您不会在开发者控制台中得到另一个 运行 实例。在开发过程中在现有版本之上重新部署可能很方便,但是当您需要即时回滚可用时,您可能不应该这样做,比如在您的生产版本中。如果您看到似乎表明您没有 VM 的错误,您可能需要清理以前部署的版本。
要删除以前部署的版本,从 App Engine 版本选项卡删除它,而不是从 Compute Engine VM 实例选项卡删除它。
干杯!