13 KiB
Docker Configuration Optimization & Security Analysis
Executive Summary
This document outlines the comprehensive analysis, corrections, and optimizations made to all Docker and docker-compose configurations in the Meldestelle project. The optimizations focus on security hardening, performance improvements, and production readiness.
Key Achievements
- ✅ Critical Security Vulnerabilities Fixed: Eliminated hardcoded credentials and exposed secrets
- ✅ Resource Management: Added comprehensive CPU and memory limits for all services
- ✅ Security Hardening: Implemented Docker secrets, non-root users, and security constraints
- ✅ Performance Optimization: Enhanced health checks, startup dependencies, and resource allocation
- ✅ Production Readiness: Added proper volume management, networking, and monitoring
Security Improvements
🔐 Critical Security Issues Resolved
1. Secrets Management
Problem: Hardcoded credentials in environment variables
# BEFORE (INSECURE)
environment:
POSTGRES_PASSWORD: meldestelle
KEYCLOAK_CLIENT_SECRET: K5RqonwVOaxPKaXVH4mbthSRbjRh5tOK
GF_SECURITY_ADMIN_PASSWORD: admin
Solution: Docker secrets with secure file-based management
# AFTER (SECURE)
environment:
POSTGRES_PASSWORD_FILE: /run/secrets/postgres_password
KEYCLOAK_CLIENT_SECRET_FILE: /run/secrets/keycloak_client_secret
GF_SECURITY_ADMIN_PASSWORD__FILE: /run/secrets/grafana_admin_password
secrets:
- postgres_password
- keycloak_client_secret
- grafana_admin_password
2. Container Security Hardening
Added Security Measures:
no-new-privileges:truefor all containers- Non-root user execution where possible
- Read-only volume mounts for configuration files
- Secure file permissions (600) for all secrets
3. Network Security
Improvements:
- Custom isolated network with dedicated subnet (172.20.0.0/16)
- Proper inter-container communication controls
- Enhanced CORS and security headers for web applications
🛡️ Security Features Added
| Security Feature | Implementation | Benefit |
|---|---|---|
| Docker Secrets | File-based secrets management | Eliminates hardcoded credentials |
| Non-root Users | Custom user/group for applications | Reduces attack surface |
| Security Options | no-new-privileges flag |
Prevents privilege escalation |
| Read-only Mounts | Config files mounted read-only | Prevents runtime tampering |
| Network Isolation | Custom bridge network | Isolates container communication |
| Resource Limits | CPU/Memory constraints | Prevents resource exhaustion attacks |
Performance Optimizations
🚀 Resource Management
Comprehensive Resource Limits
All services now have properly configured resource limits and reservations:
Infrastructure Services:
deploy:
resources:
limits:
cpus: '2.0'
memory: 2G
reservations:
cpus: '0.5'
memory: 1G
Resource Allocation Summary:
| Service | CPU Limit | Memory Limit | CPU Reserved | Memory Reserved |
|---|---|---|---|---|
| PostgreSQL | 2.0 | 2GB | 0.5 | 512MB |
| Redis | 1.0 | 1GB | 0.25 | 256MB |
| Keycloak | 2.0 | 2GB | 0.5 | 1GB |
| API Gateway | 2.0 | 2GB | 0.5 | 1GB |
| Kafka | 2.0 | 2GB | 0.5 | 512MB |
| Grafana | 1.0 | 1GB | 0.25 | 256MB |
| Prometheus | 1.0 | 2GB | 0.25 | 512MB |
🔧 Performance Enhancements
1. Optimized Health Checks
# Enhanced health check configuration
healthcheck:
test: ["CMD", "curl", "--fail", "--max-time", "5", "http://localhost:8080/health/ready"]
interval: 15s
timeout: 10s
retries: 3
start_period: 60s
2. JVM Optimization
Kafka JVM Settings:
environment:
KAFKA_HEAP_OPTS: "-Xmx1G -Xms512m"
KAFKA_JVM_PERFORMANCE_OPTS: "-XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35"
3. Database Performance
PostgreSQL Enhancements:
- SCRAM-SHA-256 authentication for better security
- Optimized connection settings
- Proper data persistence with bind mounts
Redis Optimizations:
- Memory management with
maxmemoryandallkeys-lrupolicy - Persistent storage with AOF (Append Only File)
- Authentication enabled
Configuration Structure
📁 File Organization
The optimized configuration consists of:
├── docker-compose.yml.optimized # Infrastructure services
├── docker-compose.services.yml.optimized # Microservices
├── docker-compose.clients.yml.optimized # Client applications
├── .env.template # Environment configuration template
└── docker/
└── secrets/
├── setup-secrets.sh # Automated secrets generation
├── postgres_user.txt # Database username
├── postgres_password.txt # Database password (generated)
├── redis_password.txt # Redis password (generated)
├── keycloak_admin_password.txt # Keycloak admin password (generated)
├── keycloak_client_secret.txt # API Gateway client secret (generated)
├── grafana_admin_user.txt # Grafana admin username
├── grafana_admin_password.txt # Grafana admin password (generated)
├── jwt_secret.txt # JWT signing secret (generated)
└── vnc_password.txt # VNC access password (generated)
🔄 Profile-based Deployment
The optimized configuration supports selective service deployment:
# Infrastructure only
docker-compose -f docker-compose.yml.optimized up -d
# Infrastructure + Microservices
docker-compose -f docker-compose.yml.optimized \
-f docker-compose.services.yml.optimized up -d
# Full stack deployment
docker-compose -f docker-compose.yml.optimized \
-f docker-compose.services.yml.optimized \
-f docker-compose.clients.yml.optimized up -d
# Selective services with profiles
docker-compose -f docker-compose.services.yml.optimized \
--profile members --profile horses up -d
Migration Guide
🚀 Quick Start
1. Generate Secrets
# Generate all required secrets
./docker/secrets/setup-secrets.sh --all
# Or generate individually
./docker/secrets/setup-secrets.sh --generate
./docker/secrets/setup-secrets.sh --validate
2. Configure Environment
# Copy template and customize
cp .env.template .env
# Edit configuration values
nano .env
3. Create Data Directories
# Create persistent data directories
mkdir -p ./data/{postgres,redis,prometheus,grafana,keycloak,consul,monitoring,desktop-app}
4. Deploy Services
# Start infrastructure
docker-compose -f docker-compose.yml.optimized up -d
# Verify all services are healthy
docker-compose -f docker-compose.yml.optimized ps
# Add microservices
docker-compose -f docker-compose.yml.optimized \
-f docker-compose.services.yml.optimized up -d
# Add client applications
docker-compose -f docker-compose.yml.optimized \
-f docker-compose.services.yml.optimized \
-f docker-compose.clients.yml.optimized up -d
🔄 Migration from Original Configuration
Step 1: Backup Current Setup
# Stop existing services
docker-compose down
# Backup current data (optional)
cp -r data/ data.backup/
Step 2: Update Configuration
# Generate secrets first
./docker/secrets/setup-secrets.sh --all
# Update environment configuration
cp .env.template .env
# Edit .env as needed
Step 3: Deploy Optimized Configuration
# Deploy with new configuration
docker-compose -f docker-compose.yml.optimized up -d
Security Best Practices
🛡️ Production Security Checklist
- Secrets Generated: Run secrets setup script
- File Permissions: Ensure secret files have 600 permissions
- Network Isolation: Use custom Docker networks
- Resource Limits: All services have CPU/memory limits
- Non-root Users: Applications run as non-privileged users
- Read-only Mounts: Configuration mounted read-only
- Security Options:
no-new-privilegesenabled - Health Checks: All critical services have health checks
- Backup Strategy: Regular data backups configured
- Monitoring: Prometheus and Grafana configured
- Log Management: Centralized logging configured
🔐 Security Monitoring
Access URLs (Default Configuration)
- Grafana Dashboard: http://localhost:3000
- Prometheus Metrics: http://localhost:9090
- Consul UI: http://localhost:8500
- Keycloak Admin: http://localhost:8180/admin
Security Metrics to Monitor
- Failed authentication attempts
- Resource usage patterns
- Container restart frequency
- Network connection anomalies
- Secret access patterns
Troubleshooting
🔍 Common Issues and Solutions
Issue 1: Secret File Permissions
Problem: Containers cannot read secret files Solution:
# Fix permissions
chmod 600 docker/secrets/*.txt
# Or regenerate with correct permissions
./docker/secrets/setup-secrets.sh --force
Issue 2: Resource Constraints
Problem: Services failing due to resource limits Solution:
# Check resource usage
docker stats
# Adjust limits in docker-compose files or increase system resources
Issue 3: Network Connectivity
Problem: Services cannot communicate Solution:
# Check network configuration
docker network inspect meldestelle_meldestelle-network
# Verify service health
docker-compose -f docker-compose.yml.optimized ps
Issue 4: Volume Mount Issues
Problem: Data not persisting or permission errors Solution:
# Create data directories with correct permissions
mkdir -p ./data/{postgres,redis,prometheus,grafana,keycloak,consul}
chown -R 999:999 ./data/postgres # PostgreSQL user
chown -R 472:0 ./data/grafana # Grafana user
📊 Health Check Commands
# Check all service status
docker-compose -f docker-compose.yml.optimized ps
# View service logs
docker-compose -f docker-compose.yml.optimized logs [service-name]
# Check resource usage
docker stats
# Validate secrets
./docker/secrets/setup-secrets.sh --validate
# Test connectivity
docker exec meldestelle-api-gateway curl -f http://postgres:5432
Performance Tuning
🎯 Resource Optimization Guidelines
Memory Allocation Strategy
- Infrastructure Services: Higher memory allocation for databases and messaging
- Application Services: Balanced CPU/memory for microservices
- Client Applications: Lower resource requirements
CPU Allocation Strategy
- I/O Bound Services (Database, Redis): Moderate CPU, high memory
- Compute Bound Services (Application logic): Higher CPU allocation
- Static Content Services (Web apps): Lower overall resources
JVM Tuning for Java Services
environment:
JAVA_OPTS: |
-XX:MaxRAMPercentage=75.0
-XX:+UseG1GC
-XX:+UseStringDeduplication
-XX:+UseContainerSupport
-Djava.security.egd=file:/dev/./urandom
Monitoring and Observability
📈 Metrics Collection
Prometheus Metrics
- Container resource usage
- Application performance metrics
- Health check status
- Network traffic patterns
Grafana Dashboards
- Infrastructure overview
- Application performance
- Security events
- Resource utilization trends
Logging Strategy
- Centralized logging via Docker logs
- Structured JSON logging for applications
- Log rotation and retention policies
- Security event logging
Conclusion
The Docker configuration optimization provides:
- Enhanced Security: Complete elimination of hardcoded credentials and implementation of Docker secrets
- Production Readiness: Comprehensive resource limits, health checks, and monitoring
- Improved Performance: Optimized resource allocation and container configurations
- Operational Excellence: Automated secret management, comprehensive documentation, and troubleshooting guides
- Scalability: Profile-based deployment and modular service architecture
Next Steps
- Deploy optimized configuration in development environment
- Validate all security measures are properly implemented
- Monitor performance metrics and adjust resource limits as needed
- Implement backup and recovery procedures for persistent data
- Set up automated monitoring and alerting for production deployment
For questions or issues with the optimized configuration, refer to the troubleshooting section or consult the detailed configuration comments in the docker-compose files.