如何在 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 配额没有用完,但是:

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。

基本上:

  1. 使用他们的生成器生成您的 Sail.js 应用程序。

  2. 创建最小 app.yaml 文件:

    runtime: nodejs
    vm: true
    env_variables:
      PORT: 8080
    
  3. 更新package.json:

    "scripts": {
      "debug": "node debug app.js",
      "start": "node app.js",
      "deploy": "gcloud preview app deploy app.yaml --promote --project <your-project-id>"
    }
    
  4. 部署:

    $ npm deploy
    

示例应用程序是 on GitHub,因此社区可以提交问题和 PR 并为后来者改进。

关于部署中出现的新实例

如果您没有在部署命令中指定已部署实例的版本,则会部署一个新实例,并为其分配一个生成的版本。 --promote 标志使新部署的版本成为用户实际看到的版本。之前部署的版本还是运行,需要手动删除,或者留着回滚

根据您的使用情况,保留以前的版本可能会很有用,这样您可以通过单击按钮回滚到它。

如果您不想在部署时创建新的 instance/version,则可以在现有 instance/version 之上部署您的应用程序。让我们来看一个场景:

  1. 克隆示例应用程序并首次部署它:

    $ 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>
    
  2. 创建了一个新实例并为其提供了一个自动生成的版本。假设您的新实例的版本为 1234。现在再次部署:

    $ gcloud preview app deploy app.yaml --promote --project <your-project-id>
    
  3. 在您的 Google Cloud Developer Console (https://console.developers.google.com/project/your-project-id/appengine/versions) 中,您会看到现在有两个版本:12345678 (default)5678 (default)表示5678版本是用户去的那个,但是1234版本还是运行,还是可以在特殊的url 在开发者控制台中。您可以停止、删除或回滚到 1234 版本。

  4. 现在,假设您更改了一些代码并想要重新部署,但您不想要新的实例和版本:

    $ gcloud preview app deploy app.yaml --version 5678 --promote --project <your-project-id>
    

    这次我们指定了一个现有版本,因此新代码将仅部署在现有实例和版本之上,您不会在开发者控制台中得到另一个 运行 实例。在开发过程中在现有版本之上重新部署可能很方便,但是当您需要即时回滚可用时,您可能不应该这样做,比如在您的生产版本中。如果您看到似乎表明您没有 VM 的错误,您可能需要清理以前部署的版本。

    要删除以前部署的版本,从 App Engine 版本选项卡删除它,而不是从 Compute Engine VM 实例选项卡删除它。

干杯!