我跟随Ryan的屏幕录像并部署到VPS。 所以我使用Unicorn + nginx + github + Ubuntu 12.04 LTS + capistrano。 另外我用i18n来翻译应用程序。
我也想注意到,我使用Carriarewave进行图片上传。 Carriarewave在本地保存VPS上的图片。 当我上传的图像,它的作品很棒,上传的图片出现。
但每当我部署新的更改到服务器,然后所有我的照片被打破。 这真是太棒了。 我尝试手动重新启动nginx:
sudo service nginx restart
而我试图重新启动麒麟:
/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>'
我的configuration/ 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
好的,我找到了解决方案。 出现这个问题是因为我没有更改默认文件夹来保存图像。 您可以在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
现在一切正常。
好的! 我已经延长了你的Capistrano配方。
# 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