- 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.
8.4 KiB
8.4 KiB
Neon Database Guide
This project uses Neon PostgreSQL for all environments.
Why Neon?
- Serverless: No infrastructure management
- Branching: Separate databases for dev/staging/prod
- Auto-scaling: Handles traffic spikes automatically
- Point-in-time restore: Easy recovery from mistakes
- Free tier: Perfect for development
- Connection pooling: Built-in PgBouncer support
Architecture Overview
graph TD
Project[" Neon Project<br/>goodgo-platform"]
Dev[" Development Branch<br/>main"]
Staging[" Staging Branch<br/>staging"]
Prod[" Production Branch<br/>production"]
LocalDev[" Local Dev<br/>.env.local"]
K8sStaging[" Kubernetes<br/>staging namespace"]
K8sProd[" Kubernetes<br/>production namespace"]
Project --> Dev
Project --> Staging
Project --> Prod
Dev -.->|DATABASE_URL| LocalDev
Staging -.->|Secret| K8sStaging
Prod -.->|Secret| K8sProd
style Project fill:#1e293b,stroke:#3b82f6,stroke-width:3px,color:#fff
style Dev fill:#0f172a,stroke:#10b981,stroke-width:2px,color:#fff
style Staging fill:#0f172a,stroke:#f59e0b,stroke-width:2px,color:#fff
style Prod fill:#0f172a,stroke:#ef4444,stroke-width:2px,color:#fff
style LocalDev fill:#475569,stroke:#94a3b8,stroke-width:2px,color:#fff
style K8sStaging fill:#475569,stroke:#94a3b8,stroke-width:2px,color:#fff
style K8sProd fill:#475569,stroke:#94a3b8,stroke-width:2px,color:#fff
Quick Start
1. Create Neon Account
- Sign up at https://neon.tech
- Create a new project:
goodgo-platform
2. Create Branches
In Neon Console, create branches:
main(development) - already existsstaging- create from mainproduction- create from main
3. Get Connection Strings
For each branch, copy the connection string:
- Format:
postgresql://user:password@ep-xxx.region.neon.tech/dbname?sslmode=require - Add
?pgbouncer=truefor connection pooling (recommended)
4. Configure Local Development
# Create .env.local
cp deployments/local/env.local.example deployments/local/.env.local
# Edit .env.local and add:
DATABASE_URL=postgresql://user:pass@ep-xxx.region.neon.tech/dbname?sslmode=require&pgbouncer=true
5. Run Migrations
./scripts/db/migrate.sh iam-service dev
Connection String Format
postgresql://[user]:[password]@[endpoint]/[dbname]?sslmode=require&pgbouncer=true
Parameters:
sslmode=require- Required for Neonpgbouncer=true- Enable connection pooling (recommended)
Environment Configuration
Local Development
File: deployments/local/.env.local
DATABASE_URL=postgresql://user:pass@ep-xxx.region.neon.tech/dbname?sslmode=require&pgbouncer=true
Staging
Store in GitHub Secrets: NEON_DATABASE_URL_STAGING
Or in Kubernetes:
kubectl create secret generic iam-service-secrets \
--from-literal=database-url='postgresql://...' \
-n staging
Production
Store in GitHub Secrets: NEON_DATABASE_URL_PRODUCTION
Or in Kubernetes:
kubectl create secret generic iam-service-secrets \
--from-literal=database-url='postgresql://...' \
-n production
Migrations
Migration Workflow
graph LR
subgraph Local[" Local Development"]
Schema[" Update Schema<br/>prisma/schema.prisma"]
CreateMig[" Create Migration<br/>migrate dev"]
TestLocal[" Test Locally"]
end
subgraph CI[" CI/CD Pipeline"]
Push[" Git Push"]
Build[" Build"]
TestCI[" Run Tests"]
end
subgraph Staging[" Staging"]
MigStaging[" Run Migrations<br/>migrate deploy"]
TestStaging[" Verify Schema"]
end
subgraph Prod[" Production"]
Approval[" Manual Approval"]
MigProd[" Run Migrations<br/>migrate deploy"]
Rollback[" Rollback Plan"]
end
Schema --> CreateMig
CreateMig --> TestLocal
TestLocal --> Push
Push --> Build
Build --> TestCI
TestCI --> MigStaging
MigStaging --> TestStaging
TestStaging --> Approval
Approval --> MigProd
MigProd -.->|If Failed| Rollback
style Local fill:#1e293b,stroke:#3b82f6,stroke-width:2px,color:#fff
style CI fill:#1e293b,stroke:#8b5cf6,stroke-width:2px,color:#fff
style Staging fill:#1e293b,stroke:#f59e0b,stroke-width:2px,color:#fff
style Prod fill:#1e293b,stroke:#ef4444,stroke-width:2px,color:#fff
style Schema fill:#0f172a,stroke:#10b981,color:#fff
style CreateMig fill:#0f172a,stroke:#10b981,color:#fff
style TestLocal fill:#0f172a,stroke:#10b981,color:#fff
style Push fill:#475569,stroke:#94a3b8,color:#fff
style Build fill:#475569,stroke:#94a3b8,color:#fff
style TestCI fill:#475569,stroke:#94a3b8,color:#fff
style MigStaging fill:#0f172a,stroke:#f59e0b,color:#fff
style TestStaging fill:#0f172a,stroke:#f59e0b,color:#fff
style Approval fill:#475569,stroke:#94a3b8,color:#fff
style MigProd fill:#0f172a,stroke:#ef4444,color:#fff
style Rollback fill:#7f1d1d,stroke:#ef4444,color:#fff
Development
# Create new migration
./scripts/db/migrate.sh iam-service dev
# This will:
# 1. Create migration file
# 2. Apply to database
# 3. Update Prisma Client
Staging/Production
Migrations run automatically in CI/CD:
- Before deployment to staging
- Before deployment to production (with approval)
Manual migration:
./scripts/db/migrate.sh iam-service deploy
Backup & Restore
Automatic Backups
Neon provides automatic backups. Access via Neon Console:
- Point-in-time restore
- Branch restore
- Export data
Manual Backup
./scripts/db/backup.sh iam-service
This creates a SQL dump file in backups/ directory.
Restore
# From Neon Console (recommended)
# Or using psql:
psql $DATABASE_URL < backup.sql
Monitoring
Monitor your databases via Neon Console:
- Connection metrics
- Query performance
- Storage usage
- Branch status
Troubleshooting
Connection Issues
- Check connection string format
- Must include
?sslmode=require - Verify credentials
- Check IP allowlist
- Neon may restrict IPs
- Add your IP in Neon Console
- Check branch status
- Ensure branch is active
- Check for maintenance
Migration Issues
- DATABASE_URL not set
export DATABASE_URL="your-neon-url"
- Schema mismatch
# Reset and re-migrate (dev only!)
pnpm prisma migrate reset
- Connection timeout
- Add
?pgbouncer=truefor pooling - Check Neon console for limits
Performance Issues
- Enable connection pooling
- Add
?pgbouncer=trueto connection string
- Check query performance
- Use Neon Console query analyzer
- Review slow queries
- Optimize indexes
- Review Prisma schema
- Add indexes for frequent queries
Cost Optimization
- Free tier: 0.5 GB storage, sufficient for dev
- Staging: Use free tier or minimal paid plan
- Production: Scale based on usage
- Branching: Free branches for testing
Best Practices
- Always use connection pooling:
?pgbouncer=true - Use SSL:
?sslmode=require - Separate branches: One per environment
- Regular backups: Use Neon's automatic backups
- Monitor usage: Check Neon Console regularly
Quick Tips
Mermaid Diagram Color Palette
| Element | Color | Usage |
|---|---|---|
| Project/Main | #1e293b + #3b82f6 |
Primary containers |
| Development | #0f172a + #10b981 |
Dev environment (green) |
| Staging | #0f172a + #f59e0b |
Staging environment (orange) |
| Production | #0f172a + #ef4444 |
Prod environment (red) |
| Infrastructure | #475569 + #94a3b8 |
K8s, CI/CD (gray) |
| Error/Rollback | #7f1d1d + #ef4444 |
Critical actions (dark red) |
Common Mermaid Issues
Syntax Errors:
- Use quotes for labels with special chars:
["Label<br/>text"] - Escape HTML entities:
&not& - Use
<br/>for line breaks inside labels - Avoid
<br>without closing slash
Rendering Issues:
- If diagram doesn't render, check for matching brackets
[]or{} - Verify all style declarations use valid CSS colors
- Ensure subgraph names are unique
Visual Indicators
| Icon | Meaning |
|---|---|
| Project/Package | |
| Development/Tools | |
| Testing/Staging | |
| Production/Deploy | |
| Local Environment | |
| Kubernetes | |
| CI/CD Pipeline | |
| Configuration/Schema | |
| Database/Data | |
| Success/Validation | |
| Error/Failed | |
| Rollback/Retry | |
| Manual Action | |
| Push/Upload | |
| Build Process |