0

出于安全目的,我不想将我的生产用户名和密码检查到版本控制中。如果我签入它,每个人都可以看到它。这是被检查到版本控制中的 database.yml 文件:

# /config/database.yml:
production:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: desk_production
  pool: 5
  username: root
  password: password_here

如您所见,“password_here”作为密码签入 - 但如果曾经针对生产数据库进行过检查,这是一个无效的密码。除了将我的实时密码检查到版本控制中之外,我基本上有两个选择:

  1. 将生产服务器上的真实 database.yml 文件保存在应用程序根目录上方的目录中。制作一个 capistrano 配方以在部署应用程序时为该文件创建一个符号 lync - 这基本上会覆盖检入版本控制的 database.yml 文件。
  2. 保存真正的 database.yml 文件(就像在选项 #1 中一样),但不是制作符号 lync,而是将其导入到版本控制中的 database.yml 文件中。这将允许系统在每次部署应用程序时引用服务器上的现有文件,而无需部署人员担心更改密码或创建符号 lync。另外,我可以将永久 database.yml 文件保留在服务器集上,这样部署者就看不到它了……

我最喜欢第二个选项,它基本上看起来像这样:

# Config file permanently stored on the web server:
# ../app_root/database.yml (notice this is one level up from the app so it doesn't get written over)

# This is the file checked into version control:
production:
 << ../app_root/database.yml
4

1 回答 1

3

或者您可以从环境变量中读取它:

production:
  ...
  password: <%= ENV['DB_PASSWORD'] %>
  ...

您只需要确保启动您的 rails 应用程序的用户在他们的配置文件中设置了环境变量,以便它可以在ENV哈希中使用。例如,我经常使用deployer用户通过 capistrano 部署应用程序,因此我已export DB_PASSWORD=the_password在该用户的~/.bashrc文件中进行了设置(对于您要部署到的系统而言,它位于适当的位置)。

这样,它是您的源代码控制的一部分,因为每个人都知道在哪里设置密码,但密码本身不是您的源代码控制的一部分。显然,你需要保守这个秘密。

这对我来说也不是很明显,但是.yml文件中可以嵌入 ruby ​​,类似于.erb模板,尽管我遇到了当环境变量本身包含某些特殊字符时这样的事情不起作用的情况。

于 2012-09-22T03:19:48.477 回答