# Hướng Dẫn Neon Database

Project này sử dụng [Neon PostgreSQL](https://neon.tech) cho tất cả môi trường.

## Tại Sao Chọn Neon?

- ✅ **Serverless**: Không cần quản lý infrastructure
- ✅ **Branching**: Database riêng cho dev/staging/prod
- ✅ **Auto-scaling**: Tự động xử lý traffic spikes
- ✅ **Point-in-time restore**: Dễ dàng khôi phục từ lỗi
- ✅ **Free tier**: Hoàn hảo cho development
- ✅ **Connection pooling**: Hỗ trợ PgBouncer tích hợp

## Bắt Đầu Nhanh

### 1. Tạo Tài Khoản Neon

1. Đăng ký tại https://neon.tech
2. Tạo project mới: `goodgo-platform`

### 2. Tạo Branches

Trong Neon Console, tạo branches:
- `main` (development) - đã tồn tại
- `staging` - tạo từ main
- `production` - tạo từ main

### 3. Lấy Connection Strings

Cho mỗi branch, copy connection string:
- Định dạng: `postgresql://user:password@ep-xxx.region.neon.tech/dbname?sslmode=require`
- Thêm `?pgbouncer=true` cho connection pooling (khuyến nghị)

### 4. Cấu Hình Local Development

```bash
# Tạo .env.local
cp deployments/local/env.local.example deployments/local/.env.local

# Chỉnh sửa .env.local và thêm:
DATABASE_URL=postgresql://user:pass@ep-xxx.region.neon.tech/dbname?sslmode=require&pgbouncer=true
```

### 5. Chạy Migrations

```bash
./scripts/db/migrate.sh iam-service dev
```

## Định Dạng Connection String

```
postgresql://[user]:[password]@[endpoint]/[dbname]?sslmode=require&pgbouncer=true
```

**Tham số**:
- `sslmode=require` - Bắt buộc cho Neon
- `pgbouncer=true` - Bật connection pooling (khuyến nghị)

## Cấu Hình Môi Trường

### Local Development

File: `deployments/local/.env.local`

```bash
DATABASE_URL=postgresql://user:pass@ep-xxx.region.neon.tech/dbname?sslmode=require&pgbouncer=true
```

### Staging

Lưu trong GitHub Secrets: `NEON_DATABASE_URL_STAGING`

Hoặc trong Kubernetes:
```bash
kubectl create secret generic iam-service-secrets \
  --from-literal=database-url='postgresql://...' \
  -n staging
```

### Production

Lưu trong GitHub Secrets: `NEON_DATABASE_URL_PRODUCTION`

Hoặc trong Kubernetes:
```bash
kubectl create secret generic iam-service-secrets \
  --from-literal=database-url='postgresql://...' \
  -n production
```

## Migrations

### Development

```bash
# Tạo migration mới
./scripts/db/migrate.sh iam-service dev

# Điều này sẽ:
# 1. Tạo migration file
# 2. Áp dụng vào database
# 3. Cập nhật Prisma Client
```

### Staging/Production

Migrations chạy tự động trong CI/CD:
- Trước khi deploy lên staging
- Trước khi deploy lên production (cần approval)

Migration thủ công:
```bash
./scripts/db/migrate.sh iam-service deploy
```

## Backup & Restore

### Backup Tự Động

Neon cung cấp backup tự động. Truy cập qua Neon Console:
- Point-in-time restore
- Branch restore
- Export data

### Backup Thủ Công

```bash
./scripts/db/backup.sh iam-service
```

Điều này tạo file SQL dump trong thư mục `backups/`.

### Restore

```bash
# Từ Neon Console (khuyến nghị)
# Hoặc sử dụng psql:
psql $DATABASE_URL < backup.sql
```

## Monitoring

Theo dõi databases qua Neon Console:
- Connection metrics
- Query performance
- Storage usage
- Branch status

## Xử Lý Sự Cố

### Vấn Đề Kết Nối

1. **Kiểm tra định dạng connection string**
   - Phải bao gồm `?sslmode=require`
   - Xác minh credentials

2. **Kiểm tra IP allowlist**
   - Neon có thể giới hạn IPs
   - Thêm IP của bạn trong Neon Console

3. **Kiểm tra branch status**
   - Đảm bảo branch đang active
   - Kiểm tra maintenance

### Vấn Đề Migration

1. **DATABASE_URL chưa set**
   ```bash
   export DATABASE_URL="your-neon-url"
   ```

2. **Schema không khớp**
   ```bash
   # Reset và migrate lại (chỉ dev!)
   pnpm prisma migrate reset
   ```

3. **Connection timeout**
   - Thêm `?pgbouncer=true` cho pooling
   - Kiểm tra Neon console cho limits

### Vấn Đề Hiệu Suất

1. **Bật connection pooling**
   - Thêm `?pgbouncer=true` vào connection string

2. **Kiểm tra query performance**
   - Sử dụng Neon Console query analyzer
   - Xem lại slow queries

3. **Tối ưu indexes**
   - Xem lại Prisma schema
   - Thêm indexes cho các query thường dùng

## Tối Ưu Chi Phí

- **Free tier**: 0.5 GB storage, đủ cho dev
- **Staging**: Sử dụng free tier hoặc plan trả phí tối thiểu
- **Production**: Scale dựa trên usage
- **Branching**: Free branches cho testing

## Best Practices

1. **Luôn sử dụng connection pooling**: `?pgbouncer=true`
2. **Sử dụng SSL**: `?sslmode=require`
3. **Tách branches**: Một branch cho mỗi môi trường
4. **Backup thường xuyên**: Sử dụng automatic backups của Neon
5. **Theo dõi usage**: Kiểm tra Neon Console thường xuyên

## Tài Nguyên

- [Neon Documentation](https://neon.tech/docs)
- [Neon Console](https://console.neon.tech)
- [Prisma + Neon Guide](https://neon.tech/docs/guides/prisma)
