Khi phát triển một monorepo chứa cả ứng dụng web (Next.js) và mobile (Expo/React Native), việc tập trung hóa cấu hình môi trường giúp tránh rò rỉ secret, giảm thiểu sai sót khi triển khai và dễ dàng bảo trì. Dưới đây là quy trình thực tế đã áp dụng thành công trong nhiều dự án sản xuất. 1. Tách file cấu hình theo môi trường - Tạo thư mục `config/` ở gốc monorepo. - Bên trong đặt các file: `development.ts`, `staging.ts`, `production.ts`. Mỗi file export một object `env` chứa các khóa như `API_BASE_URL`, `SENTRY_DSN`, `FIREBASE_CONFIG`… - Sử dụng TypeScript để kiểm tra kiểu dữ liệu, tránh typo. 2. Nạp cấu hình an toàn tại runtime - Web (Next.js): dùng `next.config.js` kết hợp `publicRuntimeConfig`/`serverRuntimeConfig` hoặc `next.config.mjs` với `process.env` đã được inject bởi Vercel/Netlify. - Mobile (Expo): dùng `expo-constants` và `app.config.js` để đọc `process.env` từ file `.env.*` (Expo CLI tự động load `.env`, `.env.local`, `.env.production`). - Cả hai nền tảng đều import từ `config/<env>.ts` dựa trên biến `APP_ENV` (ví dụ `development`, `staging`, `production`). 3. Bảo vệ secret với secret manager - Không commit file `.env.*` chứa khóa thật. Thay vào đó, lưu secret trong AWS Secrets Manager, GCP Secret Manager hoặc GitHub Actions Encrypted Secrets. - Trong pipeline CI/CD, pull secret và ghi ra file tạm `config/runtime.ts` trước khi build. Đảm bảo file này bị `.gitignore`. 4. Validation tự động - Viết script `scripts/validate-env.ts` dùng `zod` hoặc `io-ts` để kiểm tra mọi khóa bắt buộc tồn tại và đúng định dạng trước khi build. Chạy script ở bước `prebuild` của Turborepo. 5. Ví dụ thực tế ```ts // config/production.ts export const env = { API_BASE_URL: 'https://api.myapp.com', SENTRY_DSN: process.env.SENTRY_DSN, FIREBASE_CONFIG: { apiKey: process.env.FIREBASE_API_KEY, authDomain: 'myapp.firebaseapp.com', }, }; ``` Trong `app.config.js` (Expo) và `next.config.mjs` (Next.js) chỉ cần `import { env } from '../config/${process.env.APP_ENV}'`. Lời khuyên áp dụng ngay: - Luôn đặt `APP_ENV` trong CI/CD, không hard‑code. - Sử dụng `dotenv-cli` cho local dev: `dotenv -e .env.development -- next dev`. - Review định kỳ danh sách secret, xoá key không dùng nữa. - Tài liệu hóa quy trình trong `CONTRIBUTING.md` để thành viên mới onboarding nhanh. Với cách tiếp cận này, team giảm 80% lỗi cấu hình khi chuyển môi trường, đồng thời tuân thủ nguyên tắc least‑privilege cho secret.