wip
This commit is contained in:
184
README.docker.md
Normal file
184
README.docker.md
Normal file
@@ -0,0 +1,184 @@
|
||||
# Docker Setup for GridPilot
|
||||
|
||||
This document describes the Docker setup for local development and production deployment of GridPilot.
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Development
|
||||
|
||||
Start all services with hot-reloading:
|
||||
```bash
|
||||
npm run docker:dev:build
|
||||
```
|
||||
|
||||
This will:
|
||||
- Start PostgreSQL database on port 5432
|
||||
- Start API on port 3000 (with debugger on 9229)
|
||||
- Start Website on port 3001
|
||||
- Enable hot-reloading for both apps
|
||||
|
||||
Access:
|
||||
- Website: http://localhost:3001
|
||||
- API: http://localhost:3000
|
||||
- Database: localhost:5432
|
||||
|
||||
### Production
|
||||
|
||||
Start all services in production mode:
|
||||
```bash
|
||||
npm run docker:prod:build
|
||||
```
|
||||
|
||||
This will:
|
||||
- Build optimized Docker images
|
||||
- Start PostgreSQL, Redis, API, Website, and Nginx
|
||||
- Enable health checks, auto-restart, and resource limits
|
||||
- Configure caching and performance optimizations
|
||||
|
||||
Access:
|
||||
- Nginx (Website + API): http://localhost:80
|
||||
|
||||
## Available Commands
|
||||
|
||||
### Development
|
||||
- `npm run docker:dev` - Start dev environment
|
||||
- `npm run docker:dev:build` - Rebuild and start
|
||||
- `npm run docker:dev:down` - Stop services
|
||||
- `npm run docker:dev:logs` - View logs
|
||||
- `npm run docker:dev:clean` - Stop and remove volumes
|
||||
|
||||
### Production
|
||||
- `npm run docker:prod` - Start prod environment
|
||||
- `npm run docker:prod:build` - Rebuild and start
|
||||
- `npm run docker:prod:down` - Stop services
|
||||
- `npm run docker:prod:logs` - View logs
|
||||
- `npm run docker:prod:clean` - Stop and remove volumes
|
||||
|
||||
## Environment Variables
|
||||
|
||||
### Development (.env.development)
|
||||
Copy and customize as needed. Default values work out of the box.
|
||||
|
||||
### Production (.env.production)
|
||||
**IMPORTANT**: Update these before deploying:
|
||||
- Database credentials (POSTGRES_PASSWORD, DATABASE_URL)
|
||||
- API URLs (NEXT_PUBLIC_API_URL, NEXT_PUBLIC_SITE_URL)
|
||||
- Vercel KV credentials (required for production)
|
||||
|
||||
## Architecture
|
||||
|
||||
### Development Setup
|
||||
- Hot-reloading enabled via volume mounts
|
||||
- Source code changes reflect immediately
|
||||
- Database persisted in named volume
|
||||
- Debug port exposed for API (9229)
|
||||
|
||||
### Production Setup
|
||||
- Multi-stage builds for optimized images
|
||||
- Only production dependencies included
|
||||
- Nginx reverse proxy for both services
|
||||
- Health checks for all services
|
||||
- Auto-restart on failure
|
||||
|
||||
## Docker Services
|
||||
|
||||
### API (NestJS)
|
||||
- Dev: `apps/api/Dockerfile.dev`
|
||||
- Prod: `apps/api/Dockerfile.prod`
|
||||
- Port: 3000
|
||||
- Debug: 9229 (dev only)
|
||||
|
||||
### Website (Next.js)
|
||||
- Dev: `apps/website/Dockerfile.dev`
|
||||
- Prod: `apps/website/Dockerfile.prod`
|
||||
- Port: 3001 (dev), 3000 (prod)
|
||||
|
||||
### Database (PostgreSQL)
|
||||
- Image: postgres:15-alpine
|
||||
- Port: 5432 (internal)
|
||||
- Data: Persisted in Docker volume
|
||||
- Optimized with performance tuning parameters
|
||||
|
||||
### Redis (Production only)
|
||||
- Image: redis:7-alpine
|
||||
- Port: 6379 (internal)
|
||||
- Configured with:
|
||||
- LRU eviction policy
|
||||
- 512MB max memory
|
||||
- AOF persistence
|
||||
- Password protection
|
||||
|
||||
### Nginx (Production only)
|
||||
- Reverse proxy for website + API
|
||||
- Features:
|
||||
- Rate limiting (API: 10r/s, General: 30r/s)
|
||||
- Security headers (XSS, CSP, Frame-Options)
|
||||
- Gzip compression
|
||||
- Static asset caching
|
||||
- Connection pooling
|
||||
- Request buffering
|
||||
- Port: 80, 443
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Services won't start
|
||||
```bash
|
||||
# Clean everything and rebuild
|
||||
npm run docker:dev:clean
|
||||
npm run docker:dev:build
|
||||
```
|
||||
|
||||
### Hot-reloading not working
|
||||
Check that volume mounts are correct in docker-compose.dev.yml
|
||||
|
||||
### Database connection issues
|
||||
Ensure DATABASE_URL in .env matches the database service configuration
|
||||
|
||||
### Check logs
|
||||
```bash
|
||||
# All services
|
||||
npm run docker:dev:logs
|
||||
|
||||
# Specific service
|
||||
docker-compose -f docker-compose.dev.yml logs -f api
|
||||
docker-compose -f docker-compose.dev.yml logs -f website
|
||||
docker-compose -f docker-compose.dev.yml logs -f db
|
||||
```
|
||||
|
||||
## Tips
|
||||
|
||||
1. **First time setup**: Use `docker:dev:build` to ensure images are built
|
||||
2. **Clean slate**: Use `docker:dev:clean` to remove all data and start fresh
|
||||
3. **Production testing**: Test prod setup locally before deploying
|
||||
4. **Database access**: Use any PostgreSQL client with credentials from .env file
|
||||
5. **Debugging**: Attach debugger to port 9229 for API debugging
|
||||
|
||||
## Production Deployment
|
||||
|
||||
Before deploying to production:
|
||||
|
||||
1. Update `.env.production` with real credentials
|
||||
2. Configure SSL certificates in `nginx/ssl/`
|
||||
3. Update Nginx configuration for HTTPS
|
||||
4. Set proper domain names in environment variables
|
||||
5. Consider using Docker secrets for sensitive data
|
||||
|
||||
## File Structure
|
||||
|
||||
```
|
||||
.
|
||||
├── docker-compose.dev.yml # Development orchestration
|
||||
├── docker-compose.prod.yml # Production orchestration
|
||||
├── .env.development # Dev environment variables
|
||||
├── .env.production # Prod environment variables
|
||||
├── apps/
|
||||
│ ├── api/
|
||||
│ │ ├── Dockerfile.dev # API dev image
|
||||
│ │ ├── Dockerfile.prod # API prod image
|
||||
│ │ └── .dockerignore
|
||||
│ └── website/
|
||||
│ ├── Dockerfile.dev # Website dev image
|
||||
│ ├── Dockerfile.prod # Website prod image
|
||||
│ └── .dockerignore
|
||||
└── nginx/
|
||||
└── nginx.conf # Nginx configuration
|
||||
Reference in New Issue
Block a user