# Docker Performance Optimization Guide ## Summary of Enhancements ### 🚀 Build Performance - **BuildKit Cache Mounts**: Added persistent caching for Go modules, Go build cache, and npm cache - **Layer Optimization**: Improved layer ordering to maximize cache hits - **Build Arguments**: Added inline cache support for better CI/CD performance - **Binary Optimization**: Added `-ldflags="-w -s"` for smaller Go binaries (~30% reduction) ### 📊 Resource Management - **CPU Limits**: Set appropriate limits and reservations for each service - Backend: 2 CPUs max, 0.5 reserved - Frontend: 1 CPU max, 0.25 reserved - Database: 2 CPUs max, 0.5 reserved - **Memory Limits**: Prevents OOM issues and resource contention - Backend: 1GB max, 256MB reserved - Frontend: 512MB max, 128MB reserved - Database: 2GB max, 512MB reserved ### 🗄️ Database Optimization - **Postgres Tuning**: Production-grade configuration - `shared_buffers=256MB` - Memory for caching - `effective_cache_size=1GB` - Query planner optimization - `work_mem=2621kB` - Per-operation memory - `max_connections=200` - Connection pool sizing - `checkpoint_completion_target=0.9` - Smoother checkpoints - `wal_buffers=16MB` - Write-ahead log buffering - `random_page_cost=1.1` - SSD-optimized - **tmpfs Mounts**: Fast temporary storage for `/tmp` and `/var/run/postgresql` - **Shared Memory**: 256MB for PostgreSQL operations ### 🔄 Startup Optimization - **Parallel Startup**: Frontend no longer waits for backend health check - **Faster Health Checks**: Database checks every 5s (was default) ## Usage ### Enable BuildKit (Required) ```powershell # Set environment variable for BuildKit $env:DOCKER_BUILDKIT=1 $env:COMPOSE_DOCKER_CLI_BUILD=1 # Or add to your PowerShell profile Add-Content $PROFILE "`n`$env:DOCKER_BUILDKIT=1" Add-Content $PROFILE "`$env:COMPOSE_DOCKER_CLI_BUILD=1" ``` ### Build with Cache ```powershell # First build (creates cache) docker-compose build # Subsequent builds (uses cache, much faster) docker-compose build # Force rebuild without cache docker-compose build --no-cache ``` ### Resource Monitoring ```powershell # View resource usage docker stats # View specific service docker stats myclub-backend myclub-frontend myclub-db ``` ## Performance Benchmarks ### Build Times (Typical) - **Cold build** (no cache): ~5-8 minutes - **Warm build** (with cache, no code changes): ~10-30 seconds - **Incremental build** (small code changes): ~30-60 seconds ### Memory Usage (Expected) - **Backend**: ~100-300MB during normal operation - **Frontend**: ~50-100MB (nginx is lightweight) - **Database**: ~200-800MB depending on data size ## Advanced Optimizations ### Production Deployment For production, consider: 1. Using multi-stage builds with smaller base images 2. Enabling compression in nginx 3. Adding a reverse proxy (nginx/traefik) in front 4. Using external managed database service ### CI/CD Integration ```yaml # Example GitHub Actions with cache - name: Build with cache uses: docker/build-push-action@v4 with: context: . cache-from: type=gha cache-to: type=gha,mode=max ``` ### Windows-Specific Notes - **WSL2 Backend**: Ensure Docker Desktop uses WSL2 for better performance - **File Watching**: May be slower on Windows; consider using polling - **Drive Mounting**: Use WSL2 filesystem for better I/O performance ## Troubleshooting ### Slow Builds ```powershell # Check if BuildKit is enabled docker buildx version # Clear build cache if needed docker builder prune -a # Check disk space docker system df ``` ### High Memory Usage ```powershell # Check current limits docker-compose config # Adjust limits in docker-compose.yml deploy.resources section ``` ### Database Performance Issues ```powershell # Connect to database docker exec -it myclub-db psql -U postgres -d fotbal_club # Check current settings SHOW shared_buffers; SHOW effective_cache_size; # Monitor queries SELECT * FROM pg_stat_activity; ``` ## Monitoring Performance ### View Logs ```powershell # All services docker-compose logs -f # Specific service docker-compose logs -f backend ``` ### Database Performance ```powershell # Execute inside container docker exec -it myclub-db psql -U postgres -d fotbal_club # Analyze slow queries SELECT query, calls, total_time, mean_time FROM pg_stat_statements ORDER BY mean_time DESC LIMIT 10; ``` ## Next Steps 1. **Monitor**: Use `docker stats` to verify resource usage is within limits 2. **Tune**: Adjust PostgreSQL settings based on your workload 3. **Profile**: Identify bottlenecks using application profiling tools 4. **Scale**: Consider horizontal scaling for production workloads