Vibe Coder

環境變數與 Secret 管理:本機、測試、正式三套環境不搞混

現代專案要區分本機、測試、正式三套環境,各自用不同的資料庫和 API Key,最危險的錯誤是在本機用正式環境的資料庫或金流 Key。.env 不能 commit 到 Git,要用 .env.example 當範本;Next.js 和 Vite 裡,只有 NEXT_PUBLIC_ 或 VITE_ 前綴的變數才能公開,API Key 絕對不能加這個前綴。
環境變數與 Secret 管理:本機、測試、正式三套環境不搞混

環境變數與 Secret 管理:本機、測試、正式三套環境不搞混

本機開發時如果不小心用了正式環境的 Stripe Key,一個 bug 就可能對真實使用者扣款;本機連到正式資料庫,測試資料搞亂了真實使用者的資料,後果同樣嚴重。AI 生成的程式通常只有一個 .env,沒有多環境的概念,所有環境共用同一套設定,需要你主動建立正確的結構。這篇帶你把本機、測試、正式三套環境的設定徹底分開。

你將學到什麼

三個標準環境

development、staging、production,各自的用途、資料庫與 API Key。

.env 檔案家族

.env、.env.local、.env.example,哪些能 commit、哪些絕對不行。

框架的讀取陷阱

Next.js 和 Vite 的公開前綴,一不小心就把 Key 暴露在瀏覽器裡。

進階集中管理

用 Doppler 取代多份 .env,團隊不用再互傳設定檔。

三個標準環境

本機開發.env測試環境.env.test正式環境.env.production
三套環境、三份獨立密鑰,絕不共用。
環境英文用途資料庫API Key
本機開發development你自己開發和測試本機 DB 或測試 DBSandbox/Test Key
測試環境staging上線前驗收獨立測試 DBSandbox/Test Key
正式環境production真實使用者使用正式 DB正式 Key
最危險的錯誤在本機開發時用正式環境的資料庫連線字串或正式 Stripe Key。任何 bug 都會直接影響真實使用者和真實金流。測試環境一定要用 Sandbox Key 和測試 DB。

.env 檔案的家族成員

現代專案通常有多個 .env 相關檔案,各有不同用途。

檔案名稱用途要 commit 嗎
.env本機開發用的實際設定值不要,加進 .gitignore
.env.local覆蓋 .env 的本機個人設定(優先級更高)不要
.env.example範本,說明需要哪些變數(值用假的)要 commit
.env.production正式環境設定(通常交給平台環境變數管理)不要
.env.test跑測試時用的設定視情況,值用假的可以 commit
# 複製這個檔案為 .env 並填入真實值
# 不要在這裡填入真實的 Key!
OPENAI_API_KEY=sk-your-key-here
DATABASE_URL=postgresql://user:pass@localhost/dbname
STRIPE_SECRET_KEY=sk_test_your-key-here
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
.env.example 是給團隊成員的說明書新成員加入專案,clone repo 後第一件事是複製 .env.example 成 .env,然後填入自己的 Key。這樣他知道需要哪些設定,也不會 commit 真實的 Key。

各框架的環境變數讀取方式

框架讀取方式前端可見前綴
Python(FastAPI/Flask)os.getenv("KEY") 加 python-dotenv無(後端只)
Next.jsprocess.env.KEYNEXT_PUBLIC_ 開頭才能在瀏覽器讀到
Vite(React)import.meta.env.VITE_KEYVITE_ 開頭才能在瀏覽器讀到
Node.jsprocess.env.KEY 加 dotenv無(後端只)
前端框架的安全陷阱Next.js 和 Vite 裡,只有特定前綴(NEXT_PUBLIC_ 或 VITE_)的環境變數才會打包進前端程式碼。API Key 絕對不能有這個前綴,否則你的 Key 會暴露在所有使用者的瀏覽器裡。只有可以公開的設定(如 Supabase URL)才加這個前綴。

多環境設定的最佳實踐

  1. 本機用 .env,絕對不 commit。把 .env 加進 .gitignore,用 .env.example 記錄需要哪些變數。
  2. 正式環境用平台的環境變數設定。Vercel、Railway 都有介面讓你填入 Key,不透過 .env 檔案。
  3. Stripe 等金流一定要用 Sandbox Key 開發。Stripe 提供測試用的 sk_test_ 開頭 Key,開發時只能用這個。
  4. 資料庫用不同的連線字串。本機開發用本機 DB,正式環境用雲端 DB,連線字串完全分開。

進階:用 Doppler 集中管理多環境

當專案複雜度增加,例如多個服務、多個環境、多個成員,用 Doppler 集中管理比維護多個 .env 檔案更有效率。

概念說明
Project一個應用程式,例如「my-app」
Config一個環境的設定,例如 dev、staging、prd
Secret一個環境變數,例如 OPENAI_API_KEY
# 安裝 CLI
brew install dopplerhq/cli/doppler # Mac

# 登入並設定專案
doppler login
doppler setup

# 用 Doppler 的 secret 執行程式(不需要 .env)
doppler run -- python3 app.py
doppler run -- uvicorn app:app

# 查看目前環境的所有 secret
doppler secrets
把這篇文章分享給需要的人FacebookLINEThreadsX

常見問答

.env 和 .env.example 有什麼不同?
.env 存放本機開發用的實際設定值,包含真實 Key,絕對不能 commit,要加進 .gitignore。.env.example 是範本,用假的佔位值說明需要哪些變數,可以放心 commit,讓新成員知道需要設定什麼。
為什麼 API Key 不能加 NEXT_PUBLIC_ 前綴?
Next.js 只有 NEXT_PUBLIC_ 開頭的環境變數才會被打包進前端程式碼,讓瀏覽器讀到。如果 API Key 加了這個前綴,所有使用者都能在瀏覽器裡直接看到你的 Key,等於公開金鑰。Vite 的 VITE_ 前綴也是同樣的風險。
開發 Stripe 等金流功能要注意什麼?
開發時一定要用 Stripe 提供的 sk_test_ 開頭 Sandbox Key,不能用正式 Key。本機的 bug 如果連到正式金流,就可能對真實使用者造成扣款等嚴重後果。
Doppler 這類工具解決了什麼問題?
團隊成員原本需要互相傳送 .env 檔案,這本身就是安全風險。用 Doppler 之後,每個人執行 doppler setup 就能取得對應環境的 Secret,更新 Secret 時所有人同步拿到新值,不用手動改檔案。