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

4

我配置了一个生产环境,可以正常部署和运行。但是我遇到一个附带问题无法解决。

我正在使用 Whenever gem 执行一些定时任务,Whenever gem 的 capistrano 实现成功部署并执行脚本。但是在 whenever.log 中,我收到以下输出:

/bin/bash: bin/rails: Permission denied

脚本正在使用一个运行程序从RSS源更新,这在之前的生产部署中没有发生过任何问题,尽管我使用Capistrano部署到了新服务器上。
我搜索了一下,找到了这个问题,但是每次我部署时,我都必须使bin/rails可执行(由于来自Capistrano的日期戳部署)。是否有一种方法可以让Capistrano在部署时为我使文件可执行?或者将bin/rails设为可执行文件是否存在某些固有的安全风险?

当我看到那些文件一直被还原为非可执行文件时,我以为电脑里有鬼了,哈哈,完全忘记了这是因为新的部署...但是这个bin/目录不应该首先放在shared_folder中吗?这样我们就可以一劳永逸地chmod u+x了吧? - Cyril Duchon-Doris
2个回答

4
我能用以下代码(包含重启的命名空间,为了简洁起见)解决我的问题:
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

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。请确保检查这些文件并删除 .exe 扩展名(如果你不是在 Windows 上运行)。

编辑 - 我不再确定之前的答案,因为我在那个设置下遇到了 rails + capistrano + whenever 的漏洞。但以下内容适用于 Rails 5 + Capistrano > 3.6.1.

重新生成最新的 bins(你可能需要执行类似下面的操作:
# bundle config --delete bin # 可能需要这样做 rake rails:update:bin # git add bin # 如果你的 bin 目录在 gitignore 中,请从中删除并提交 )
从链接目录中移除 bin(与原始解决方案相反),并在 deploy.rb 中添加额外的一行:
set :bundle_binstubs, nil
部署。从这里开始,它会看到 bin 文件已使用适当的-x 权限生成,并正确引用了 boot 文件。

请参考这个Stack Overflow链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接