【问题标题】:Capistrano + Whenever gems - bin/rails: Permission deniedCapistrano + 每当 gems - bin/rails:权限被拒绝
【发布时间】:2014-10-19 03:30:28
【问题描述】:

我配置了一个生产环境,可以按应有的方式进行部署和工作。虽然我遇到了一个我无法弄清楚的辅助问题。

我正在运行Whenever gem 来执行几个cron 作业,而Whenever gem capistrano 实现使它们正确部署并且脚本正在执行。虽然在任何时候.log 我收到以下输出:

/bin/bash: bin/rails: Permission denied

脚本使用运行器从 RSS 提要进行更新,这在以前的生产部署中运行良好,尽管我使用 Capistrano 部署到新服务器。

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

【问题讨论】:

  • 当我看到那些文件不断恢复为不可执行的大声笑时,我以为电脑里有鬼,完全忘记了这是因为新的部署......但是这个bin不应该/目录实际上首先位于 shared_folder 中?所以我们可以一劳永逸地 chmod u+x 吗?

标签: ruby-on-rails ruby cron capistrano3


【解决方案1】:

我能够通过以下方式解决我的问题(为简洁起见,包括重新启动的命名空间):

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

【讨论】:

    【解决方案2】:

    所以我的解决方案是将 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 权限生成的,并正确引用了引导文件

    参考this SO

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      相关资源
      最近更新 更多