Capistrano +每当宝石 - bin / rails:权限被拒绝

时间:2014-08-25 22:07:51

标签: ruby-on-rails ruby cron capistrano3

我配置了一个生产环境,可以部署并按原样运行。虽然我遇到了一个我无法弄清楚的辅助问题。

我正在运行Whenever gem来执行几个cron作业,Whenever gem capistrano实现让它们正确部署并且脚本正在执行。虽然在* everylog内部我收到以下输出:

/bin/bash: bin/rails: Permission denied

该脚本使用跑步者从RSS源进行更新,虽然我使用Capistrano部署到新服务器,但这在以前的生产部署中没有发生任何影响。

我四处搜索并找到了这个question,虽然每次部署时,我都必须使bin / rails可执行(由于Capistrano的日期戳部署)。有没有办法让Capistrano在部署时让我的文件可执行?或者使bin / rails可执行存在一些固有的安全风险?

2 个答案:

答案 0 :(得分:3)

我能够通过以下方式解决我的问题(名称空间包括为了简洁而包括重启):

namespace :deploy do

 desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      # Passenger restart mechanism
      execute :mkdir, '-p', "#{ release_path }/tmp"
      execute :touch, current_path.join('tmp/restart.txt')
    end
  end

  after :publishing, :restart

  after :restart, :x_bin_rails do
    on roles(:web), in: :groups, limit: 3, wait: 10 do
      within release_path do
        execute :chmod, "u+x bin/rails"
      end
    end
  end

end

答案 1 :(得分:0)

所以我的解决方案是使bin /文件夹成为共享文件夹

#config/deploy.rb
set :linked_dirs, fetch(:linked_dirs, []).push('bin')

然后在下次部署时,bin /文件夹将符号链接到shared / bin

您只需要转到此目录一次,从先前的分发中移动可执行文件

cp /your_deploy_path/releases/PREV_RELEASE/bin/* /your_deploy_path/shared/bin

...并确保chmod ug+x shared/bin/*

同样在我的情况下,我在Amazon EC2-linux机器上运行,由于某些原因,bin文件是使用ruby.exe而不是ruby生成的。如果您没有运行Windows,请务必检查这些文件并删除.exe扩展名。

编辑 - 我不再确定之前的答案,因为我遇到了使用rails + capistrano +的错误,无论何时使用该设置。以下确实适用于Rails 5 + Capistrano> 3.6.1

  1. 重新生成最新的垃圾箱(您可能需要执行类似

    的操作)
    # bundle config --delete bin # Might have to do that
    rake rails:update:bin
    # git add bin # If your bin dir was in gitignore, remove it from there and commit it
    
  2. 从链接的目录中移除bin(因此与原始解决方案相反)并在deploy.rb中添加额外的行

    set :bundle_binstubs, nil 
    
  3. 部署。从这里可以看到bin文件是使用适当的-x权限生成的,并且正确引用了引导文件

  4. 请参阅this SO以获取参考资料