我关注Ryan's screencast并部署到VPS。所以我使用Unicorn + nginx + github + Ubuntu 12.04 LTS + capistrano。我也使用i18n来翻译应用程序。
我还想注意我使用Carriarewave进行图片上传。 Carriarewave在本地保存VPS图片。当我上传图片时效果很好,上传的图片就会出现。
但是每当我对服务器部署新的更改时,我的所有图片都会被破坏。这真的很糟糕。我尝试手动重启nginx:
sudo service nginx restart
我试图重启Unicorn:
/etc/init.d/unicorn_Chirch_app restart
也没有用。
当我尝试手动打开破碎的页面时,它说:
The page you were looking for doesn't exist.
You may have mistyped the address or the page may have moved.
当我尝试在控制台中查找图片时:
> Photo.all
> => [#<Photo id: 3, description: nil, created_at: "2013-01-21 11:14:01", updated_at: "2013-01-21 11:14:01", image: "1320700703588.jpg">, #<Photo id: 4, description: nil, created_at: "2013-01-21 11:14:01", updated_at: "2013-01-21 11:14:01", image: "Seasonscape_by_alexiuss.jpg">, #<Photo id: 5, description: nil, created_at: "2013-01-21 11:30:30", updated_at: "2013-01-21 11:30:30", image: "Seasonscape_by_alexiuss.jpg">]
据我所知他们应该存在。
日志错误:
Started GET "/ru/uploads%2Fphoto%2Fimage%2F4%2FSeasonscape_by_alexiuss" for 89.178.205.47 at 2013-01-21 11:31:17 +0000
ActionController::RoutingError (No route matches [GET] "/ru/uploads%2Fphoto%2Fimage%2F4%2FSeasonscape_by_alexiuss"):
actionpack (3.2.8) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
actionpack (3.2.8) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call'
railties (3.2.8) lib/rails/rack/logger.rb:26:in `call_app'
railties (3.2.8) lib/rails/rack/logger.rb:16:in `call'
actionpack (3.2.8) lib/action_dispatch/middleware/request_id.rb:22:in `call'
rack (1.4.4) lib/rack/methodoverride.rb:21:in `call'
rack (1.4.4) lib/rack/runtime.rb:17:in `call'
activesupport (3.2.8) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
rack (1.4.4) lib/rack/lock.rb:15:in `call'
rack-cache (1.2) lib/rack/cache/context.rb:136:in `forward'
rack-cache (1.2) lib/rack/cache/context.rb:245:in `fetch'
rack-cache (1.2) lib/rack/cache/context.rb:185:in `lookup'
rack-cache (1.2) lib/rack/cache/context.rb:66:in `call!'
rack-cache (1.2) lib/rack/cache/context.rb:51:in `call'
railties (3.2.8) lib/rails/engine.rb:479:in `call'
railties (3.2.8) lib/rails/application.rb:223:in `call'
railties (3.2.8) lib/rails/railtie/configurable.rb:30:in `method_missing'
unicorn (4.5.0) lib/unicorn/http_server.rb:552:in `process_client'
unicorn (4.5.0) lib/unicorn/http_server.rb:628:in `worker_loop'
unicorn (4.5.0) lib/unicorn/http_server.rb:500:in `spawn_missing_workers'
unicorn (4.5.0) lib/unicorn/http_server.rb:511:in `maintain_worker_count'
unicorn (4.5.0) lib/unicorn/http_server.rb:277:in `join'
unicorn (4.5.0) bin/unicorn:121:in `<top (required)>'
/home/deployer/apps/My_app/shared/bundle/ruby/1.9.1/bin/unicorn:23:in `load'
/home/deployer/apps/My_app/shared/bundle/ruby/1.9.1/bin/unicorn:23:in `<main>'
我的 config / deploy.rb
require "bundler/capistrano"
server "my_ip_here", :web, :app, :db, primary: true
set :application, "My_app"
set :user, "deployer"
set :deploy_to, "/home/#{user}/apps/#{application}"
set :deploy_via, :remote_cache
set :use_sudo, false
set :scm, "git"
set :repository, "git@github.com:MyName/#{application}.git"
set :branch, "master"
default_run_options[:pty] = true
ssh_options[:forward_agent] = true
after "deploy", "deploy:cleanup" # keep only the last 5 releases
namespace :deploy do
%w[start stop restart].each do |command|
desc "#{command} unicorn server"
task command, roles: :app, except: {no_release: true} do
run "/etc/init.d/unicorn_#{application} #{command}"
end
end
task :setup_config, roles: :app do
sudo "ln -nfs #{current_path}/config/nginx.conf /etc/nginx/sites-enabled/#{application}"
sudo "ln -nfs #{current_path}/config/unicorn_init.sh /etc/init.d/unicorn_#{application}"
run "mkdir -p #{shared_path}/config"
put File.read("config/database.example.yml"), "#{shared_path}/config/database.yml"
puts "Now edit the config files in #{shared_path}."
end
after "deploy:setup", "deploy:setup_config"
task :symlink_config, roles: :app do
run "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml"
end
after "deploy:finalize_update", "deploy:symlink_config"
desc "Make sure local git is in sync with remote."
task :check_revision, roles: :web do
unless `git rev-parse HEAD` == `git rev-parse origin/master`
puts "WARNING: HEAD is not the same as origin/master"
puts "Run `git push` to sync changes."
exit
end
end
before "deploy", "deploy:check_revision"
end
答案 0 :(得分:6)
好的,我找到了解决方案。问题出现是因为我没有更改默认文件夹来保留图像。您可以在public/uploads
中找到默认文件夹。这意味着每个cap deploy
将创建一个新的空文件夹,其中不包含旧文件。
要解决此问题,您应该创建另一个不在您的应用程序中的文件夹。我选择最简单的方法。我创建了symlinlk。
我的步骤:
1)在您的服务器上转到您应用的共享文件夹(它通过capistrano自动生成)。然后创建您的文件夹以保留新图像:
$ mkdir uploads
2)为创建的文件夹提供必要的权利:
$ sudo chmod 775 uploads
3)在config / deploy.rb中的本地计算机上添加:
task :symlink_config, roles: :app do
...
run "ln -nfs #{shared_path}/uploads #{release_path}/public/uploads"
end
4)然后推送git并展开:
$ git push
$ cap deploy:symlink
$ cap deploy
现在一切正常。
答案 1 :(得分:1)
# config/recipes/carrierwave.rb
namespace :carrierwave do
task :uploads_folder do
run "mkdir -p #{shared_path}/uploads"
run "#{sudo} chmod 775 #{shared_path}/uploads"
end
after 'deploy:setup', 'carrierwave:uploads_folder'
task :symlink do
run "ln -nfs #{shared_path}/uploads #{release_path}/public/uploads"
end
after 'deploy', 'carrierwave:symlink'
end
答案 2 :(得分:0)
@ExiRe和@Charlie答案适用于Capistrano2.x。在Capistrano 3.x中,命令 run 替换为命令 execute 。
因此,我通过以下步骤解决了这个问题:
lib/capistrano/tasks/carrierwave.rake
中创建一个包含以下内容的rake文件:namespace :carrierwave do task :uploads_folder do on roles(:app) do execute "mkdir -p #{shared_path}/uploads" execute "#{sudo} chmod 775 #{shared_path}/uploads" end end task :symlink do on roles(:app) do execute "ln -nfs #{shared_path}/uploads #{release_path}/public/uploads" end end end
如果没有,请在Capfile
的末尾添加以下行。
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
将这些任务与其他任务一起添加到config/deploy.rb
中。
after 'deploy:publishing', 'carrierwave:uploads_folder'
after 'deploy:publishing', 'carrierwave:symlink'
namespace :deploy do .. after 'deploy:publishing', 'carrierwave:uploads_folder' after 'deploy:publishing', 'carrierwave:symlink' .. end
现在,即使重新部署,您上传的图像仍将保存在shared/uploads
文件夹中。