Initial commit
This commit is contained in:
393
docs/DOCKER_DEPLOYMENT.md
Normal file
393
docs/DOCKER_DEPLOYMENT.md
Normal file
@@ -0,0 +1,393 @@
|
||||
# Docker Deployment Guide
|
||||
|
||||
This guide covers deploying the Drone Detection System using Docker and Docker Compose.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Docker Engine 20.10+
|
||||
- Docker Compose 2.0+
|
||||
- At least 4GB RAM
|
||||
- 10GB available disk space
|
||||
|
||||
## Quick Start
|
||||
|
||||
### 1. Environment Setup
|
||||
|
||||
```bash
|
||||
# Copy environment template
|
||||
cp .env.docker .env
|
||||
|
||||
# Edit .env with your Twilio credentials
|
||||
nano .env
|
||||
```
|
||||
|
||||
### 2. Basic Deployment
|
||||
|
||||
```bash
|
||||
# Build and start all services
|
||||
docker-compose up -d
|
||||
|
||||
# View logs
|
||||
docker-compose logs -f
|
||||
|
||||
# Check service status
|
||||
docker-compose ps
|
||||
```
|
||||
|
||||
### 3. Access the Application
|
||||
|
||||
- **Frontend**: http://localhost:3000
|
||||
- **Backend API**: http://localhost:3001/api
|
||||
- **Database**: localhost:5432
|
||||
- **Redis**: localhost:6379
|
||||
|
||||
## Service Architecture
|
||||
|
||||
```
|
||||
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
||||
│ Frontend │ │ Backend │ │ PostgreSQL │
|
||||
│ (React) │◄──►│ (Node.js) │◄──►│ Database │
|
||||
│ Port: 3000 │ │ Port: 3001 │ │ Port: 5432 │
|
||||
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
||||
│ │ │
|
||||
│ ┌─────────────────┐ │
|
||||
└──────────────►│ Redis │◄────────────┘
|
||||
│ (Caching) │
|
||||
│ Port: 6379 │
|
||||
└─────────────────┘
|
||||
```
|
||||
|
||||
## Docker Compose Profiles
|
||||
|
||||
### Development Profile (Default)
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
Includes: Frontend, Backend, Database, Redis
|
||||
|
||||
### Production Profile
|
||||
```bash
|
||||
docker-compose --profile production up -d
|
||||
```
|
||||
Includes: All services + Nginx reverse proxy
|
||||
|
||||
### Simulation Profile
|
||||
```bash
|
||||
docker-compose --profile simulation up -d
|
||||
```
|
||||
Includes: All services + Python drone simulator
|
||||
|
||||
## Service Details
|
||||
|
||||
### Frontend Container
|
||||
- **Image**: Custom Nginx + React build
|
||||
- **Port**: 3000:80
|
||||
- **Features**:
|
||||
- Gzip compression
|
||||
- SPA routing support
|
||||
- API proxying
|
||||
- Security headers
|
||||
|
||||
### Backend Container
|
||||
- **Image**: Node.js 18 Alpine
|
||||
- **Port**: 3001:3001
|
||||
- **Features**:
|
||||
- Health checks
|
||||
- Non-root user
|
||||
- Log persistence
|
||||
- Signal handling
|
||||
|
||||
### Database Container
|
||||
- **Image**: PostgreSQL 15 Alpine
|
||||
- **Port**: 5432:5432
|
||||
- **Features**:
|
||||
- Persistent storage
|
||||
- Health checks
|
||||
- Initialization scripts
|
||||
- Performance tuning
|
||||
|
||||
### Redis Container
|
||||
- **Image**: Redis 7 Alpine
|
||||
- **Port**: 6379:6379
|
||||
- **Features**:
|
||||
- Persistent storage
|
||||
- AOF logging
|
||||
- Health checks
|
||||
|
||||
### Nginx Proxy (Production)
|
||||
- **Image**: Nginx Alpine
|
||||
- **Ports**: 80:80, 443:443
|
||||
- **Features**:
|
||||
- SSL termination
|
||||
- Load balancing
|
||||
- Static file serving
|
||||
- WebSocket support
|
||||
|
||||
## Environment Variables
|
||||
|
||||
### Backend Environment
|
||||
```bash
|
||||
NODE_ENV=production
|
||||
PORT=3001
|
||||
DB_HOST=postgres
|
||||
DB_PORT=5432
|
||||
DB_NAME=drone_detection
|
||||
DB_USER=postgres
|
||||
DB_PASSWORD=postgres123
|
||||
REDIS_HOST=redis
|
||||
REDIS_PORT=6379
|
||||
JWT_SECRET=your-jwt-secret
|
||||
TWILIO_ACCOUNT_SID=your-twilio-sid
|
||||
TWILIO_AUTH_TOKEN=your-twilio-token
|
||||
TWILIO_PHONE_NUMBER=your-twilio-phone
|
||||
CORS_ORIGIN=http://localhost:3000
|
||||
```
|
||||
|
||||
### Frontend Build Arguments
|
||||
```bash
|
||||
VITE_API_URL=http://localhost:3001/api
|
||||
VITE_WS_URL=ws://localhost:3001
|
||||
```
|
||||
|
||||
## Data Persistence
|
||||
|
||||
### Volumes
|
||||
- `postgres_data`: Database files
|
||||
- `redis_data`: Redis persistence
|
||||
- `./server/logs`: Application logs
|
||||
|
||||
### Backup Strategy
|
||||
```bash
|
||||
# Database backup
|
||||
docker-compose exec postgres pg_dump -U postgres drone_detection > backup.sql
|
||||
|
||||
# Restore database
|
||||
docker-compose exec -T postgres psql -U postgres drone_detection < backup.sql
|
||||
|
||||
# Volume backup
|
||||
docker run --rm -v uamils_postgres_data:/data -v $(pwd):/backup alpine tar czf /backup/postgres_backup.tar.gz /data
|
||||
```
|
||||
|
||||
## Monitoring and Logs
|
||||
|
||||
### View Logs
|
||||
```bash
|
||||
# All services
|
||||
docker-compose logs -f
|
||||
|
||||
# Specific service
|
||||
docker-compose logs -f backend
|
||||
|
||||
# Last 100 lines
|
||||
docker-compose logs --tail=100 backend
|
||||
```
|
||||
|
||||
### Health Checks
|
||||
```bash
|
||||
# Check service health
|
||||
docker-compose ps
|
||||
|
||||
# Manual health check
|
||||
curl http://localhost:3001/api/health
|
||||
curl http://localhost:3000/health
|
||||
```
|
||||
|
||||
### Resource Monitoring
|
||||
```bash
|
||||
# Container stats
|
||||
docker stats
|
||||
|
||||
# Detailed container info
|
||||
docker-compose exec backend top
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
#### 1. Database Connection Issues
|
||||
```bash
|
||||
# Check database status
|
||||
docker-compose exec postgres pg_isready -U postgres
|
||||
|
||||
# View database logs
|
||||
docker-compose logs postgres
|
||||
|
||||
# Reset database
|
||||
docker-compose down -v
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
#### 2. Frontend Build Issues
|
||||
```bash
|
||||
# Rebuild frontend
|
||||
docker-compose build --no-cache frontend
|
||||
|
||||
# Check build logs
|
||||
docker-compose logs frontend
|
||||
```
|
||||
|
||||
#### 3. Backend API Issues
|
||||
```bash
|
||||
# Check backend health
|
||||
curl http://localhost:3001/api/health/detailed
|
||||
|
||||
# View backend logs
|
||||
docker-compose logs backend
|
||||
|
||||
# Restart backend
|
||||
docker-compose restart backend
|
||||
```
|
||||
|
||||
#### 4. Port Conflicts
|
||||
```bash
|
||||
# Check port usage
|
||||
netstat -tulpn | grep :3000
|
||||
netstat -tulpn | grep :3001
|
||||
|
||||
# Stop conflicting services
|
||||
docker-compose down
|
||||
```
|
||||
|
||||
### Performance Tuning
|
||||
|
||||
#### 1. Database Optimization
|
||||
```bash
|
||||
# Increase shared_buffers for PostgreSQL
|
||||
docker-compose exec postgres psql -U postgres -c "ALTER SYSTEM SET shared_buffers = '256MB';"
|
||||
docker-compose restart postgres
|
||||
```
|
||||
|
||||
#### 2. Memory Limits
|
||||
```yaml
|
||||
# Add to docker-compose.yml services
|
||||
services:
|
||||
backend:
|
||||
mem_limit: 512m
|
||||
mem_reservation: 256m
|
||||
frontend:
|
||||
mem_limit: 256m
|
||||
mem_reservation: 128m
|
||||
```
|
||||
|
||||
## Production Deployment
|
||||
|
||||
### 1. SSL Configuration
|
||||
```bash
|
||||
# Generate SSL certificates
|
||||
mkdir -p docker/ssl
|
||||
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
|
||||
-keyout docker/ssl/nginx.key \
|
||||
-out docker/ssl/nginx.crt
|
||||
```
|
||||
|
||||
### 2. Environment Security
|
||||
```bash
|
||||
# Use Docker secrets for sensitive data
|
||||
echo "your-jwt-secret" | docker secret create jwt_secret -
|
||||
echo "your-twilio-token" | docker secret create twilio_token -
|
||||
```
|
||||
|
||||
### 3. Nginx Configuration
|
||||
```bash
|
||||
# Enable production profile
|
||||
docker-compose --profile production up -d
|
||||
|
||||
# Update nginx config for your domain
|
||||
# Edit docker/nginx/default.conf
|
||||
```
|
||||
|
||||
### 4. Monitoring Setup
|
||||
```bash
|
||||
# Add monitoring services
|
||||
docker-compose -f docker-compose.yml -f docker-compose.monitoring.yml up -d
|
||||
```
|
||||
|
||||
## Scaling
|
||||
|
||||
### Horizontal Scaling
|
||||
```yaml
|
||||
# Scale backend instances
|
||||
docker-compose up -d --scale backend=3
|
||||
|
||||
# Load balancer configuration required
|
||||
```
|
||||
|
||||
### Database Scaling
|
||||
```yaml
|
||||
# Add read replicas
|
||||
postgres-replica:
|
||||
image: postgres:15-alpine
|
||||
environment:
|
||||
POSTGRES_MASTER_SERVICE: postgres
|
||||
POSTGRES_REPLICA_USER: replica
|
||||
POSTGRES_REPLICA_PASSWORD: replica123
|
||||
```
|
||||
|
||||
## Maintenance
|
||||
|
||||
### Updates
|
||||
```bash
|
||||
# Update images
|
||||
docker-compose pull
|
||||
|
||||
# Rebuild and restart
|
||||
docker-compose down
|
||||
docker-compose up -d --build
|
||||
```
|
||||
|
||||
### Cleanup
|
||||
```bash
|
||||
# Remove unused containers
|
||||
docker system prune
|
||||
|
||||
# Remove unused volumes
|
||||
docker volume prune
|
||||
|
||||
# Clean build cache
|
||||
docker builder prune
|
||||
```
|
||||
|
||||
## Testing with Simulator
|
||||
|
||||
### Run Simulation
|
||||
```bash
|
||||
# Start simulation profile
|
||||
docker-compose --profile simulation up -d
|
||||
|
||||
# Run custom simulation
|
||||
docker-compose run --rm simulator python drone_simulator.py \
|
||||
--devices 10 \
|
||||
--duration 3600 \
|
||||
--detection-interval 30
|
||||
```
|
||||
|
||||
### Monitor Simulation
|
||||
```bash
|
||||
# View simulator logs
|
||||
docker-compose logs -f simulator
|
||||
|
||||
# Check API stats
|
||||
curl http://localhost:3001/api/dashboard/stats
|
||||
```
|
||||
|
||||
## Security Considerations
|
||||
|
||||
### Container Security
|
||||
- Non-root users in all containers
|
||||
- Read-only root filesystems where possible
|
||||
- Limited container capabilities
|
||||
- Security scanning with `docker scan`
|
||||
|
||||
### Network Security
|
||||
- Custom bridge network isolation
|
||||
- No unnecessary port exposures
|
||||
- Internal service communication
|
||||
|
||||
### Data Security
|
||||
- Encrypted environment variables
|
||||
- SSL/TLS termination at proxy
|
||||
- Database connection encryption
|
||||
- Regular security updates
|
||||
|
||||
For additional security hardening, see [Security Best Practices](../docs/SECURITY.md).
|
||||
Reference in New Issue
Block a user