我配置了一个生产环境,可以部署并按原样运行。虽然我遇到了一个我无法弄清楚的辅助问题。
我正在运行Whenever gem来执行几个cron作业,Whenever gem capistrano实现让它们正确部署并且脚本正在执行。虽然在* everylog内部我收到以下输出:
/bin/bash: bin/rails: Permission denied
该脚本使用跑步者从RSS源进行更新,虽然我使用Capistrano部署到新服务器,但这在以前的生产部署中没有发生任何影响。
我四处搜索并找到了这个question,虽然每次部署时,我都必须使bin / rails可执行(由于Capistrano的日期戳部署)。有没有办法让Capistrano在部署时让我的文件可执行?或者使bin / rails可执行存在一些固有的安全风险?
答案 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
重新生成最新的垃圾箱(您可能需要执行类似
的操作)# 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
从链接的目录中移除bin
(因此与原始解决方案相反)并在deploy.rb
中添加额外的行
set :bundle_binstubs, nil
部署。从这里可以看到bin文件是使用适当的-x权限生成的,并且正确引用了引导文件
请参阅this SO以获取参考资料