如何在 Capistrano 中存储秘密变量

How to store secret variables in capistrano

我正在编写一个 Rails 应用程序,使用 Capistrano 进行自动部署。在 deploy.rb 脚本中我有:

set :deploy_to, '/my/deploy/path/'

在 production.rb 我有:

server 'example.com', user: 'secret_user_name', roles: %w{web app db}

目前该应用是私有的。但假设我想要一个这样的开源应用程序。然后我不想 secret_user_name/my/deploy/path 存储在回购协议中。在 Rails 项目中,如果我遇到这样的问题,我会将秘密值存储在 secrets.yml 中并从那里访问它们。但是我无法从 Capistrano 访问 secrets.yml。所以我可以手动加载机密文件,但我确信有更好的方法来做到这一点。

所以我的问题是:如何在不使用 Capistrano 公开服务器信息的情况下进行自动化部署?有没有像 Rails 中那样存储秘密的推荐方法?

环境变量可能对您有所帮助。 您可以将 export SSH_PROD_USER=secret_user_name; 放入您喜欢的 shell 配置文件中。例如,如果您使用 bash,那么它将是 ~.bash_profile。然后像这样在 production.rb 中使用它:

server 'example.com', user: ENV['SSH_PROD_USER'], roles: %w{web app db}

所以基本上 ruby 会有你所有的环境变量

使用费加罗之类的东西gem:https://github.com/laserlemon/figaro

并且不要将 application.yml

推送到您的回购

或者使用带有凭据的加密存储库。

如果你的目的是维护你自己的部署环境(你保密)但开源应用程序本身的代码,那么我会简单地将 Capistrano 相关文件移动到一个单独的私有存储库。然后您可以开源应用程序本身,但将 Capistrano 配置保密。

Capistrano 的 deploy.rb 等不需要与正在部署的应用程序位于相同的目录结构甚至相同的存储库中。毕竟,Capistrano 是基于 :repo_url 部署的,它可以是任何东西。它不必与保存 Capistrano 文件的 repo 相匹配。

如果您想让其他人(即那些 fork/clone 应用程序的人)能够部署到他们自己的基础架构,也许最简单的解决方案是编写一个 wiki 页面来解释他们如何设置他们自己的 Capistrano 配置。部署环境可能千差万别,因此这可能不是您可以简单地使用环境变量或加密的秘密来完成的事情。

在任何情况下,请确保在必要时审核并重写您的 Git 历史记录,以确保您在创建回购 public.[=11= 时不会泄露任何敏感配置]