如何在Google云上部署Sails.js项目?

时间:2015-06-23 14:01:15

标签: node.js sails.js google-cloud-platform gcloud

我已经按照https://cloud.google.com/nodejs/的教程进行了操作,我可以在Google云上运行一个node.js应用,但是我正在为我的项目使用Sails.js,如果我尝试使用它来部署它 gcloud preview app deploy app.yaml --set-default,部署失败。

我找不到有关如何部署风帆应用的教程。 我应该遵循哪些步骤?

编辑:我得到的错误是ERROR: (gcloud.preview.app.deploy) Not enough VMs ready (0/1 ready, 1 still deploying). Deployed Version: 20150623t154347.385222953610879860 即使使用sails new my_project创建的默认“空”风帆项目,我也能得到它。

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

  

错误:服务器错误您请求的服务尚不可用。   请在30秒后再试一次。

知道是什么原因引起的吗?

UPDATE2:在App引擎控制台日志中,我可以看到:

  

致命错误:无法找到当地的咕噜声。

如果安装的话,不应该已经成为我项目的一部分 sudo npm install grunt --save

3 个答案:

答案 0 :(得分:4)

关于Google Cloud Platform上的Sails.js

Google Cloud Platform有一个tutorial for deploying a Sail.js app to Google Cloud Platform,以及一个示例应用,clone and deploy yourself

现在它比accepted answer中描述的更容易。您可以直接在runtime: nodejs文件中指定app.yaml,而不必担心自定义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
    
  5. 示例应用是on GitHub,因此社区可以提交问题和PR,并为后来的人提供改进。

    关于部署中出现的新实例

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

    根据您的使用情况,保留以前的版本可能很有用,这样您只需点击一下按钮就可以回滚它。

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

    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版本仍在运行,您仍然可以通过开发者控制台中的特殊网址访问该版本。您可以停止,删除或回滚到1234版本。

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

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

      这次我们指定了一个现有版本,因此新代码将仅部署在现有实例和版本之上,并且您不会在Developer Console中以另一个正在运行的实例结束。在开发过程中可以方便地在现有版本之上重新部署,但是当您需要即时回滚时,您可能不应该这样做,例如在生产版本期间。如果您发现错误似乎表明您已离开虚拟机,则可能需要先清理以前部署的版本。

      要删除以前部署的版本,从App Engine版本选项卡中删除,而不是从“计算引擎VM实例”选项卡中删除。

    5. 干杯!

答案 1 :(得分:1)

我最终成功了。 Grunt的问题是通过在本地安装grunt和grunt-cli以及一堆其他依赖项来排序的。

以下是如何配置Sails.js项目以使其可在Google Cloud上部署:

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

答案 2 :(得分:0)

我遇到了同样的麻烦。无论我做了什么,应用程序都无法部署同样的错误。问题非常简单:我将主脚本文件命名为import UIKit class KeyboardViewController: UIInputViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { @IBOutlet var nextKeyboardButton: UIButton! @IBOutlet var collectionView: UICollectionView! override func updateViewConstraints() { super.updateViewConstraints() // Add custom view sizing constraints here } override func viewDidLoad() { super.viewDidLoad() print("keyboard view loaded") //keyboard nib setup let nib = UINib(nibName: "KeyboardView", bundle: nil) let objects = nib.instantiateWithOwner(self, options: nil) view = objects[0] as! UIView //cell setup collectionView.registerNib(UINib(nibName: "CustomCell", bundle: nil), forCellWithReuseIdentifier: "MyCell") // Perform custom UI setup here self.nextKeyboardButton = UIButton(type: .System) self.nextKeyboardButton.setTitle(NSLocalizedString("Next Keyboard", comment: "Title for 'Next Keyboard' button"), forState: .Normal) self.nextKeyboardButton.sizeToFit() self.nextKeyboardButton.translatesAutoresizingMaskIntoConstraints = false self.nextKeyboardButton.addTarget(self, action: "advanceToNextInputMode", forControlEvents: .TouchUpInside) self.view.addSubview(self.nextKeyboardButton) let nextKeyboardButtonLeftSideConstraint = NSLayoutConstraint(item: self.nextKeyboardButton, attribute: .Left, relatedBy: .Equal, toItem: self.view, attribute: .Left, multiplier: 1.0, constant: 0.0) let nextKeyboardButtonBottomConstraint = NSLayoutConstraint(item: self.nextKeyboardButton, attribute: .Bottom, relatedBy: .Equal, toItem: self.view, attribute: .Bottom, multiplier: 1.0, constant: 0.0) self.view.addConstraints([nextKeyboardButtonLeftSideConstraint, nextKeyboardButtonBottomConstraint]) } 而不是index.js。将我的主脚本重命名为app.js后,一切都开始正常工作。