capistrano-env 文件权限

capistrano-env file permissions

我用gemcapistrano-env发现了一个小问题。我的部署脚本是:

Capistrano::Env.use do |env|
  env.add 'DB_DSN', 'mysql:host=localhost;dbname=dbname'
  env.add 'DB_USER', 'user'
  env.add 'DB_PASS', 'pass'
end

并且此代码在部署后在服务器上创建 .env 文件。但! .env 文件权限为 640,我的 PHP 脚本无法读取它。我可以在每次部署后 运行 chmod 命令,但可能存在其他好的解决方案?

编辑

我创建了 pull request 并在这个 gem 中添加了新的 filemode 选项。所以,现在的解决方案是:

Capistrano::Env.use do |env|
  env.add 'DB_DSN', 'mysql:host=localhost;dbname=dbname'
  env.add 'DB_USER', 'user'
  env.add 'DB_PASS', 'pass'
  env.filemode = 0644
end

您有几个选项可以使它变得更好。

  1. capistrano-env 似乎不支持自定义权限设置,但也许可以添加该功能! Open an issue at GitHub 也许项目维护者会添加它。

  2. 您可以将 deploy.rb 修改为 运行 必要的 chmod 命令。这样您就不必在每次部署后手动 运行 chmod。

像这样:

# In deploy.rb
after "capenv:copy", "capenv:chmod" do
  on roles(:all) do
    execute "chmod", "a+r", "#{release_path}/#{Capistrano::Env.filename}"
  end
end

查看 capevn code 上传是在单个任务中完成的。您可以在本地覆盖该任务的定义,以便更改文件权限。在 deploy.rb

中放入如下内容
namespace :capenv do
  desc 'copy .env to release_path'
  task :copy do
    on roles(:all) do
      upload! StringIO.new(Capistrano::Env.to_s), "#{release_path}/#{Capistrano::Env.filename}", mode: 'a+r'
    end
  end
end