Capistrano-ENV 文件权限


capistrano-env file permissions

我使用 gem capistrano-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命令,但可能存在其他不错的解决方案?

编辑

我创建了拉取请求并将新的filemode选项添加到此 gem 中。因此,现在的解决方案是:

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 不支持自定义权限设置,但也许可以添加该功能!在 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 代码,上传是在单个任务中完成的。您可以在本地覆盖该任务的定义,以便更改文件权限。 在 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