# Environment Setup Guide - Hướng Dẫn Thiết Lập Môi Trường ## 🎯 Tổng Quan Dự án sử dụng **Hybrid Environment Configuration** với 2 levels: 1. **Shared Environment** (`deployments/local/.env.local`) - Configs dùng chung 2. **Service-Specific Environment** (`services//.env.local`) - Configs riêng ### Lợi Ích - ✅ **JWT secrets giống nhau** → Services có thể verify tokens của nhau - ✅ **Mỗi service có database riêng** → Đúng microservices pattern - ✅ **Override configs dễ dàng** → REDIS_HOST khác nhau cho Docker/Native - ✅ **Không duplicate** → Maintain dễ hơn ## 🚀 Quick Start ### Option 1: Sử Dụng Script (Khuyến nghị) ```bash # Tự động tạo tất cả env files ./scripts/dev/setup-env.sh ``` ### Option 2: Setup Thủ Công **Step 1: Shared Environment** ```bash cp deployments/local/env.local.example deployments/local/.env.local ``` **Step 2: Service Environment** ```bash cp services/auth-service/env.local.example services/auth-service/.env.local ``` ## 📝 Cấu Hình Chi Tiết ### 1. Shared Environment (`deployments/local/.env.local`) Chứa configs dùng chung cho TẤT CẢ services: ```bash # JWT Secrets - PHẢI GIỐNG NHAU cho tất cả services JWT_SECRET=dev-jwt-secret-change-in-production-min-32-chars JWT_REFRESH_SECRET=dev-refresh-secret-change-in-production-min-32-chars # Redis (Docker hostname) REDIS_HOST=redis REDIS_PORT=6379 # Common NODE_ENV=development LOG_LEVEL=debug CORS_ORIGIN=http://localhost:3000,http://localhost:3001 ``` ### 2. Service Environment (`services/auth-service/.env.local`) Chứa configs RIÊNG cho từng service: ```bash # Database riêng cho service này DATABASE_URL=postgresql://user:pass@ep-xxx.neon.tech/goodgo_auth_dev?sslmode=require&pgbouncer=true # Service configs PORT=5001 SERVICE_NAME=auth-service # Override cho native dev (Redis trong Docker) REDIS_HOST=localhost ``` ## 🗄️ Database Setup ### Tạo Databases Trong Neon Mỗi service cần database riêng: 1. Truy cập: https://console.neon.tech 2. Tạo databases: - `goodgo_auth_dev` → auth-service - `goodgo_user_dev` → user-service - `goodgo_product_dev` → product-service - etc. 3. Copy connection string vào `services//.env.local`: ```bash DATABASE_URL=postgresql://user:pass@ep-xxx.neon.tech/goodgo_auth_dev?sslmode=require&pgbouncer=true ``` ### Run Migrations ```bash # Auth service ./scripts/db/migrate.sh auth-service dev # Seed data (optional) ./scripts/db/seed.sh auth-service ``` ## 🔧 Cách Hoạt Động ### Loading Order Services load environment theo thứ tự: 1. **Shared env** (`deployments/local/.env.local`) - JWT_SECRET, JWT_REFRESH_SECRET - REDIS_HOST=redis, REDIS_PORT - NODE_ENV, LOG_LEVEL, CORS_ORIGIN 2. **Service env** (`.env.local`) - DATABASE_URL (riêng cho service) - PORT (riêng cho service) - REDIS_HOST=localhost (override cho native dev) ### Package.json Configuration ```json { "scripts": { "dev": "dotenv -e ../../deployments/local/.env.local -e .env.local -- tsx watch src/main.ts" } } ``` Sử dụng `dotenv-cli` để load multiple env files. ## 📂 File Structure ``` Base/ ├── deployments/local/ │ ├── env.local.example # Template cho shared env │ └── .env.local # Shared env (gitignored) │ ├── services/ │ ├── auth-service/ │ │ ├── env.example # Old template (deprecated) │ │ ├── env.local.example # New template cho service env │ │ └── .env.local # Service env (gitignored) │ │ │ └── user-service/ │ ├── env.local.example │ └── .env.local │ └── scripts/dev/ └── setup-env.sh # Auto setup script ``` ## ⚠️ Important Notes ### 1. JWT Secrets **MUST BE IDENTICAL** across all services: - Services cần verify JWT tokens của nhau - Nếu khác nhau → authentication sẽ fail ### 2. Database URLs **MUST BE DIFFERENT** for each service: - Mỗi service có database riêng (microservices pattern) - Ví dụ: - auth-service → `goodgo_auth_dev` - user-service → `goodgo_user_dev` ### 3. Redis Host **Khác nhau tùy môi trường:** - **Shared env**: `REDIS_HOST=redis` (Docker hostname) - **Service env**: `REDIS_HOST=localhost` (override cho native dev) Khi chạy native, Redis trong Docker → dùng `localhost` ### 4. Git Ignore Tất cả `.env.local` files đã được gitignored: - `deployments/local/.env.local` - `services/*/.env.local` **NEVER commit** actual env files! ## 🎓 Examples ### Example 1: Auth Service Native Dev ```bash # 1. Setup env cp services/auth-service/env.local.example services/auth-service/.env.local # 2. Edit .env.local DATABASE_URL=postgresql://user:pass@ep-xxx.neon.tech/goodgo_auth_dev?sslmode=require PORT=5001 REDIS_HOST=localhost # Override cho native dev # 3. Start Redis in Docker cd deployments/local && docker-compose up -d redis # 4. Run service pnpm --filter @goodgo/auth-service dev ``` ### Example 2: Multiple Services ```bash # 1. Setup all envs ./scripts/dev/setup-env.sh # 2. Edit each service's .env.local with different DATABASE_URL # 3. Start infrastructure cd deployments/local && docker-compose up -d redis traefik # 4. Run all services pnpm dev ``` ## 🔍 Troubleshooting ### Database Connection Failed ```bash # Check if .env.local exists ls -la services/auth-service/.env.local # Check DATABASE_URL cat services/auth-service/.env.local | grep DATABASE_URL # Test connection cd services/auth-service && pnpm prisma db pull ``` ### JWT Secret Warning Nếu thấy warning "Using default JWT_SECRET": - Check `deployments/local/.env.local` có JWT_SECRET chưa - Check service có load đúng env files chưa ### Redis Connection Failed Khi chạy native: - Check Redis container đang chạy: `docker ps | grep redis` - Check REDIS_HOST=localhost trong service `.env.local` ## 📚 Tài Liệu Thêm - [Local Development Guide](docs/vi/guides/local-development.md) - [Neon Database Guide](docs/vi/guides/neon-database.md) - [Service README](services/auth-service/README.md) ## 🎉 Ready to Go! Sau khi setup xong: ```bash # Start everything ./scripts/dev/start-all.sh # Or selective pnpm --filter @goodgo/auth-service dev ``` Happy coding! 🚀