需要将应用程序从 Heroku 转到 DigitalOcean 上,遇到两个问题,问题描述和解决方案如下:
Heroku 有非常好的管理 ENV 变量的机制,但是对于 VPS 一直未见特别完美的方案。有很多的 Gem 可以用,我也用过 SettingsLogics,但是显然,受制于加载顺序,SettingsLogic 对于 database.yml 或者 initializers 一类的文件基本就没用了。今天发现下面的这个方法,感觉符合自己的预期,故推荐下。 参考:http://quickleft.com/blog/simple-rails-app-configuration-settings
主要两点:
在 config/application.rb
文件的 module Whatever
之前,加入:
ENV.update YAML.load_file('config/application.yml')[Rails.env] rescue {}
然后创建 config/application.yml
, 内容如下:
defaults: &defaults
email: [email protected]
secret: foo123
development:
<<: *defaults
test:
<<: *defaults
email: [email protected]
production:
<<: *defaults
email: [email protected]
secret: 321oof
之后你就可以使用类似 ENV['email']
的变量了。不过这个也有一个非常小的问题,就是 YAML 文件只能一层,不能进行嵌套,也不支持 YAML 的数组或者列表的结构。
不要将 config/application.yml
签到你的代码库中,由于 rescue {}
的存在,因此,即使没有 config/application.yml
这个文件,也不会挂掉。
项目开发环境用 file 存储,生产环境通过 fog 来用 s3 这个也没有问题,唯独用的时候才发现 file 默认的是相对路径。可是我这个是给移动端用的,你给我想对路径我还怎么搞…… 后来发现,可以简单的设置 CarrierWave.configure.asset_host 来给开发环境设置默认使用绝对路径。直接贴配置文件吧,相信大家明白什么意思。
# File at config/initializers/carrierwave.rb
require 'carrierwave'
require 'carrierwave/orm/activerecord'
CarrierWave.configure do |config|
if Rails.env.development? || Rails.env.test?
config.storage = :file
config.asset_host = ENV['asset_host'] # 这行的作用就是强制在file的url前面附加 ENV['asset_host'] 的内容
else
config.storage = :fog
config.fog_credentials = {
:provider => 'AWS', # required
:aws_access_key_id => ENV['aws_access_key_id'], # your aws access key id
:aws_secret_access_key => ENV['aws_secret_access_key'] # your aws secret access key
# :region => ENV['S3_REGION'] # your bucket's region in S3, defaults to 'us-east-1'
}
# your S3 bucket name
config.fog_directory = '*********'
# custome your domain on aws S3, defaults to nil
# config.fog_host = 'http://myapp.com'
config.fog_public = false # optional, defaults to true
# config.fog_attributes = {'Cache-Control'=>'max-age=315576000'} # optional, defaults to {}
end
end