我已经按照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
?
答案 0 :(得分:4)
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。
基本上:
使用他们的生成器生成您的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,并为后来的人提供改进。
如果未在deploy命令中指定已部署实例的版本,则将部署新实例,并为其分配生成的版本。 --promote
标志使新部署的版本成为用户实际看到的版本。以前部署的版本仍在运行,您必须手动删除它们,或保留它们以便您可以回滚。
根据您的使用情况,保留以前的版本可能很有用,这样您只需点击一下按钮就可以回滚它。
如果您不希望在部署时创建新实例/版本,则可以在现有实例/版本之上部署应用程序。让我们来看一个场景:
克隆示例应用并首次部署它:
$ 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
版本仍在运行,您仍然可以通过开发者控制台中的特殊网址访问该版本。您可以停止,删除或回滚到1234
版本。
现在,假设您进行了一些代码更改,并且想要重新部署,但是您不需要新的实例和版本:
$ gcloud preview app deploy app.yaml --version 5678 --promote --project <your-project-id>
这次我们指定了一个现有版本,因此新代码将仅部署在现有实例和版本之上,并且您不会在Developer Console中以另一个正在运行的实例结束。在开发过程中可以方便地在现有版本之上重新部署,但是当您需要即时回滚时,您可能不应该这样做,例如在生产版本期间。如果您发现错误似乎表明您已离开虚拟机,则可能需要先清理以前部署的版本。
要删除以前部署的版本,从App Engine版本选项卡中删除,而不是从“计算引擎VM实例”选项卡中删除。
干杯!
答案 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
后,一切都开始正常工作。