Environment variables — WELIFE
Status vocabulary only — never store real secrets in this doc.
OWNER đăng ký dịch vụ: OWNER-GATES.md (Google → SMS → MoMo).
Inventory: ENV-INVENTORY.md
Bootstrap: npm run env:bootstrap · Check: npm run env:check
Files
| File |
Role |
.env / .env.example |
Docker Compose (Postgres/Redis/MinIO/Mailpit ports) |
api/.env / .env.example |
Nest runtime (JWT, DB, Google, Pay, SMS…) |
api/.env.production.example |
VPS template |
mobile/.env · .env.local / .env.example |
Expo Consumer public only |
partner/ · driver/ .env.example |
Expo thin |
dashboard/.env / .env.example |
Vite Admin |
.gitignore covers .env, .env.*, with !.env.example exceptions.
Map theo surface
┌─ root .env ────────── docker ports / compose passwords
├─ api/.env ─────────── secrets + server config (JWT, DB, Google verify, Pay, SMS)
├─ mobile/.env ──────── EXPO_PUBLIC_* only (API URL + Google Web Client ID)
├─ partner|driver/.env EXPO_PUBLIC_* only
└─ dashboard/.env ───── VITE_API_URL
Cross-app pairing (bắt buộc khớp)
| Client |
Server |
Notes |
EXPO_PUBLIC_API_URL |
Nest /api/v1 |
Phải có /api/v1; device = LAN IP |
EXPO_PUBLIC_WS_URL |
Socket.IO origin |
path /socket.io |
EXPO_PUBLIC_GOOGLE_WEB_CLIENT_ID |
GOOGLE_CLIENT_ID |
Cùng Web OAuth audience |
VITE_API_URL |
same API |
Dashboard |
Google Sign-In (OWNER)
WELIFE dùng idToken (không Authorization Code) → không cần GOOGLE_CLIENT_SECRET trên API hiện tại.
| Variable |
Where |
Required |
GOOGLE_CLIENT_ID |
api/.env |
Yes để verify idToken |
EXPO_PUBLIC_GOOGLE_WEB_CLIENT_ID |
mobile/.env(.local) |
Yes để bật nút Google |
EXPO_PUBLIC_GOOGLE_ANDROID_CLIENT_ID |
mobile |
Native Android |
EXPO_PUBLIC_GOOGLE_IOS_CLIENT_ID |
mobile |
Native iOS |
- Format:
*.apps.googleusercontent.com
- Redirect:
welife://oauth
- Cấm
EXPO_PUBLIC_GOOGLE_CLIENT_SECRET
- Trống = Google tắt; email OTP / password vẫn OK
Điền nhanh
# api/.env
GOOGLE_CLIENT_ID=xxxxx.apps.googleusercontent.com
# mobile/.env.local
EXPO_PUBLIC_GOOGLE_WEB_CLIENT_ID=xxxxx.apps.googleusercontent.com
EXPO_PUBLIC_GOOGLE_ANDROID_CLIENT_ID=
EXPO_PUBLIC_GOOGLE_IOS_CLIENT_ID=
npm run env:check
# restart API + npx expo start -c
Firebase Auth Hybrid (WP-AUTH-FIREBASE-HYBRID-01)
| Variable |
Where |
Notes |
EXPO_PUBLIC_FIREBASE_API_KEY / AUTH_DOMAIN / … |
mobile/.env.local |
Public SDK · project welife-2412 |
EXPO_PUBLIC_FIREBASE_WEB_APP_ID |
mobile |
Expo web — dạng 1:…:web:… |
EXPO_PUBLIC_FIREBASE_ANDROID_APP_ID |
mobile |
Native · google-services.json |
EXPO_PUBLIC_FIREBASE_IOS_APP_ID |
mobile |
Optional iOS |
EXPO_PUBLIC_FIREBASE_APP_ID |
mobile |
Fallback; code resolve theo platform |
EXPO_PUBLIC_FIREBASE_BRIDGE |
mobile |
1 chỉ khi API có Admin SA |
FIREBASE_PROJECT_ID / CLIENT_EMAIL / PRIVATE_KEY |
api/.env |
Admin verify · không EXPO_PUBLIC |
GOOGLE_APPLICATION_CREDENTIALS |
api/.env |
Optional path to SA JSON |
GOOGLE_CLIENT_IDS |
api/.env |
Thêm Firebase oauth clients (web popup) |
Flow: Firebase sign-in → POST /auth/firebase { idToken } → WELIFE JWT.
OWNER checklist: OWNER-FIREBASE-HYBRID.md.
MoMo / SMS naming (API)
| Intent |
WELIFE env key |
Notes |
| MoMo return URL |
MOMO_RETURN_URL (+ alias MOMO_REDIRECT_URL) |
App redirect sau thanh toán |
| MoMo IPN |
MOMO_IPN_URL |
Server-to-server |
| MoMo env |
MOMO_ENV=sandbox|production |
Chọn endpoint nếu thiếu MOMO_ENDPOINT |
| Twilio |
TWILIO_ACCOUNT_SID / AUTH_TOKEN / FROM_NUMBER |
Không dùng EXPO_PUBLIC |
Auth sessions (API)
| Variable |
Notes |
JWT_ACCESS_TTL / JWT_REFRESH_TTL |
Access ngắn · refresh dài |
AUTH_REMEMBER_ME_TTL |
Remember-me |
AUTH_SESSION_ABSOLUTE_TTL_DAYS |
Cap tuyệt đối |
AUTH_MAX_LOGIN_ATTEMPTS / AUTH_LOCKOUT_SECONDS |
Lockout |
AUTH_DEVICE_ID_PEPPER |
API-only — không EXPO_PUBLIC_* |
API sections (trong .env.example)
- Runtime · 2. JWT/sessions · 3. OTP · 4. SMTP · 5. Google · 6. Admin
- Wallet · 8. Postgres · 9. Redis · 10. S3 · 11. Routing · 12. Payments · 13. SMS · 14. AI
OWNER_REQUIRED (live)
| Variable |
Why |
| Google Web Client ID (API + mobile) |
Sign-In live |
| MoMo / VNPay keys |
Pay live (PAYMENTS_MOCK=false) |
| eSMS / Twilio |
SMS OTP live |
OPENAI_API_KEY |
Assistant AI |
| EAS login |
Cloud builds |
Production guards (API)
- No
OTP_DEV_CODE
- JWT secrets ≥ 32, distinct
CORS_ORIGINS not *
ALLOW_INTERNAL_WALLET_CREDIT=false
SWAGGER_ENABLED=false (policy)