2012-09-22 91 views
0

我並不想檢查我的生產用戶名和密碼的版本控制用於安全目的。如果我確實檢查了它,每個人都可以看到它。這是因爲它是簽入版本控制database.yml文件:導入外部文件到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文件,它保留在服務器上,因此部署者看不到它...

我最喜歡第二個選項,它基本上看起來像這樣:

# 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 

回答

3

或者你也可以從一個環境變量閱讀:

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

你只需要確保啓動您的Rails應用程序的用戶環境變量在他們的個人資料設定所以這將是可在ENV散列。例如,我經常使用deployer用戶通過capistrano部署應用程序,所以我在該用戶的~/.bashrc文件中設置了export DB_PASSWORD=the_password文件(無論它是否適合您部署的系統)。

這樣,它就是源代碼控制的一部分,每個人都知道在哪裏設置密碼,但密碼本身不是源代碼管理的一部分。顯然你需要保持這個祕密。

它並沒有立即對我明顯要麼,但.yml文件can have embedded ruby在其中,類似.erb模板,雖然我已經運行到的情況下這樣的事情沒有工作,當環境變量本身有某些特殊字符它。

+1

這不是普遍認爲'.yml'文件可以包含僱員再培訓局的情況下。 Rails [把'database.yml'的內容通過erb解析爲Yaml之前](https://github.com/rails/rails/blob/v3.2.8/railties/lib/rails/application/configuration.rb# L110-116)。 – matt

+0

@normalcity - 這是一個很酷的解決方案,我沒有想到這個方向,但感謝你提供一個替代解決方案! – dingalingchickenwiing

+0

@matt - 感謝erb/yaml解析的解釋!非常好的信息,我沒有意識到這一點... – dingalingchickenwiing