ข้ามไปยังเนื้อหา

Environments & Secrets

GrowthBook มาพร้อมกับสาม environment ในตัว: development, staging และ production แต่ละ environment มี:

  • SDK ConnectionclientKey แยกกันที่แอปของคุณใช้ต่อ environment
  • Feature state — flag สามารถ ON ใน development และ OFF ใน production แยกกันได้
  • Override rules — targeting rules แยกต่อ environment ทำให้คุณปล่อยให้ internal user ใน staging โดยไม่กระทบ production
  1. ไปที่ Settings → Environments
  2. คลิก Add Environment
  3. ตั้งชื่อ (เช่น canary) และ optionally ทำเครื่องหมายว่าเป็น production environment เพื่อให้ metrics ของตัวเอง highlight
  4. คลิก Save

Custom environments มีประโยชน์สำหรับ canary deployment หรือ QA environment เฉพาะ

  1. ไปที่ SDK Connections → Add SDK Connection
  2. เลือก Environment เป้าหมายจาก dropdown
  3. คัดลอก clientKey ที่สร้างขึ้น ใช้ key นี้เฉพาะใน app config ของ environment นั้น

Docker Compose file อย่างเป็นทางการของ GrowthBook เปิดเผย secret หลายอย่างที่ ต้อง ถูกเปลี่ยนก่อน go production

# docker-compose.yml (relevant excerpt)
services:
growthbook:
environment:
- MONGODB_URI=mongodb://mongo:27017/growthbook
- JWT_SECRET=dev_secret # MUST change
- ENCRYPTION_KEY=dev_key # MUST change
- NODE_ENV=production
- APP_ORIGIN=https://growthbook.yourcompany.com

อย่า deploy ด้วย dev_secret หรือ dev_key สร้างค่าที่แข็งแกร่ง:

# Generate a 64-char hex JWT secret
openssl rand -hex 32

# Generate a 32-char base64 encryption key
openssl rand -base64 24

เก็บ output ในไฟล์ .env (ห้าม commit เข้า git) และอ้างอิงใน Compose:

services:
growthbook:
env_file:
- .env

เพิ่ม .env ใน .gitignore ทันที

GrowthBook เก็บ features, experiments, metrics และ audit logs ทั้งหมดไว้ใน MongoDB แผน backup เป็นสิ่งที่ขาดไม่ได้

Terminal window
docker exec growthbook-mongo-1 \
mongodump --uri="mongodb://localhost:27017/growthbook" \
--archive=/tmp/growthbook-backup.gz --gzip
docker cp growthbook-mongo-1:/tmp/growthbook-backup.gz \
./backups/growthbook-$(date +%Y%m%d).gz
Terminal window
# Add to crontab: crontab -e
0 2 * * * docker exec growthbook-mongo-1 \
mongodump --uri="mongodb://localhost:27017/growthbook" \
--archive=/tmp/gb-daily.gz --gzip && \
docker cp growthbook-mongo-1:/tmp/gb-daily.gz \
/backups/growthbook-$(date +\%Y\%m\%d).gz

สำหรับ deployment ที่มี traffic สูง:

  • รัน GrowthBook Proxy (ghcr.io/growthbook/proxy) ไว้หน้า SDK endpoint Proxy แคช feature payload และ serve ที่ edge ลด load บน GrowthBook app server
  • ตั้ง GROWTHBOOK_PROXY_HOST ใน proxy container ให้ชี้ไปยัง app server ของคุณ
  • Proxy รองรับ webhook-triggered cache invalidation ที่อธิบายในบทที่แล้ว

ทำ checklist นี้ให้ครบก่อนเปลี่ยน DNS ไป production:

[ ] JWT_SECRET เป็น hex string 64 ตัวอักษรที่สร้างแบบ random
[ ] ENCRYPTION_KEY เป็น base64 string 32 ตัวอักษรที่สร้างแบบ random
[ ] MONGODB_URI ชี้ไปยัง replica set หรือ managed MongoDB (ไม่ใช่ single node)
[ ] .env อยู่ใน .gitignore — ห้าม commit เด็ดขาด
[ ] cron mongodump รายวันกำลังรันอยู่และมีการทดสอบ restore แล้ว
[ ] APP_ORIGIN ตั้งเป็น HTTPS domain จริงของคุณ
[ ] SDK Connections มี key แยกต่อ environment
[ ] มี Read-only API key อย่างน้อยหนึ่งอันสำหรับ dashboard และ monitoring
[ ] GrowthBook Proxy deploy แล้วสำหรับ SDK endpoint ที่มี traffic สูง
[ ] Webhook endpoints ตรวจสอบด้วย HMAC signature checking
ตัวเลือกBenefitCost
เก็บ secret ใน environment variable / secret managerปลอดภัยกว่า แยกจาก codeต้องตั้งค่า infra เพิ่ม (secret manager, injection)
Hardcode ใน config fileเร็วกว่าตอน devเสี่ยง secret รั่วเข้า git repository
  • commit API secret หรือ SDK secret key เข้า git repository
  • ใช้ secret เดียวกันข้าม environment ทำให้ revoke key เดียวกระทบทุกที่
  • ไม่ rotate secret เป็นระยะ

💡 ตัวอย่างจากของจริง

ทีม security ที่บริษัทใหญ่บังคับให้ secret ทุกตัวผ่าน secret manager (เช่น AWS Secrets Manager, Vault) ไม่ใช่เก็บใน .env file ธรรมดาสำหรับ production

ความเสี่ยงของการ deploy GrowthBook ด้วยค่า default JWT_SECRET คืออะไร?
component ใดของ GrowthBook ที่แคช SDK feature payload ที่ edge เพื่อลด load บน app server?
pattern ที่ถูกต้องใน Compose สำหรับ inject secret โดยไม่ hardcode คืออะไร?
ทำไมต้องทดสอบ mongodump restore ก่อน go production?