4.9 KiB
4.9 KiB
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:
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:
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 environmentnpm run docker:dev:build- Rebuild and startnpm run docker:dev:down- Stop servicesnpm run docker:dev:logs- View logsnpm run docker:dev:clean- Stop and remove volumes
Production
npm run docker:prod- Start prod environmentnpm run docker:prod:build- Rebuild and startnpm run docker:prod:down- Stop servicesnpm run docker:prod:logs- View logsnpm 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
# 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
# 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
- First time setup: Use
docker:dev:buildto ensure images are built - Clean slate: Use
docker:dev:cleanto remove all data and start fresh - Production testing: Test prod setup locally before deploying
- Database access: Use any PostgreSQL client with credentials from .env file
- Debugging: Attach debugger to port 9229 for API debugging
Production Deployment
Before deploying to production:
- Update
.env.productionwith real credentials - Configure SSL certificates in
nginx/ssl/ - Update Nginx configuration for HTTPS
- Set proper domain names in environment variables
- 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