243 lines
5.0 KiB
Markdown
243 lines
5.0 KiB
Markdown
# Docker Setup for NextPlacement
|
|
|
|
This document explains how to use Docker with the NextPlacement monorepo.
|
|
|
|
## Overview
|
|
|
|
The project contains three Dockerfiles:
|
|
- `Dockerfile` - Root-level Dockerfile for the entire monorepo
|
|
- `apps/admin/Dockerfile` - Specific Dockerfile for the admin application
|
|
- `apps/student/Dockerfile` - Specific Dockerfile for the student application
|
|
|
|
## Quick Start
|
|
|
|
### Using Docker Compose (Recommended)
|
|
|
|
1. **Build and run both applications:**
|
|
```bash
|
|
docker-compose up --build
|
|
```
|
|
|
|
2. **Run in detached mode:**
|
|
```bash
|
|
docker-compose up -d --build
|
|
```
|
|
|
|
3. **Stop the services:**
|
|
```bash
|
|
docker-compose down
|
|
```
|
|
|
|
### Individual Application Builds
|
|
|
|
#### Build Admin Application
|
|
```bash
|
|
docker build -f apps/admin/Dockerfile -t nextplacement-admin .
|
|
docker run -p 3001:3001 nextplacement-admin
|
|
```
|
|
|
|
#### Build Student Application
|
|
```bash
|
|
docker build -f apps/student/Dockerfile -t nextplacement-student .
|
|
docker run -p 3000:3000 nextplacement-student
|
|
```
|
|
|
|
#### Build Entire Monorepo
|
|
```bash
|
|
docker build -t nextplacement .
|
|
docker run -p 3000:3000 nextplacement
|
|
```
|
|
|
|
## Ports
|
|
|
|
- **Student Application**: `http://localhost:3000`
|
|
- **Admin Application**: `http://localhost:3001`
|
|
|
|
## Environment Variables
|
|
|
|
Create a `.env` file in the root directory with your environment variables:
|
|
|
|
```env
|
|
# Database
|
|
DATABASE_URL="your-database-url"
|
|
|
|
# NextAuth
|
|
NEXTAUTH_URL="http://localhost:3000"
|
|
NEXTAUTH_SECRET="your-secret"
|
|
|
|
# Other environment variables...
|
|
```
|
|
|
|
Then uncomment the `env_file` section in `docker-compose.yml`:
|
|
|
|
```yaml
|
|
env_file:
|
|
- .env
|
|
```
|
|
|
|
## Dockerfile Features
|
|
|
|
### Multi-stage Builds
|
|
- **deps stage**: Installs dependencies with optimal caching
|
|
- **builder stage**: Builds the application
|
|
- **runner stage**: Creates the production image
|
|
|
|
### Security
|
|
- Runs as non-root user (`nextjs`)
|
|
- Minimal attack surface with Alpine Linux
|
|
- Proper file permissions
|
|
|
|
### Performance
|
|
- Layer caching optimization
|
|
- Standalone Next.js output
|
|
- Minimal production image size
|
|
|
|
### Monorepo Support
|
|
- Handles workspace dependencies
|
|
- Builds shared packages (`@workspace/ui`, `@workspace/db`)
|
|
- Uses Turbo for efficient builds
|
|
|
|
## Development with Docker
|
|
|
|
### Development Mode
|
|
For development, you can mount the source code:
|
|
|
|
```bash
|
|
docker run -v $(pwd):/app -p 3000:3000 nextplacement
|
|
```
|
|
|
|
### Hot Reload
|
|
To enable hot reload in development:
|
|
|
|
```bash
|
|
docker-compose -f docker-compose.dev.yml up
|
|
```
|
|
|
|
## Production Deployment
|
|
|
|
### Environment Variables
|
|
Ensure all required environment variables are set:
|
|
|
|
```bash
|
|
docker run -e DATABASE_URL="..." -e NEXTAUTH_SECRET="..." -p 3000:3000 nextplacement
|
|
```
|
|
|
|
### Health Checks
|
|
The docker-compose configuration includes health checks that verify the applications are running properly.
|
|
|
|
### Scaling
|
|
You can scale individual services:
|
|
|
|
```bash
|
|
docker-compose up --scale student=3 --scale admin=2
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Build Issues
|
|
1. **Clear Docker cache:**
|
|
```bash
|
|
docker system prune -a
|
|
```
|
|
|
|
2. **Rebuild without cache:**
|
|
```bash
|
|
docker-compose build --no-cache
|
|
```
|
|
|
|
### Runtime Issues
|
|
1. **Check logs:**
|
|
```bash
|
|
docker-compose logs student
|
|
docker-compose logs admin
|
|
```
|
|
|
|
2. **Access container shell:**
|
|
```bash
|
|
docker-compose exec student sh
|
|
```
|
|
|
|
### Port Conflicts
|
|
If ports 3000 or 3001 are already in use, modify the `docker-compose.yml`:
|
|
|
|
```yaml
|
|
ports:
|
|
- "3002:3000" # Map to different host port
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
1. **Always use specific image tags in production**
|
|
2. **Set up proper logging and monitoring**
|
|
3. **Use secrets management for sensitive data**
|
|
4. **Implement proper backup strategies**
|
|
5. **Monitor resource usage**
|
|
|
|
## Advanced Configuration
|
|
|
|
### Custom Dockerfile
|
|
You can create custom Dockerfiles for specific environments:
|
|
|
|
```dockerfile
|
|
# Dockerfile.prod
|
|
FROM node:22-alpine AS base
|
|
# ... production-specific configuration
|
|
```
|
|
|
|
### Docker Compose Overrides
|
|
Create `docker-compose.override.yml` for local development:
|
|
|
|
```yaml
|
|
version: '3.8'
|
|
services:
|
|
student:
|
|
volumes:
|
|
- .:/app
|
|
- /app/node_modules
|
|
environment:
|
|
- NODE_ENV=development
|
|
```
|
|
|
|
## Monitoring
|
|
|
|
### Health Checks
|
|
The applications include health check endpoints. Create an API route:
|
|
|
|
```typescript
|
|
// apps/student/app/api/health/route.ts
|
|
export async function GET() {
|
|
return Response.json({ status: 'ok' })
|
|
}
|
|
```
|
|
|
|
### Logging
|
|
Configure proper logging for production:
|
|
|
|
```bash
|
|
docker-compose up --build 2>&1 | tee app.log
|
|
```
|
|
|
|
## Security Considerations
|
|
|
|
1. **Never commit `.env` files**
|
|
2. **Use Docker secrets for sensitive data**
|
|
3. **Regularly update base images**
|
|
4. **Scan images for vulnerabilities**
|
|
5. **Implement proper network policies**
|
|
|
|
## Performance Optimization
|
|
|
|
1. **Use multi-stage builds** (already implemented)
|
|
2. **Optimize layer caching** (already implemented)
|
|
3. **Use `.dockerignore`** (already implemented)
|
|
4. **Consider using BuildKit**
|
|
5. **Monitor image sizes**
|
|
|
|
## Support
|
|
|
|
For issues related to Docker setup, check:
|
|
1. Docker logs
|
|
2. Application logs
|
|
3. Network connectivity
|
|
4. Environment variables
|
|
5. File permissions |