Node.js 如何在谷歌云上部署Sails.js项目?

Node.js 如何在谷歌云上部署Sails.js项目?,node.js,sails.js,google-cloud-platform,gcloud,Node.js,Sails.js,Google Cloud Platform,Gcloud,我已经学习了多年的教程,我可以在Google cloud上运行node.js应用程序,但是我在我的项目中使用Sails.js,如果我尝试使用 gcloud preview app deploy app.yaml--设置默认值,部署失败 我找不到关于如何部署sails应用程序的教程。 我应该遵循哪些步骤 编辑:我得到的错误是错误:(gcloud.preview.app.deploy)没有足够的VMs就绪(0/1就绪,1仍在部署)。部署版本:20150623t154347.3852229531087

我已经学习了多年的教程,我可以在Google cloud上运行node.js应用程序,但是我在我的项目中使用Sails.js,如果我尝试使用
gcloud preview app deploy app.yaml--设置默认值
,部署失败

我找不到关于如何部署sails应用程序的教程。 我应该遵循哪些步骤

编辑:我得到的错误是
错误:(gcloud.preview.app.deploy)没有足够的VMs就绪(0/1就绪,1仍在部署)。部署版本:20150623t154347.38522295310879860
即使是使用
sails new my_项目创建的默认“empty”sails项目,我也会得到这个结果

更新:我可以使用不同的google项目进行部署,其中CPU配额没有达到最大值,但是:

  • 当我查看时,我发现每次运行gcloud deploy时都会使用额外的CPU,并且使用的CPU数量从未减少。如何释放这些CPU
  • 当我浏览到我的项目时,我看到的是
错误:服务器错误您请求的服务尚不可用。 请在30秒后重试

你知道这是什么原因吗

更新2:在应用程序引擎控制台日志中,我可以看到:

致命错误:找不到本地grunt

如果安装了grunt,它不应该已经是我项目的一部分了吗
sudo npm安装grunt——保存?

我最终成功了。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
# [START docker]
FROM google/nodejs-runtime
# [END docker]
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 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
# [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 谷歌云平台有一个,以及一个你可以使用的示例应用程序

现在,它甚至比在文章中描述的更容易。您可以直接在
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>"
    }
    
  • 示例应用程序是,因此社区可以提交问题和PRs,并为后面的人改进内容

    关于部署时出现的新实例 如果未在deploy命令中指定已部署实例的版本,则将部署一个新实例,并为其分配生成的版本。
    --promote
    标志使新的eployed版本成为用户实际看到的版本。以前部署的版本仍在运行,您必须手动删除它们,或者保留它们以便回滚

    根据您的用例,保留以前的版本可能会很有用,这样您就可以在单击按钮时回滚到它

    如果您不希望在部署时创建新实例/版本,则可以在现有实例/版本的基础上部署应用程序。让我们浏览一个场景:

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

    $ 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>
    
  • 在Google Cloud Developer控制台()中,您将看到现在有两个版本:
    1234
    5678(默认)
    5678(默认)
    意味着
    5678
    版本是用户访问的版本,但是
    1234
    版本仍在运行,您仍然可以在开发人员控制台中的特殊url访问它。您可以停止、删除或回滚到
    1234
    版本

  • 现在,假设您进行了一些代码更改,并希望重新部署,但不需要新的实例和版本:

    $ gcloud preview app deploy app.yaml --version 5678 --promote --project <your-project-id>
    
    $gcloud预览应用程序部署app.yaml--版本5678--升级--项目
    
    这一次,我们指定了一个现有版本,因此新代码将部署在现有实例和版本之上,并且您不会在开发人员控制台中遇到另一个正在运行的实例。在开发过程中,在现有版本的基础上重新部署是很方便的,但是当您需要即时回滚时,例如在生产版本中,您可能不应该这样做。如果您看到的错误似乎表明您的虚拟机已用完,您可能需要去清理以前部署的版本

    要删除以前部署的版本,请从App Engine versions选项卡中删除它,而不是从Compute Engine VM Instances选项卡中删除它


  • 干杯

    您能添加您在
    gcloud
    或控制台上看到的实际输出或错误吗?仅考虑到“部署失败”,很难调试此问题。如果您使用的是托管虚拟机,则需要在项目中启用计算引擎。如果您的计算引擎已启用,您需要检查是否有可用于部署的GCE配额。我正在使用app engine,但尚未配置计算引擎。我可以看到,我有1个VM实例用于app engine(),但最多有8个VM实例用于compute engine()。我发现可以使用“gcloud compute instances delete”或通过web界面删除计算实例。然而,当浏览到我的项目时,我仍然得到服务器错误,并且在m上有一个错误