云服务 新浪 SAE 部署过程中的几个小坑

xhj6 · 2012年11月25日 · 最后由 xhj6 回复于 2012年11月28日 · 4684 次阅读

首先感谢 @lgn21st 送的邀请码。

得到邀请码后,昨天就把自己刚开始开发的一个项目部署上去了,总体而言,非常的简单,按官方的文档操作就是了。我这里把它综合一下,主要是减少初次接触 Cloud Foundry 的兄弟的 google 时间。

1. Gemfile

官方文档中有这么一段:

# For Ruby 1.9 Cloud Foundry requires a tweak to the jquery-rails gem.
# gem 'jquery-rails'
gem 'cloudfoundry-jquery-rails'

# For Ruby 1.9 Cloud Foundry requires a tweak to devise.
# Uncomment next line if you plan to use devise.
# gem 'cloudfoundry-devise', :require => 'devise'

但是 cloudfoundry-jquery-railscloudfoundry-devise 都差不多有一年没有维护了,咋整?

其实是文档中没有把 require a tweak 说清楚,事实上只不过就是 jquery-rails 和 devise 的 gemspec 中的作者姓名中包含有非 ASCII 的 UTF 字符,把这些字符去掉就可以了。如果你嫌自己 fork 代码麻烦,也可以直接用我 fork 的:

gem 'jquery-rails', :git => 'git://github.com/xhj/jquery-rails.git'
gem 'devise', :git => 'git://github.com/xhj/devise.git'

2. MySQL

据说 Cloud Foundry 是支持自动化配置 MySQL 的,但我没有试,因为手工配置也是很简单的,如下:

首先在 Gemfile 中加入gem 'cf-runtime'

然后在 database.yml 中这么配置:

adapter: mysql2
  encoding: utf8
  <% require 'cfruntime/properties' %>
  <% db_svc = CFRuntime::CloudApp.service_props('mysql') %>
  database: <%= db_svc[:database] rescue 'xxx_production' %>
  username: <%= db_svc[:username] rescue 'xhj' %>
  password: <%= db_svc[:password] rescue 'xhj_love_xxx' %>
  host: <%= db_svc[:host] rescue 'localhost' %>
  port: <%= db_svc[:port] rescue '3306' %>

最后再新建一个初始化文件cf_db_migrate.rb,内容如下:

require 'cfruntime/properties'

# Run the equivalent of rake db:migrate on startup
if CFRuntime::CloudApp.running_in_cloud?
  migrations = Rails.root.join('db','migrate')
  if migrations.directory?
    ActiveRecord::Migrator.migrate(migrations)
  end
end

这些基本上都是官方文档中有的,算不上坑,只是我找这些文档时花了点时间,所以还是记在这里。

3. 504

然后我就开始部署了:

$ vmc push --runtime ruby19
Would you like to deploy from the current directory? [Yn]: y
Application Name: xxx
Detected a Rails Application, is this correct? [Yn]: y
Application Deployed URL [xxx.scfapp.com]: 
Memory reservation (128M, 256M, 512M, 1G, 2G) [256M]: 
How many instances? [1]: 
Create services to bind to 'xxx'? [yN]: y
1: mongodb
2: mysql
3: rabbitmq
4: redis
What kind of service?: 2
Specify the name of the service [mysql-ef6f0]: mysql-xxx
Create another? [yN]: N
Would you like to save this configuration? [yN]: y
Manifest written to manifest.yml.
Creating Application: OK
Creating Service [mysql-xxx]: OK
Binding Service [mysql-xxx]: OK
Uploading Application:
  Checking for available resources: OK
  Processing resources: OK
  Packing application: OK
  Uploading (24M): OK   
Push Status: OK
Staging Application 'xxx': ...............................Error (JSON 504): <html>
<head><title>504 Gatewa...

看着一个个绿色的 OK,心想不对啊,TMD 顺利得一塌糊涂的,怎么也应该出点错啥?

然后马上就如愿以偿了,来了个红色的 504 错误,啥玩意儿?

答案:内存整小了,把默认的 256M 改成 512M 就过了。

end.

心想不对啊,TMD顺利得一塌糊涂的,怎么也应该出点错啥? 每次新装一个东西的时候我也有这样的心态。。。

还有个坑..SAE 是 Ruby1.9.2,不支持 mongoid

哈哈,我才发帖,就有人在我的应用里注册用户了,有人的好奇心超级强啊:D不是的,是在我发帖之前注册的,来自 山西省忻州市联通的兄弟 😄

不过,我发觉 SAE 可能不太适合我这个网站,因为我需要上传 Excel 文件,然后在线把它转换为 pdf 和 swf 文件,如果不用 vps 好像很难做到。

不错不错,谢谢楼主分享!

最后这个问题我也遇到了,错误信息:

Error (JSON 504): <html>
<head><title>504 Gatewa...

修改内存后还是报错。但通过 vmc apps 却看到其实已经运行了。url 访问后发现其实已经成功了。

免费的 rails 加上免费的空间,对于初学者是越来越友好了。

Cloud Foundry 的部分文档已过时,或者本身就存在错误。楼主提到的第 1,第 2 点就是这个原因。 现阶段文档为 Cloud Foundry 官方文档,下一阶段我们会考虑修正或者补充文档的。

对于第 3 点,以及 #5 楼 @sandybeauty 所说的。首先用户的应用在本地需要能够正常运行,然后根据 PaaS 要求对部分代码做出更改,最后上传的配置也应该正确 (--runtime ruby19, 内存大小分配等)。出错时,用户可以查看出错报告或日记,或向我们提出反馈。

PaaS 本身的基因就决定了"提供很大方便的同时限制也增多",还有我们刚开始内测,请给我们一点时间和理解,谢谢支持。

补充#3 楼 @xhj6http://esdb.scfapp.com/ 楼主的应用应该是这个吧。注册的那位同学是我

@leekelby 失敬失敬,原来是官方的同学大驾光临啊!

我非常支持啊,总体而言在 Cloud Foundry 上部署过程比部署到单独的服务器上简单多了,感觉这个服务非常靠谱。

另外,李兄对于我文件转换的需求有什么招没有,在云上能不能完成?或者折衷方案也可以,我真的很想用你们的服务,给点建议吧,谢谢!

#9 楼 @xhj6 不用这么客气,我也只是 Ruby 开发者之一。

考虑到安全等因素,目前"文件上传"都还比较麻烦,在线上"文件转换"就不必说了。我们已经在寻找折衷方案 (而作为个人,我已向 CF 官方找答案)

文件上传好整,感觉上应该可以使用 OSS 这类东东。

而对于文件转换,如果 CF 官方能够提供 pdf2swf 的在线服务接口的话,就完全能够满足我的需求了,帮我呼吁一下吧,谢谢!

我部署上去一直是 404 噢~push 的时候会有这个错误 .Error (JSON 504):

504 Gatewa...

整了一下,也是出现这样错。有时间在整整,多谢楼主分享!

#3 楼 @xhj6 新浪 SAE 部署可以部署 rails 项目吗

需要 登录 后方可回复, 如果你还没有账号请 注册新账号