- Updated Mermaid diagrams in the deployment and development guides for better visual representation and consistency. - Improved formatting and clarity in the Kubernetes local deployment and IAM migration guides, including detailed workflows and troubleshooting sections. - Enhanced the Vietnamese documentation to align with the English version, ensuring consistency across guides. - Added quick tips and common issues sections to facilitate user navigation and understanding.
14 KiB
14 KiB
Hướng Dẫn Neon Database
Project này sử dụng Neon PostgreSQL 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
Kiến Trúc Neon
graph TB
subgraph NeonProject[" Neon Project: goodgo-platform"]
Main["<b>Branch: main</b><br/> Development<br/>Auto-scaling<br/>Point-in-time restore"]
Staging["<b>Branch: staging</b><br/> Staging<br/>Created from main<br/>Pre-production testing"]
Production["<b>Branch: production</b><br/> Production<br/>Created from main<br/>Live environment"]
end
subgraph Features[" Tính Năng Chính"]
F1[" Serverless<br/>No infrastructure"]
F2[" Auto-scaling<br/>Handle spikes"]
F3[" Backups<br/>Point-in-time"]
F4[" Pooling<br/>PgBouncer"]
end
Main -->|Branch từ| Staging
Main -->|Branch từ| Production
Features -.->|Áp dụng cho| Main
Features -.->|Áp dụng cho| Staging
Features -.->|Áp dụng cho| Production
style NeonProject fill:#1a1a2e,stroke:#16213e,stroke-width:2px,color:#fff
style Main fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
style Staging fill:#533483,stroke:#16213e,stroke-width:2px,color:#fff
style Production fill:#c72c41,stroke:#16213e,stroke-width:2px,color:#fff
style Features fill:#1a1a2e,stroke:#16213e,stroke-width:2px,color:#fff
style F1 fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
style F2 fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
style F3 fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
style F4 fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
Bắt Đầu Nhanh
1. Tạo Tài Khoản Neon
- Đăng ký tại https://neon.tech
- Tạo project mới:
goodgo-platform
2. Tạo Branches
Trong Neon Console, tạo branches:
main(development) - đã tồn tạistaging- tạo từ mainproduction- 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=truecho connection pooling (khuyến nghị)
4. Cấu Hình Local Development
# 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
./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 Neonpgbouncer=true- Bật connection pooling (khuyến nghị)
Cấu Hình Môi Trường
Local Development
File: deployments/local/.env.local
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:
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:
kubectl create secret generic iam-service-secrets \
--from-literal=database-url='postgresql://...' \
-n production
Migrations
Development
# 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:
./scripts/db/migrate.sh iam-service deploy
Quy Trình Migration
flowchart TD
Start([ Bắt đầu<br/>Schema thay đổi]) --> Dev[ Development<br/>Tạo migration mới<br/>migrate.sh dev]
Dev --> Test{ Test<br/>Migration<br/>OK?}
Test -->| Không| Fix[ Sửa lỗi<br/>Cập nhật schema]
Fix --> Dev
Test -->| Có| Commit[ Commit<br/>Migration files<br/>+ schema.prisma]
Commit --> PR[ Pull Request<br/>Code review]
PR --> CICD[ CI/CD Pipeline<br/>Kiểm tra migration]
CICD --> Staging[ Staging Branch<br/>Auto-apply migration]
Staging --> StagingTest{ Staging<br/>Test OK?}
StagingTest -->| Không| Rollback1[↩ Rollback staging]
Rollback1 --> Fix
StagingTest -->| Có| Approval[ Approval<br/>Production deploy]
Approval --> Prod[ Production Branch<br/>Apply migration]
Prod --> ProdTest{ Production<br/>OK?}
ProdTest -->| Không| Rollback2[ Emergency Rollback<br/>Restore point-in-time]
ProdTest -->| Có| Complete([ Hoàn thành<br/>Migration thành công])
style Start fill:#1a1a2e,stroke:#16213e,stroke-width:2px,color:#fff
style Dev fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
style Test fill:#16213e,stroke:#0f3460,stroke-width:2px,color:#fff
style Fix fill:#c72c41,stroke:#16213e,stroke-width:2px,color:#fff
style Commit fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
style PR fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
style CICD fill:#533483,stroke:#16213e,stroke-width:2px,color:#fff
style Staging fill:#533483,stroke:#16213e,stroke-width:2px,color:#fff
style StagingTest fill:#16213e,stroke:#533483,stroke-width:2px,color:#fff
style Rollback1 fill:#c72c41,stroke:#16213e,stroke-width:2px,color:#fff
style Approval fill:#16213e,stroke:#0f3460,stroke-width:2px,color:#fff
style Prod fill:#c72c41,stroke:#16213e,stroke-width:2px,color:#fff
style ProdTest fill:#16213e,stroke:#c72c41,stroke-width:2px,color:#fff
style Rollback2 fill:#c72c41,stroke:#16213e,stroke-width:3px,color:#fff
style Complete fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
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
./scripts/db/backup.sh iam-service
Điều này tạo file SQL dump trong thư mục backups/.
Restore
# 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ố
Sơ Đồ Xử Lý Sự Cố
flowchart TD
Problem([ Vấn Đề Neon<br/>Không kết nối được?]) --> Type{Loại<br/>Vấn Đề?}
Type -->| Kết nối| ConnIssue[Vấn Đề Kết Nối]
Type -->| Migration| MigIssue[Vấn Đề Migration]
Type -->| Hiệu suất| PerfIssue[Vấn Đề Hiệu Suất]
ConnIssue --> CheckURL{Connection<br/>String OK?}
CheckURL -->| Không| FixURL[ Kiểm tra:<br/>• sslmode=require<br/>• Credentials đúng<br/>• Endpoint active]
CheckURL -->| Có| CheckIP{IP trong<br/>allowlist?}
CheckIP -->| Không| AddIP[ Thêm IP vào<br/>Neon Console]
CheckIP -->| Có| CheckBranch{Branch<br/>active?}
CheckBranch -->| Không| ActivateBranch[ Kích hoạt branch<br/>hoặc tạo mới]
CheckBranch -->| Có| ContactSupport[ Liên hệ<br/>Neon Support]
MigIssue --> CheckEnv{DATABASE_URL<br/>đã set?}
CheckEnv -->| Không| SetEnv[ Export<br/>DATABASE_URL]
CheckEnv -->| Có| CheckSchema{Schema<br/>đồng bộ?}
CheckSchema -->| Không| ResetMig[ DEV ONLY:<br/>prisma migrate reset]
CheckSchema -->| Có| CheckTimeout{Connection<br/>timeout?}
CheckTimeout -->| Có| AddPooling[ Thêm<br/>?pgbouncer=true]
CheckTimeout -->| Không| CheckLimits[ Kiểm tra<br/>Neon Console limits]
PerfIssue --> HasPooling{Connection<br/>Pooling ON?}
HasPooling -->| Không| EnablePooling[ Thêm<br/>?pgbouncer=true]
HasPooling -->| Có| CheckQueries{Slow<br/>queries?}
CheckQueries -->| Có| AnalyzeQueries[ Neon Console<br/>Query Analyzer]
CheckQueries -->| Không| CheckIndexes{Indexes<br/>tối ưu?}
CheckIndexes -->| Không| AddIndexes[ Thêm indexes<br/>vào Prisma schema]
CheckIndexes -->| Có| ScalePlan[ Nâng cấp<br/>Neon plan]
FixURL --> Solved([ Đã giải quyết])
AddIP --> Solved
ActivateBranch --> Solved
ContactSupport --> Solved
SetEnv --> Solved
ResetMig --> Solved
AddPooling --> Solved
CheckLimits --> Solved
EnablePooling --> Solved
AnalyzeQueries --> Solved
AddIndexes --> Solved
ScalePlan --> Solved
style Problem fill:#c72c41,stroke:#16213e,stroke-width:3px,color:#fff
style Type fill:#16213e,stroke:#0f3460,stroke-width:2px,color:#fff
style ConnIssue fill:#533483,stroke:#16213e,stroke-width:2px,color:#fff
style MigIssue fill:#533483,stroke:#16213e,stroke-width:2px,color:#fff
style PerfIssue fill:#533483,stroke:#16213e,stroke-width:2px,color:#fff
style CheckURL fill:#16213e,stroke:#533483,stroke-width:2px,color:#fff
style CheckIP fill:#16213e,stroke:#533483,stroke-width:2px,color:#fff
style CheckBranch fill:#16213e,stroke:#533483,stroke-width:2px,color:#fff
style CheckEnv fill:#16213e,stroke:#533483,stroke-width:2px,color:#fff
style CheckSchema fill:#16213e,stroke:#533483,stroke-width:2px,color:#fff
style CheckTimeout fill:#16213e,stroke:#533483,stroke-width:2px,color:#fff
style HasPooling fill:#16213e,stroke:#533483,stroke-width:2px,color:#fff
style CheckQueries fill:#16213e,stroke:#533483,stroke-width:2px,color:#fff
style CheckIndexes fill:#16213e,stroke:#533483,stroke-width:2px,color:#fff
style FixURL fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
style AddIP fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
style ActivateBranch fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
style ContactSupport fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
style SetEnv fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
style ResetMig fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
style AddPooling fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
style CheckLimits fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
style EnablePooling fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
style AnalyzeQueries fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
style AddIndexes fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
style ScalePlan fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
style Solved fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
Vấn Đề Kết Nối
- Kiểm tra định dạng connection string
- Phải bao gồm
?sslmode=require - Xác minh credentials
- Kiểm tra IP allowlist
- Neon có thể giới hạn IPs
- Thêm IP của bạn trong Neon Console
- Kiểm tra branch status
- Đảm bảo branch đang active
- Kiểm tra maintenance
Vấn Đề Migration
- DATABASE_URL chưa set
export DATABASE_URL="your-neon-url"
- Schema không khớp
# Reset và migrate lại (chỉ dev!)
pnpm prisma migrate reset
- Connection timeout
- Thêm
?pgbouncer=truecho pooling - Kiểm tra Neon console cho limits
Vấn Đề Hiệu Suất
- Bật connection pooling
- Thêm
?pgbouncer=truevào connection string
- Kiểm tra query performance
- Sử dụng Neon Console query analyzer
- Xem lại slow queries
- 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
- Luôn sử dụng connection pooling:
?pgbouncer=true - Sử dụng SSL:
?sslmode=require - Tách branches: Một branch cho mỗi môi trường
- Backup thường xuyên: Sử dụng automatic backups của Neon
- Theo dõi usage: Kiểm tra Neon Console thường xuyên
Quick Tips
Mermaid Diagram Colors
Tất cả Mermaid diagrams sử dụng bảng màu tối (dark palette) với chữ trắng:
| Loại Node | Màu | Mục Đích |
|---|---|---|
| Primary | #0f3460 |
Actions, Steps, Solutions |
| Purple | #533483 |
Staging, Categories, Warnings |
| Red | #c72c41 |
Production, Errors, Critical |
| Dark | #1a1a2e |
Backgrounds, Containers |
| Darker | #16213e |
Decision Points, Questions |
Pattern:
style NodeName fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#fff
Neon Common Issues & Solutions
| Vấn đề | Giải pháp nhanh | Emoji |
|---|---|---|
| Connection timeout | Thêm ?pgbouncer=true |
|
| SSL error | Thêm ?sslmode=require |
|
| IP bị chặn | Thêm IP vào Neon Console allowlist | |
| Branch inactive | Kích hoạt lại trong Console | |
| Migration lỗi | Reset dev: prisma migrate reset |
|
| Slow queries | Bật Query Analyzer trong Console | |
| Storage đầy | Nâng cấp plan hoặc cleanup data |
Visual Indicators
- = Neon Project
- = Development
- = Staging
- = Production
- = Performance/Speed
- = Connection
- = Storage/Backup
- = Retry/Rollback
- = Success/OK
- = Error/Failed
- = Critical/Emergency
- = Metrics/Analytics