WELIFE Docs Swagger Admin Web

SECURITY — WELIFE

Hardening 2026-07-24 (+ phase nợ Redis/MinIO/OTP/payments). Repo GitHub: private. Secrets local: secrets/ (gitignore).

Đã siết trong code

Hạng mục Hành vi
Boot guard Production cấm OTP_DEV_CODE, JWT yếu, CORS_ORIGINS=*, admin phone thiếu flag
Helmet / CORS / body limit / exception filter Bật
Swagger Tắt mặc định trên production
OTP Dev code chỉ non-prod; throttle; lockout theo SĐT (OTP_MAX_ATTEMPTS / OTP_LOCK_SEC); Redis bắt buộc prod
Logout / refresh jti + rotate + Redis blacklist
Wallet topup/withdraw ALLOW_INTERNAL_WALLET_CREDIT — production false
Payments GET /payments/providers + MOCK/MoMo/VNPay init+return → credit ví (WP-PAY-01)
SMS OTP SMS_PROVIDER=console|http|twilio
Expo refresh-on-401 (mobile/driver/partner)
Health detail non-prod public; prod /health/admin/* + ADMIN
Redis Docker --requirepass · REDIS_URL=redis://:pass@host:port
MinIO Bucket private (mc anonymous set none) · API trả presigned GET
Social / upload ảnh-video WP-MEDIA-STRIP-01 — gỡ EXIF/GPS, nén JPEG ≤1920 / H.264 ≤1080 trước khi lưu MinIO
Docker ports Postgres / Redis / MinIO bind 127.0.0.1
Nginx /docs comment sẵn
Gitignore secrets, pem, keystore, …

Checklist trước khi deploy

  1. NODE_ENV=production — dùng api/.env.production.example
  2. node scripts/gen-secrets.mjs → dán JWT (+ Redis password)
  3. Xóa OTP_DEV_CODE
  4. CORS_ORIGINS=https://your-app,...
  5. ALLOW_INTERNAL_WALLET_CREDIT=false
  6. SWAGGER_ENABLED=false
  7. ADMIN_PHONES chỉ với ADMIN_BOOTSTRAP_ENABLED=true
  8. Đổi Postgres / MinIO / Redis passwords
  9. Không publish 5432/6379/9000 ra internet
  10. HTTPS + TRUST_PROXY=true

Local sau hardening này

# root .env + api/.env: REDIS_PASSWORD + REDIS_URL có password
npm run infra:up          # recreate redis/minio
npm run api:dev
curl http://localhost:3000/api/v1/health
curl http://localhost:3000/api/v1/payments/providers

Production-like trên máy local

npm run api:prod:local
# → api/.env.production.local · NODE_ENV=production · WELIFE_PROD_LOCAL=true
# Chi tiết: docs/reports/LOCAL-PROD-LIKE-2026-08-11.md

Không ghi đè api/.env (dev). Không dùng WELIFE_PROD_LOCAL trên VPS.

Còn nợ (thật sự sau)

Tài liệu