部署时踩坑七牛云存储。
写在前面
前段时间,租了阿里云,买了域名,最近折腾了下,终于把之前做的网站部署上去了。
整个部署过程中,感觉最虐的就是七牛云那块了,对于半路出家的新手来说,真是个不小的坑。记录下这段虐心的旅程。
正文
我用的是Capistrano来部署Rails项目,这里只记录一下我在远端服务器运行seed时,会出现的问题。
好,我们开始吧!
当你在终端~/yourproject_name/current
执行RAILS_ENV=production bundle exec rake db:seed
, 可能会出现如下报错:
NoMethodError: undefined method qiniu_up_host
这个报错出现的有些奇怪,我在本地运行
rake db:seed
时,也报错,而我之前部署到heroku时并没有出现过这种情况,不解。虽然不理解它为什么会出现,但是有问题咱就得想着解决,看看怎么破了它。
解决办法:
方法很粗暴。
在本地的config/initializers/carrierwave.rb
文件中,将host那一行直接注释,然后运行rake db:seed
, 发现OK啦。为什么我会想到直接注释?Google了下,发现如果你的服务器在国内,qiniu_up_host是可以不用设置的。
另外,还有一种情况是config.qiniu_up_host的值写错了,不同的存储区域是不一样的,具体可以参见七牛开发者中心-存储区域。
TypeError: no implicit conversion of nil to String
出现这个情况,是因为我使用了Figaro 管理密码,之前部署到heroku时,终端运行
figaro heroku:set -e production
就可以了,但是这里,我们怎么把七牛对应的AccessKey,SecretKey等信息放入remote server呢?其实,Figaro 的README文档中已经提到了,咱们这么来:
Step1、在远端的
~/yourproject_name/shared/config
中,添加application.yml
, 内容如下:```Ruby
production:
qiniu_access_key: xxxx # 你的 qiniu AccessKeyqiniu_secret_key: xxxx # 你的 qiniu SecretKey
qiniu_bucket: xxxx # 你的 qiniu bucket
qiniu_bucket_domain: xxxx # 你的 qiniu bucket domain
development:
qiniu_access_key: xxxx # 你的 qiniu AccessKey
qiniu_secret_key: xxxx # 你的 qiniu SecretKey
qiniu_bucket: xxxx # 你的 qiniu bucket
qiniu_bucket_domain: xxxx # 你的 qiniu bucket domain
这里,虽然我们添加了这个文件,但是由于你的`config/deploy.rb`中没有设置,所以部署的时候并不会去连接这个文件。
Step2、在本机上编辑`config/deploy.rb`,将`application.yml`添加进去:
```Ruby
- append :linked_files, "config/database.yml", "config/secrets.yml"
+ append :linked_files, "config/database.yml", "config/secrets.yml", "config/application.yml"
OK啦!记得commit 和 push,再运行 cap production deploy
,最后在远端服务器运行seed。
TypeError: class or module required for rescue clause
看到报错,第一反应就是google,在carrierwave-qiniu configuration error #17 中, 提到
qiniu-rs
这个gem已经没有人在维护了,要安装最新版的carrierwave-qiniu
。好,那就重新安装,又不是第一次被版本坑了: P。在gemfile中做如下修改:
+ gem 'carrierwave-qiniu', '~> 1.1.5' - gem 'qiniu-rs'
终端运行
bundle install
, 报错显示:显示没有mime-types,按照提示,运行
bundle update
, OK!
The end
Attention:
请在每次修改后,进行git commit 和 git push ,然后在本地运行 cap production deploy
部署,Capistranno会从GitHub上拉下最新的进度,最后在远端服务器的~/yourproject_name/current
目录下,运行RAILS_ENV=production bundle exec rake db:seed
。
哦,附上我的成品Together is better : P.