将外部文件导入database.yml文件

时间:2012-09-22 02:58:48

标签: ruby-on-rails ruby

出于安全考虑,我不想将我的生产用户名和密码检查到版本控制中。如果我检查它,每个人都能看到它。这是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文件中。这将允许系统在每次部署应用程序时引用服务器上的现有文件,而无需部署者担心更改密码或创建符号lyncs。另外,我可以将永久的database.yml文件保留在服务器集上,以便部署者看不到它......
  3. 我最喜欢第二种选择,基本上看起来像这样:

    # 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
    

1 个答案:

答案 0 :(得分:3)

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

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

您只需要确保启动rails应用程序的用户在其配置文件中设置了环境变量,以便在ENV哈希中可用。例如,我经常使用deployer用户通过capistrano部署应用程序,因此我在该用户的export DB_PASSWORD=the_password文件中设置了~/.bashrc(无论是哪个用户都可以使用.yml文件。你正在部署的系统。)

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

对我来说也不是很明显,但.erb文件can have embedded ruby在其中,类似于{{1}}模板,但我遇到过这样的事情没有当环境变量本身具有某些特殊字符时工作。