Architecture Decision Record

Active theme: Light

← 決策記錄例子

環境變數配置

內容:

摘要

問題

我哋想令我哋嘅應用程式喺工件/二進位檔/原始碼之外都可以配置,令同一個建置可以按部署環境而有唔同嘅行為。

  • 為咗做到呢點,我哋想用環境變數配置。

  • 我哋想用可以做版本控制嘅檔案嚟管理配置。

  • 我哋想提供一啲開發者體驗上嘅便利,例如知道有咩可以配置,以及任何相關嘅預設值。

決策

決定用 .env 檔案,並配合相關嘅預設值檔案同結構描述檔案。

狀態

已決定。對日後出現嘅新功能持開放態度。

詳情

假設

我哋傾向將應用程式程式碼同環境程式碼分開。我哋假設應用程式需要喺不同環境(例如開發環境、測試環境、示範環境、生產環境等)有唔同嘅運作方式。

我哋傾向採用業界慣例「12 factor app」,更傾向相關嘅「15 factor app」做法。

我哋以往好多項目都用 .env 檔案或者類似 .env 目錄嘅慣例。一般做法係唔將呢啲檔案放入版本控制,而係用其他方式去部署、做版本管理同管理佢哋。

限制

我哋想將機密排除喺原始碼管理(SCM)版本控制系統(VCS)之外。

我哋想盡量兼容流行嘅軟件框架同程式庫。例如,Node 有個模組「dotenv」用嚟讀取環境變數配置。

立場

我哋考慮過幾種做法:

  • 將配置儲存喺應用程式入面,例如放喺 config.js 檔案。

  • 將配置儲存喺環境入面,例如放喺 .env 檔案。

  • 從已知位置(例如授權伺服器)取得配置。

論據

我哋揀選 .env 檔案嘅做法,因為:

  • 佢好流行,專家之間亦然。

  • 佢跟隨 .env 檔案嘅模式,我哋嘅團隊喺好多項目都成功用過好多次。

  • 佢簡單。值得留意嘅係,對於我哋睇到嘅重大取捨(例如同授權伺服器做法相比欠缺審計能力),我哋暫時可以接受。

影響

我哋需要想辦法,將公開嘅環境變數配置同任何機密管理分開。

相關

相關決策

我哋預期所有應用程式都會用呢個做法。

我哋會計劃升級任何用能力較低嘅做法(例如硬編碼喺二進位檔或者原始碼)嘅應用程式。

我哋會維持任何用能力較高嘅做法(例如授權伺服器)嘅應用程式不變。

相關需求

我哋會為呢啲檔案加入 devops 能力,包括鉤子(hooks)、測試同持續整合。

我哋需要就呢個決策培訓所有開發隊友。

相關工件

我哋部署嘅每個區域都需要自己嘅 .env 檔案同相關檔案。

相關原則

容易回復。

備註

.env 檔案例子:

NAME=Alice Anderson
EMAIL=alice@example.com

.env.defaults 檔案例子:

NAME=Joe Doe
EMAIL=joe@example.com

只有鍵嘅 .env.schema 檔案例子:

NAME
EMAIL